pax_global_header00006660000000000000000000000064117735320700014517gustar00rootroot0000000000000052 comment=06fac2bd39c2e493efb83a63ef8dc84123382f93 mumudvb-1.7.1/000077500000000000000000000000001177353207000132045ustar00rootroot00000000000000mumudvb-1.7.1/COPYING000066400000000000000000000430761177353207000142510ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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 Appendix: 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) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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. mumudvb-1.7.1/ChangeLog000066400000000000000000000134731177353207000147660ustar00rootroot00000000000000-- MuMuDVB 1.7 -- New features / improvements : * Implements dual stack for IPv6 Mulicast * Tuning: Support for multiple tuners and DVB-T2 DVB-S2 * Error : Add option filter_transport_error to send packets with error bit set by decoder * Dump : Possibility to dump the raw stream for debugging purposes + update of the man page * Logging: Possibility to choose the destination of the logs : console, file or syslog. The formatting of the logs can be adjusted. * CAM Menu : CAM menu access while streaming (using a web/AJAX interface - see WEBSERVICES.txt * Templates support for more flexibility in autoconfiguration * Webservices : XML webservice exposing detailed streaming status (see WEBSERVICES.txt) * PID : Add option filename_pid Possibility to define the path for the pid file : * DiSEqC : improvments : support of uncommited switches. Set of the tone burst * Autoconfiguration: Several improvements in the options and in the parsing of the DVB tables * Possibility to tune the up/down detection thresholds * Testing suite : test program for various MuMuDVB functions to compile this program, run "make check" * Table parsing : the NIT is parsed for debugging purposes, possibility to use the LCN in autoconfiguration, better detection of PIDs * Signal display : more information (uncorrected blocks) * Cards listing with their capabilities. Bugs corrected : * SDT rewrite improve : we copy only the interesting services to the rewritten SDT * Filter : New option psi_tables_filtering to keep only mandatory PSI PID. Useful for some STB. * Memory leaks Next : * autoconfiguration : merge of the two autoconfiguration modes * IPv6 : HTTP unicast IPv6 * RTSP -- MuMuDVB 1.6 -- New features / improvements : * Support for HTTP Unicast * Implementation of the RTP headers. * The limit in the size of the PAT PID for PAT rewriting has been removed * PAT rewrite is less CPU consuming * ATSC autoconfiguration fully fonctionnal * Autoconfiguration: MuMuDVB can update the PIDs while running if they change * Tuning: Support for circular polarization, more LNBs and possibility to fix LNB voltage to 0V * Tuning: We can set the coderate (FEC) for satellite and cable with the option coderate * Documentation rewrite. The doc is now in asciidoc format + new configuration examples * Autoconfiguration: We wait for all the channels in the PAT to be configured before continuing * Autoconfiguration: New option autoconf_scrambled which permit to autoconfigure scrambbled channels even without cam_support * CAM support: We look on the packets to check if the descrambling was successful * Option dont_send_scrambled to avoid sending scrambled packets (thus not making SAP announces for scrambled channels) * Option to show the traffic for each channel * Reduce CPU usage : experimental feature : DVB buffering * CAM : MuMuDVB can reset the CAM module if it initialize badly * SAP : new option sap_uri. * VLC bug : add an option to avoid sending the SDT, this is a workaround for VLC Bugs corrected : * Cam support : wait a bit more between polling events (solve problems with T-Rex Supermodule v4.6) * Cam : Change the list managment. This solves the problem of only one channel descrambled with aston pro * We check if the PMT_QUERY sending (asking a channel to be descrambled) to the CAM was sucessful. * Autoconfiguration, pat rewrite, CAM : we check the transport_stream id. This solve problems with shared PMT betwwen channels. -- Mumudvb 1.5.4 -- New features / improvements : * New stack for cam support, based on libdvben50221 from dvb_apps * Option dont_tune to avoid mumudvb to try to tune the card (can be used to test dvb-s2) * Non ascii channels names are now well handled by autoconf * Autoconfiguration : Better pid selection (new descriptor types added), can correct issues with some nondetected audio/video pids * Autoconfiguration ; Detection of the PCR PID, this solves problem with vlc and the absence of sound on certain channels * A configuration file is generated after autoconfiguration * Preliminary support for ATSC cards, new option atsc_modulation Bugs corrected : * We don't set the filters multiple times * Better reading of the config file * Segmentation faults with some particular configuration files * Bug in intialisation scripts * Better handling of partial packets. Mumudvb doesn't exit anymore. -- Mumudvb 1.5.3 -- New features : * Option multicast_ttl to override default ttl * Option autoconf_ip_header, to change the first part of ip adresses used by autoconfiguration * Option sap_default_group * Init scripts, cf scripts/ directory * Smaller memory footprint Bugs corrected : * Better conformances to RFC for sap announces (this correct issues with VLC < 0.8.6f) * Better memory freeing * CRC32 calculation was wrong on 64bits platforms -- Mumudvb 1.5.2 -- New features : * Generation of sap announces (beta) Bugs corrected : * Segfault when the directory /var/run/mumudvb doesn't exist * Gcc 4.2 issues when using pat rewriting or autoconfiguration * Small corrections -- Mumudvb 1.5 -- This is a test version for autoconf and cam support New features : * Support for conditionnal acces modules (support of scrambled channels) (beta) * Support for autoconfiguration. Mumudvb is now able to partially decode the stream to find the channels. (beta) * Verbosity levels for log messages * Better default values for DVB-T * common_port directive Bugs corrected : * Logging priority issue (LOG_INFO and co) * General code cleaning * Small bugs Documentation update -- Mumudvb 1.2 -- New Features : * PAT revriting : For some set top boxes, the pid PAT (wich announces the channels) should only contain the streamed channel When you enable pat_revriting, mumudvb modify the pat packets for that Bugs Corrected * Small bugs -- Mumudvb 1.0 -- First major release of mumudvb Main features : mumudvb-1.7.1/ChangeLog-detailled000066400000000000000000000512041177353207000167050ustar00rootroot000000000000002011-08-26 Brice DUBOST * Display the configuration file in the very verbose logs 2011-08-24 Brice DUBOST * Autoconf_lcn option is removed. We parse the NIT by default * MuMuDVB not exciting... Timeout when we cannot join the threads 2011-06-10 Brice DUBOST * Replace autoconfiguration=1 by autoconfiguration=partial 2011-06-05 Ludovic BOUÉ * Replace autoconfiguration=1 by autoconfiguration=partial and autoconfiguration=2 by autoconfiguration=full 2011-06-05 Brice DUBOST * Autoconf: NIT parsing: new descriptor read * Unicast: typo in the XML * CAM: less static strings, less snprintf, some cleaning 2011-05-27 Brice DUBOST * DVB-T2 Expermimental support It could be tested with PCTV nanoStick T2 290e Uses delivery_system=DVBT2 option * tune.c: small modifications to the file header * Small changes in the test suite 2011-05-23 Brice DUBOST * CAM support: Bad initialisation in case autoconfiguration!=full 2011-05-22 Brice DUBOST * Logs : more clear message for SDT rewriting * Decoding of channel names, control caraters badly implemented This close issue 13 on redmine * More detailled message 2011-05-21 Brice DUBOST * Details * New parser : explanation and better values for static limits * EIT sorting The continuity counter is on 4 bits not 5 This mistake had no effect thanks to the ts_header structure * Segfault occurs when I try to flush the log using kill -SIGHUP. This close the issue http://mumuredmine.braice.net/issues/19 * Debugging information: PAT contents displayed more often 2011-05-20 Brice DUBOST * Small mistake * New template: %lang. It's the primary channel language ie the language of the first PID with the language information (in the PMT) 2011-05-19 Brice DUBOST * Reading of the country avaibility descriptor (available in verbose mode) 2011-05-18 Brice DUBOST * Typo in doc + error checking when writing the dump * More stream types descriptions 2011-05-17 Brice DUBOST * New DVB parser, fully dealing with pointer field etc ... * New diagrams * Useless conditions, libpthread is always needed for building MuMuDVB * Preparation for the future TS parser, details below 1. To simplify the work, we unmerge the PMT packet from the CAM versus the PMT packet for the autoconfiguration. * Comments 2011-05-14 Brice DUBOST * Avoid flooding the logs when the card driver doesn't implement some IOCTLs * Issue with join group * Cleanup * Diagram documenting get_ts_packet 2011-05-13 Brice DUBOST * Cleanup * Better directory * Diagrams for TS packet repartition * New DVB parser This parser is able to parse packets with pointer field There is still a few case he cannot deal with, this will be detailed in a drawing soon * Test dump * Replacement of 188 by TS_PACKET_SIZE * Detail to make the code of get_ts_begin more clear * Detail : use a define for the TS packet size * Small improvments test program * Updated tests to implement the new demultiplexer 2011-05-10 Brice DUBOST * Compilation without cam support fixed 2011-05-05 Brice DUBOST * Continuity counter checking Thanks to Sebastien Raillard for the initial patch * Documentation update 2011-05-04 Brice DUBOST * Display of the uncorrected blocks with the signal (logs, XML and JSON) 2011-05-03 Brice DUBOST * Do not use ioctls for signal getting outside monitor thread 2011-05-01 Brice DUBOST * Possibility to follow PMT version for CAM and non autoconfigurated channels Option : cam_pmt_follow, default 0 * Timing information about the ioctl to get signal strength 2011-04-26 Brice DUBOST * Documentation update * Documentation update about sasc-ng 2011-04-25 Brice Dubost * Documentation update for not-so-used options 2011-03-30 Sebastien RAILLARD * Add scrambled status by PID in webservice monitoring 2011-03-03 Sebastien RAILLARD * Correct some CAM issues (polling interval, closing sessions) 2011-04-05 Sebastien RAILLARD * Preventing division by zero in stats calculations 2011-04-10 Brice DUBOST * Branch name in the version 2011-03-08 Brice DUBOST * ersion bump# README-fr~ * Issue with transcoding compile Thanks to Przemysław (HaCeK) Bryniak for reporting 2011-02-13 Brice DUBOST * Simpler example 2011-02-13 Sebastien Raillard * CA PMT reask if partially unscrambled or down chanel. Detect CAM crash (TL disconnect) and exit. correct the issues described in bug #10 in redmine. 2011-02-13 Brice DUBOST * Doc update * Fix compilation issues 2011-02-13 Ludovic BOUE * Documentation update 2011-02-13 Dave Chapman * Using bysid URLs in playlist*.m3u etc 2011-02-13 Brice DUBOST * We are not using permanent multicast addresses so we have to set the T flag * The default scope is now site local link local seems to be attached to an interface, and VLC have difficulties to get the stream if the interface is not specified in the address 2011-02-09 Brice DUBOST * Possibility to choose the multicast interface 2011-02-05 Brice DUBOST * New update of ipv6 documentation * IPv6 documentation update 2011-01-19 Brice DUBOST * IPv6 Autoconfiguration Header improved 2011-01-19 Brice Dubost * SAP and IPv6: Sap was not sent when IPv6 only. Possible crash corrected 2011-01-18 Brice Dubost * IPv6 autoconfiguration 2010-12-30 Brice DUBOST * SAP IPv6 * First ipv6 version Still to do SAP Autoconf Log the IPv6 addr Unicast Transcoding 2010-12-28 Brice DUBOST * Cast * memory leak corrected see http://mumuredmine.braice.net/issues/8 * Small memory leak corrected see http://mumuredmine.braice.net/issues/8 2010-11-28 Brice DUBOST * Compilation warnings about strictg aliasing * Compilation issues when CAM_SUPPORT was not set 2010-11-27 Brice DUBOST * SDT rewrite : we copy only the interesting services to the rewritten SDT. This avoid problems with some SDT which are too big with private descriptors (BBC for example) * Autoconf, detail: possibility to call parse_sdt_descriptor without a service * Testing of the SDT rewrite * SDT rewrite could fail when the SDT was spread over several sections * Debug messages 2010-11-15 Brice DUBOST * Testing : precaution * TS parse : small code factorisation 2010-11-14 Brice DUBOST * Possibility to dump the raw stream for debugging purposes + update of the man page * MuMuDVB test suite : more tests * Atoconf : logs * TS parsing : more logs * Autoconf : SDT reading : we look only for the actual transport stream table 2010-11-13 Brice DUBOST * Typos and spaces * More tests * doc : Columns size * Detail * Logging 2010-11-11 Brice DUBOST * Documentation update * Possible segmentation faults with faulty TS packets corrected 2010-11-08 Brice DUBOST * MuMuDVB test suite now test the get_ts_packets with any data + SDT parser testing, string comput testing Here it's random data (from /dev/urandom) to trace segmentation faults due to corrupted data * TS More debugging 2010-11-06 Brice DUBOST * Autoconf : we avoiid to have alway an empty service * More testing * Autoconf sdt : more debugging * This declaration shouldn't be here 2010-11-04 Brice DUBOST * Testing program for MuMuDVB This is the beginning of a test program for various MuMuDVB functions to compile this program, run "make check" 2010-11-03 Brice DUBOST * Change of the default dvr_buffer_size value * doc : WebServices doc in html 2010-11-02 Sebastien RAILLARD * Add documentation about webservices and new options * Add constant to set the maximum answer length to ENQUIRY question * Add some constants to describe MENU and LIST mmi display objects * Small correction (not a fix) to prevent warning when compiling with gcc 4.4.1 * Correction of bug preventing the CAM PMT UPDATE to be send when reask is enabled 2010-11-02 Brice DUBOST * Unicast : debugging option : flush_on_eagain 2010-11-01 Ludovic BOUE * Tune : Tuner number information 2010-10-19 Sebastien RAILLARD * Add HTTP webservice for AJAX access to the CAM menu during streaming 2010-10-18 Sebastien RAILLARD * Adding HTTP webservice for querying detailled status 2010-10-18 Sebastien RAILLARD * Decrease some HTTP log messages to MSG_FLOOD level * Correcting a cast error * Logging start and stop to make log easier to read (exitcode error description is missing) * Add psi_tables_filtering option * Correct warning message when disabling autoconfiguration in config file with value none * Add option filter_transport_error 2010-10-24 Sebastien Raillard * [PATCH 04/12] Variable renaming to english 2010-10-18 Sebastien RAILLARD * Add log details for source error identification * Change some log messages levels 2010-10-24 Brice DUBOST * Main : no periodic alarm anymore 2010-10-23 Brice DUBOST * We don't discard packets with adaptation field * TS parsing : we check the size of the adaptation field * TS parsing, potential issue with the adaptation field 2010-10-20 Brice DUBOST * Sap: correction of a possible segfault 2010-10-19 Brice DUBOST * Variable uninitialised 2010-10-17 Brice DUBOST * Segfault when closing too early * Possibility to define the path for the pid file : filename_pid This option accepts the templates %tuner, %card and %server * Details * Even less global variables * One call to mumudvb_close * Compilation warning * Cam parameters not global anymore * Comments * Segfault when the card is not able to tune * Tuneparams not global anymore * Uncast_vars not global anymore * Main : server_id not global anymore, autoconf_poll in the monitor thread * Autoconf: we remove the direct access to server_id 2010-10-16 Brice DUBOST * PAT rewrite : stupid pointer ofset, was making the check for current_next_indicator bad * Logging, 's' is not always needed in this log message 2010-10-13 Sebastien Raillard * Bandwidth for IP volume in base 1000 (kBps) * Small format change in CAM log 2010-10-16 Brice DUBOST * Real_start_time was computed too late Thanks to Sébastien Raillard 2010-10-13 root * Correct warning message when disabling autoconfiguration in config file 2010-10-16 Brice DUBOST * "Now" updated more often * Logging * Typo, could influence the no diff timeout * Main: real_start_time is useless here 2010-10-14 Brice DUBOST * TS parsing, we get the good beginning of a ts packet (get_ts_begin) * TS parsing : new function to get the beginning of the payload * TS parsing, we check if the pointer field is not too big 2010-10-13 Brice DUBOST * Autoconf : we take the current_next_indicator in account for the PSIP * Autoconf : we take the current_next_indicator in account for the NIT Thanks to Sébastien Raillard for noticing * Doxygen * SDT rewrite, Autoconf : we take the current_next_indicator in account for the SDT Thanks to Sébastien Raillard for noticing * CAM, Autoconf : we take the current_next_indicator in account for the PMT Thanks to Sébastien Raillard for noticing * PAT rewrite, Autoconf : we take the current_next_indicator in account for the PAT Thanks to Sébastien Raillard for noticing * TS parsing : we take in account the pointer_field 2010-10-12 Brice DUBOST * Log: The logging filename template take the card in account even if it's specified after 2010-10-10 Brice DUBOST * Logging : File flushing interval : log_flush_interval * Freeing on close * Logging: Log file flush and reopen on SIGHUP 2010-10-07 Brice DUBOST * Freeing on close * Logging: The presence of the \n at the end of the log is checked and added if absent * Logging : new option log_header which allow to specify the logging header with templates The implemented templates are %priority %module %timeepoch %date %pid * Typos * Logging : possibility to log on several "channels" 2010-10-06 Sebastien Raillard * Correct buffer size problem when writing HTTP response (in unicast_reply_write) 2010-10-06 Brice DUBOST * Typos 2010-10-05 Brice DUBOST * Template for the logging filename, file oppened in append mode * Logging: possibility to log to a file * Logging: possibility to choose the logging type * Typo * Move the logging config file reading in log.c * New minimum time interval for traffic calculations * Possibility to tune the up/down detection thresholds 2010-10-04 Brice DUBOST * Logging : missing EOL * Main: move of the work made periodically in sighandler to a thread This is to avoid global variables 2010-10-03 Brice DUBOST * Main : move to a thread things triggerd by sigalarm. First step : creation/close of the thread Move of the sap announce sending to this thread * Typos * The libpthread is now a mandatory dependancy of MuMuDVB 2010-09-30 Brice DUBOST * Unicast : Debug option : drop on eagain. This allow packets to be dropped when the socket sending queue is full, should help to solve traffic issues * Unicast : option socket_sendbuf_size to tune the sending socket slicing window (SOL_SOCKET, SO_SNDBUF) * Typo * Tune : possibility for non integer frequencies. DiseqC : more debugging 2010-09-26 Brice DUBOST * Logging, CAM, newlines 2010-09-19 Brice DUBOST * Unicast : we Disable the Nagle (TCP No Delay) algorithm for client sockets The hope is to improve unicast streaming performance 2010-09-09 Brice DUBOST * The warning on the PAT version changed could be printed because of a bad packet The warning is now printed after the full packet is got. This means that the CRC32 is checked before displaying the warning * Compilation warning * Unicast : Better dealing when the data is partially sent from the queue 2010-08-25 Brice DUBOST * CAM : we avoid flooding the logs 2010-08-17 Brice DUBOST * Documentation update 2010-08-10 Brice DUBOST * The --card option, also overrides card_dev_path * The card number specified on the command line overrides the config file 2010-08-01 Brice DUBOST * Documentation. Gettext is needed when compiling from sources * Correction of a possible segfault, while using patterns This bug was hapenning when the pattern is at the end of a string, replaced by an empty pattern (typically %type for sap announces) The final '\0' was not copied by the memmove, so the same pattern was discovered again by strstr etc ... 2010-07-29 Brice DUBOST * Possible segfault corrected. It was due to a misuse of va_start/va_end function 2010-06-23 Brice DUBOST * Transcode, doumentation and removal of useless spaces 2010-06-22 Brice DUBOST * Transcoding: typo and debug messages 2010-06-20 Brice DUBOST * Doumentation update * CAM: update of ca_sys_id * Typos * free forgotten * Transcode : new option transcode_send_transcoded_only This option is made to avoid the untranscoded stream to be sent * Unicast : typo * Typo * New template : %tuner * Compilation warning * Transcode : template and full autoconfiguration support * Transcoding : we copy global options, improvment of the copying function * Transcoding : function to cpy the options + removal of the useless option port 2010-06-19 Brice DUBOST * Function for appenning a string to another -> simpler log code 2010-06-16 Brice DUBOST * Segfault corrected. It was happenning when using partial autoconfiguration and autoconf_lcn * Transcoding : display of the available codecs in verbose mode 2010-06-15 Brice DUBOST * Log level * Code moving * Autoconf: improved logging * Some updqtes on transcoding. This is the first step towards transcoding working with full autoconfiguration For working with full autoconf, we need to be able to set treanscoding options outside a channel and these options to be copied back onto the created channels. Moreover we also need to support templates for the url 2010-06-14 Brice DUBOST * New command line option : --server_id. Documentation update This new option if for the template %server 2010-06-13 Brice DUBOST * More explicit message * Small corrections * Checking of the card status to detect a lost signal * Details * Logging improvments 2010-06-12 Brice DUBOST * Correction of a possible SEGFAULT while parsing the NIT (for getting the LCN) The decriptor len could become negative but it was an unsigned char :( * Small doc update * Possible problem when tuning_timeout is set to 0 2010-06-07 Brice DUBOST * autoconf_ip_header was broken 2010-06-06 Brice DUBOST * ypo in traffic calculation * Channel language detection + better PID identification Thanks to Sebastien Raillard for the original patch 2010-05-30 Brice DUBOST * CAM : various improvments, new options New options : cam_delay_pmt_send, cam_interval_pmt_send More logs concerning the CAM Catching of a part of the errors from the libdvben50221 2010-05-23 Brice DUBOST * Author 2010-05-13 Brice DUBOST * The init scripts set the adapter * Support for multiple tuners Thanks to Romolo Manfredini romoloman hotmail com for the patch 2010-05-13 Brice DUBOST * Documentation update * Memory freeing 2010-03-07 Brice DUBOST * Typo 2010-03-01 Brice DUBOST * Autotools, small bug 2010-02-27 Brice DUBOST * Traffic in kb/s * Debian init script: test corrected Thanks to Florent R. for reporting * Unicast: channel numbers starting at 1 * Autoconf: New option autoconf_multicast_port, allows to define the multicast port with templates 2010-02-21 Brice DUBOST * CAM support: option cam_reask to ask again the cam for a channel if it stay scrambled * Debug and typos 2010-02-07 Brice DUBOST * OpenWRT: flags for c99 are not well detected by the ./configure 2010-01-26 Brice DUBOST * Indent 2010-01-24 Brice DUBOST * Typos 2010-01-15 Brice DUBOST * New template: %server and option server_id 2010-01-10 Brice DUBOST * Autoconf : possibility to use template for autoconf ip 2010-01-06 Brice DUBOST * Flexibility for the unicast port set by autoconfiguration * Conf generation: simpler way to detect autoconf parameters 2010-01-05 Brice DUBOST * TS_id => service id * Math evaluation: a bit less efficient but simpler functions * Unicast: possibility to use mathematical expression for the port_http * Function to compute a mathematical expression containing + and * (works on integers only) 2010-01-03 Brice DUBOST * Tuning : More waiting. Should improve the tuning on some cards * Tune : ident mumudvb-1.7.1/Makefile.am000066400000000000000000000001601177353207000152350ustar00rootroot00000000000000AUTOMAKE_OPTIONS = foreign SUBDIRS = src doc doc: cd doc && $(MAKE) $(AM_MAKEFLAGS) doc .PHONY: $(SUBDIRS) mumudvb-1.7.1/Makefile.in000066400000000000000000000533221177353207000152560ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure ABOUT-NLS \ AUTHORS COPYING ChangeLog INSTALL NEWS config.guess \ config.rpath config.sub depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign SUBDIRS = src doc all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am doc: cd doc && $(MAKE) $(AM_MAKEFLAGS) doc .PHONY: $(SUBDIRS) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mumudvb-1.7.1/README000077700000000000000000000000001177353207000163222doc/README.txtustar00rootroot00000000000000mumudvb-1.7.1/README-fr000077700000000000000000000000001177353207000173342doc/README-fr.txtustar00rootroot00000000000000mumudvb-1.7.1/aclocal.m4000066400000000000000000002523651177353207000150610ustar00rootroot00000000000000# generated automatically by aclocal 1.11.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # iconv.m4 serial 11 (gettext-0.18.1) dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl This is tricky because of the way 'aclocal' is implemented: dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl Otherwise aclocal's initial scan pass would miss the macro definition. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl warnings. m4_define([gl_iconv_AC_DEFUN], m4_version_prereq([2.64], [[AC_DEFUN_ONCE( [$1], [$2])]], [[AC_DEFUN( [$1], [$2])]])) gl_iconv_AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) fi ]) # lib-ld.m4 serial 4 (gettext-0.18) dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL([acl_cv_path_LD], [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT([$LD]) else AC_MSG_RESULT([no]) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) # lib-link.m4 serial 21 (gettext-0.18) dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.54]) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[translit([$1],[./-], [___])]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes popdef([NAME]) popdef([Name]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. The missing-message dnl defaults to 'no' and may contain additional hints for the user. dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[translit([$1],[./-], [___])]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, dnl because these -l options might require -L options that are present in dnl LIBS. -l options benefit only from the -L options listed before it. dnl Otherwise, add it to the front of LIBS, because it may be a static dnl library that depends on another static library that is present in LIBS. dnl Static libraries benefit only from the static libraries listed after dnl it. case " $LIB[]NAME" in *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; *) LIBS="$LIB[]NAME $LIBS" ;; esac AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) popdef([NAME]) popdef([Name]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) # lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR mumudvb-1.7.1/config.guess000077500000000000000000001274321177353207000155350ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mumudvb-1.7.1/config.rpath000066400000000000000000000000001177353207000154770ustar00rootroot00000000000000mumudvb-1.7.1/config.sub000077500000000000000000001051761177353207000152010ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mumudvb-1.7.1/configure000077500000000000000000007537251177353207000151360ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for MuMuDVB 1.7.1. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and mumudvb@braice.net $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='MuMuDVB' PACKAGE_TARNAME='mumudvb' PACKAGE_VERSION='1.7.1' PACKAGE_STRING='MuMuDVB 1.7.1' PACKAGE_BUGREPORT='mumudvb@braice.net' PACKAGE_URL='' ac_unique_file="src/mumudvb.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS BUILD_TRANSCODING_FALSE BUILD_TRANSCODING_TRUE BUILD_CAMSUPPORT_FALSE BUILD_CAMSUPPORT_TRUE LTLIBICONV LIBICONV host_os host_vendor host_cpu host build_os build_vendor build_cpu build EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking with_gnu_ld enable_rpath with_libiconv_prefix enable_cam_support enable_transcoding enable_coverage enable_duma ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures MuMuDVB 1.7.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/mumudvb] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of MuMuDVB 1.7.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-rpath do not hardcode runtime library paths --enable-cam-support CAM support (default enabled) --enable-transcoding transcoding support (default disabled) --enable-coverage build for test coverage (default disabled) --enable-duma Debbuging DUMA library (default disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF MuMuDVB configure 1.7.1 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## --------------------------------- ## ## Report this to mumudvb@braice.net ## ## --------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0 ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by MuMuDVB $as_me 1.7.1, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='mumudvb' VERSION='1.7.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers src/config.h" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "linux/dvb/dmx.h" "ac_cv_header_linux_dvb_dmx_h" "$ac_includes_default" if test "x$ac_cv_header_linux_dvb_dmx_h" = xyes; then : fi if test "$ac_cv_header_linux_dvb_dmx_h" = no; then as_fn_error $? "linux dvb api headers are required to build" "$LINENO" 5 fi # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } if ${am_cv_proto_iconv+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_cv_proto_iconv_arg1="" else am_cv_proto_iconv_arg1="const" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_proto_iconv" >&5 $as_echo " $am_cv_proto_iconv" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $am_cv_proto_iconv_arg1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dvbdemux_set_section_filter in -ldvbapi" >&5 $as_echo_n "checking for dvbdemux_set_section_filter in -ldvbapi... " >&6; } if ${ac_cv_lib_dvbapi_dvbdemux_set_section_filter+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldvbapi $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dvbdemux_set_section_filter (); int main () { return dvbdemux_set_section_filter (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dvbapi_dvbdemux_set_section_filter=yes else ac_cv_lib_dvbapi_dvbdemux_set_section_filter=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dvbapi_dvbdemux_set_section_filter" >&5 $as_echo "$ac_cv_lib_dvbapi_dvbdemux_set_section_filter" >&6; } if test "x$ac_cv_lib_dvbapi_dvbdemux_set_section_filter" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDVBAPI 1 _ACEOF LIBS="-ldvbapi $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atsc_text_segment_decode in -lucsi" >&5 $as_echo_n "checking for atsc_text_segment_decode in -lucsi... " >&6; } if ${ac_cv_lib_ucsi_atsc_text_segment_decode+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lucsi $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char atsc_text_segment_decode (); int main () { return atsc_text_segment_decode (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ucsi_atsc_text_segment_decode=yes else ac_cv_lib_ucsi_atsc_text_segment_decode=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucsi_atsc_text_segment_decode" >&5 $as_echo "$ac_cv_lib_ucsi_atsc_text_segment_decode" >&6; } if test "x$ac_cv_lib_ucsi_atsc_text_segment_decode" = xyes; then : atsc_long_names="yes" else atsc_long_names="no" fi #AC_CHECK_LIB([dvben50221], [en50221_stdcam_create],,,[ucsi,pthread]) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 $as_echo_n "checking for clock_gettime in -lrt... " >&6; } if ${ac_cv_lib_rt_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_clock_gettime=yes else ac_cv_lib_rt_clock_gettime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRT 1 _ACEOF LIBS="-lrt $LIBS" fi # Check whether --enable-cam_support was given. if test "${enable_cam_support+set}" = set; then : enableval=$enable_cam_support; else enable_cam_support="yes" fi if test "${enable_cam_support}" = "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atsc_text_segment_decode in -lucsi" >&5 $as_echo_n "checking for atsc_text_segment_decode in -lucsi... " >&6; } if ${ac_cv_lib_ucsi_atsc_text_segment_decode+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lucsi $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char atsc_text_segment_decode (); int main () { return atsc_text_segment_decode (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ucsi_atsc_text_segment_decode=yes else ac_cv_lib_ucsi_atsc_text_segment_decode=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucsi_atsc_text_segment_decode" >&5 $as_echo "$ac_cv_lib_ucsi_atsc_text_segment_decode" >&6; } if test "x$ac_cv_lib_ucsi_atsc_text_segment_decode" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBUCSI 1 _ACEOF LIBS="-lucsi $LIBS" else enable_cam_support="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for en50221_tl_create in -ldvben50221" >&5 $as_echo_n "checking for en50221_tl_create in -ldvben50221... " >&6; } if ${ac_cv_lib_dvben50221_en50221_tl_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldvben50221 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char en50221_tl_create (); int main () { return en50221_tl_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dvben50221_en50221_tl_create=yes else ac_cv_lib_dvben50221_en50221_tl_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dvben50221_en50221_tl_create" >&5 $as_echo "$ac_cv_lib_dvben50221_en50221_tl_create" >&6; } if test "x$ac_cv_lib_dvben50221_en50221_tl_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDVBEN50221 1 _ACEOF LIBS="-ldvben50221 $LIBS" else enable_cam_support="no" fi if test "${enable_cam_support}" != "no" then $as_echo "#define ENABLE_CAM_SUPPORT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libucsi and libdvben50221 are needed for CAM support" >&5 $as_echo "$as_me: WARNING: libucsi and libdvben50221 are needed for CAM support" >&2;} fi else enable_cam_support="no" fi if test "${enable_cam_support}" != "no"; then BUILD_CAMSUPPORT_TRUE= BUILD_CAMSUPPORT_FALSE='#' else BUILD_CAMSUPPORT_TRUE='#' BUILD_CAMSUPPORT_FALSE= fi # Check whether --enable-transcoding was given. if test "${enable_transcoding+set}" = set; then : enableval=$enable_transcoding; else enable_transcoding="no" fi if test "${enable_transcoding}" = "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for url_split in -lavformat" >&5 $as_echo_n "checking for url_split in -lavformat... " >&6; } if ${ac_cv_lib_avformat_url_split+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lavformat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char url_split (); int main () { return url_split (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_avformat_url_split=yes else ac_cv_lib_avformat_url_split=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avformat_url_split" >&5 $as_echo "$ac_cv_lib_avformat_url_split" >&6; } if test "x$ac_cv_lib_avformat_url_split" = xyes; then : $as_echo "#define HAVE_URL_SPLIT 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ff_url_split in -lavformat" >&5 $as_echo_n "checking for ff_url_split in -lavformat... " >&6; } if ${ac_cv_lib_avformat_ff_url_split+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lavformat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ff_url_split (); int main () { return ff_url_split (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_avformat_ff_url_split=yes else ac_cv_lib_avformat_ff_url_split=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avformat_ff_url_split" >&5 $as_echo "$ac_cv_lib_avformat_ff_url_split" >&6; } if test "x$ac_cv_lib_avformat_ff_url_split" = xyes; then : $as_echo "#define HAVE_FF_URL_SPLIT 1" >>confdefs.h fi for ac_header in libavcodec/avcodec.h ffmpeg/avcodec.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in libavformat/avformat.h ffmpeg/avformat.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in libswscale/swscale.h ffmpeg/swscale.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for av_picture_copy in -lavcodec" >&5 $as_echo_n "checking for av_picture_copy in -lavcodec... " >&6; } if ${ac_cv_lib_avcodec_av_picture_copy+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lavcodec $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char av_picture_copy (); int main () { return av_picture_copy (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_avcodec_av_picture_copy=yes else ac_cv_lib_avcodec_av_picture_copy=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avcodec_av_picture_copy" >&5 $as_echo "$ac_cv_lib_avcodec_av_picture_copy" >&6; } if test "x$ac_cv_lib_avcodec_av_picture_copy" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBAVCODEC 1 _ACEOF LIBS="-lavcodec $LIBS" else enable_transcoding="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for av_get_frame_filename in -lavformat" >&5 $as_echo_n "checking for av_get_frame_filename in -lavformat... " >&6; } if ${ac_cv_lib_avformat_av_get_frame_filename+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lavformat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char av_get_frame_filename (); int main () { return av_get_frame_filename (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_avformat_av_get_frame_filename=yes else ac_cv_lib_avformat_av_get_frame_filename=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avformat_av_get_frame_filename" >&5 $as_echo "$ac_cv_lib_avformat_av_get_frame_filename" >&6; } if test "x$ac_cv_lib_avformat_av_get_frame_filename" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBAVFORMAT 1 _ACEOF LIBS="-lavformat $LIBS" else enable_transcoding="no" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sws_freeContext in -lswscale" >&5 $as_echo_n "checking for sws_freeContext in -lswscale... " >&6; } if ${ac_cv_lib_swscale_sws_freeContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lswscale $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sws_freeContext (); int main () { return sws_freeContext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_swscale_sws_freeContext=yes else ac_cv_lib_swscale_sws_freeContext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_swscale_sws_freeContext" >&5 $as_echo "$ac_cv_lib_swscale_sws_freeContext" >&6; } if test "x$ac_cv_lib_swscale_sws_freeContext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSWSCALE 1 _ACEOF LIBS="-lswscale $LIBS" else enable_transcoding="no" fi if test "${enable_transcoding}" != "no" then $as_echo "#define ENABLE_TRANSCODING 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libavcodev, libavformat and libswscale are needed for transcoding support" >&5 $as_echo "$as_me: WARNING: libavcodev, libavformat and libswscale are needed for transcoding support" >&2;} fi else enable_transcoding="no" fi if test "${enable_transcoding}" != "no"; then BUILD_TRANSCODING_TRUE= BUILD_TRANSCODING_FALSE='#' else BUILD_TRANSCODING_TRUE='#' BUILD_TRANSCODING_FALSE= fi # Check whether --enable-coverage was given. if test "${enable_coverage+set}" = set; then : enableval=$enable_coverage; else enable_coverage="no" fi if test "${enable_coverage}" != "no"; then : CFLAGS="-fprofile-arcs -ftest-coverage ${CFLAGS}" CXXFLAGS="-fprofile-arcs -ftest-coverage ${CXXFLAGS}" LDFLAGS="-lgcov ${LDFLAGS}" fi # Check whether --enable-duma was given. if test "${enable_duma+set}" = set; then : enableval=$enable_duma; else enable_duma="no" fi if test "${enable_duma}" = "yes" then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _duma_malloc in -lduma" >&5 $as_echo_n "checking for _duma_malloc in -lduma... " >&6; } if ${ac_cv_lib_duma__duma_malloc+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lduma $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _duma_malloc (); int main () { return _duma_malloc (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_duma__duma_malloc=yes else ac_cv_lib_duma__duma_malloc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_duma__duma_malloc" >&5 $as_echo "$ac_cv_lib_duma__duma_malloc" >&6; } if test "x$ac_cv_lib_duma__duma_malloc" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDUMA 1 _ACEOF LIBS="-lduma $LIBS" else enable_duma="no" fi if test "${enable_duma}" != "no" then LDFLAGS="-lduma ${LDFLAGS}" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The DUMA library needs to be installed before" >&5 $as_echo "$as_me: WARNING: The DUMA library needs to be installed before" >&2;} fi fi # Checks for header files. for ac_header in sys/types.h netinet/in.h arpa/nameser.h netdb.h resolv.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_NETINET_IN_H # include /* inet_ functions / structs */ #endif #ifdef HAVE_ARPA_NAMESER_H # include /* DNS HEADER struct */ #endif #ifdef HAVE_NETDB_H # include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h syslog.h unistd.h values.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "#define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac # Checks for library functions. for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if ${ac_cv_func_realloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_func in alarm gettimeofday inet_ntoa memset socket strerror strstr do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_config_files="$ac_config_files Makefile doc/Makefile src/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_CAMSUPPORT_TRUE}" && test -z "${BUILD_CAMSUPPORT_FALSE}"; then as_fn_error $? "conditional \"BUILD_CAMSUPPORT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_TRANSCODING_TRUE}" && test -z "${BUILD_TRANSCODING_FALSE}"; then as_fn_error $? "conditional \"BUILD_TRANSCODING\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by MuMuDVB $as_me 1.7.1, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ MuMuDVB config.status 1.7.1 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi #put resume at the end echo "" echo "-------------------------------------------------------" echo "MuMuDVB configure results:" echo "" echo "Features" echo "" if test "${enable_cam_support}" != "no" ; then echo "Build with CAM support: yes" else echo "Build with CAM support: no" fi if test "${enable_transcoding}" != "no" ; then echo "Build with transcoding support: yes" else echo "Build with transcoding support: no" fi if test "${atsc_long_names}" = "yes" ; then echo "Build with ATSC long names support: yes" else echo "Build with ATSC long names support: no" fi echo "" echo "Debugging" echo "" if test "${enable_coverage}" = "yes" ; then echo "Build with code coverage debug symbols yes" else echo "Build with code coverage debug symbols no" fi if test "${enable_duma}" = "yes" ; then echo "Build with debugging DUMA library yes" else echo "Build with debugging DUMA library no" fi mumudvb-1.7.1/configure.ac000066400000000000000000000122251177353207000154740ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.61]) AC_INIT([MuMuDVB], [1.7.1], [mumudvb@braice.net]) AC_CONFIG_SRCDIR([src/mumudvb.c]) AM_INIT_AUTOMAKE AC_CONFIG_HEADERS([src/config.h]) dnl dnl Check for linux dvb api headers dnl AC_CHECK_HEADER([linux/dvb/dmx.h]) if test "$ac_cv_header_linux_dvb_dmx_h" = no; then AC_MSG_ERROR([linux dvb api headers are required to build]) fi # Checks for programs. AC_PROG_CC AC_PROG_INSTALL AC_PROG_MAKE_SET AC_PROG_CC_C99 dnl dnl Iconv stuff dnl AM_ICONV AC_CHECK_LIB([dvbapi], [dvbdemux_set_section_filter]) AC_CHECK_LIB([ucsi], [atsc_text_segment_decode],[atsc_long_names="yes"], [atsc_long_names="no"]) #AC_CHECK_LIB([dvben50221], [en50221_stdcam_create],,,[ucsi,pthread]) AC_CHECK_LIB([pthread], [pthread_create]) AC_CHECK_LIB([rt], [clock_gettime]) dnl dnl cam support dnl AC_ARG_ENABLE(cam_support, [ --enable-cam-support CAM support (default enabled)],,[enable_cam_support="yes"]) if test "${enable_cam_support}" = "yes" then AC_CHECK_LIB([ucsi], [atsc_text_segment_decode],[], [enable_cam_support="no"]) AC_CHECK_LIB([dvben50221], [en50221_tl_create],[], [enable_cam_support="no"]) if test "${enable_cam_support}" != "no" then AC_DEFINE(ENABLE_CAM_SUPPORT, 1, Define if you want the CAM support) else AC_MSG_WARN([libucsi and libdvben50221 are needed for CAM support]) fi else enable_cam_support="no" fi AM_CONDITIONAL(BUILD_CAMSUPPORT, [test "${enable_cam_support}" != "no"]) dnl dnl transcoding support dnl AC_ARG_ENABLE(transcoding, [ --enable-transcoding transcoding support (default disabled)],,[enable_transcoding="no"]) if test "${enable_transcoding}" = "yes" then AC_CHECK_LIB([avformat], [url_split],[AC_DEFINE(HAVE_URL_SPLIT, 1, Define if the function url_split exists)], []) AC_CHECK_LIB([avformat], [ff_url_split],[AC_DEFINE(HAVE_FF_URL_SPLIT, 1, Define if the function ff_url_split exists)], []) AC_CHECK_HEADERS([libavcodec/avcodec.h ffmpeg/avcodec.h]) AC_CHECK_HEADERS([libavformat/avformat.h ffmpeg/avformat.h]) AC_CHECK_HEADERS([libswscale/swscale.h ffmpeg/swscale.h]) AC_CHECK_LIB([avcodec], [av_picture_copy],[], [enable_transcoding="no"]) AC_CHECK_LIB([avformat], [av_get_frame_filename],[], [enable_transcoding="no"]) AC_CHECK_LIB([swscale], [sws_freeContext],[], [enable_transcoding="no"]) if test "${enable_transcoding}" != "no" then AC_DEFINE(ENABLE_TRANSCODING, 1, Define if you want the transcoding support) else AC_MSG_WARN([libavcodev, libavformat and libswscale are needed for transcoding support]) fi else enable_transcoding="no" fi AM_CONDITIONAL(BUILD_TRANSCODING, [test "${enable_transcoding}" != "no"]) dnl dnl Test coverage dnl AC_ARG_ENABLE(coverage, [ --enable-coverage build for test coverage (default disabled)],, [enable_coverage="no"]) AS_IF([test "${enable_coverage}" != "no"], [ CFLAGS="-fprofile-arcs -ftest-coverage ${CFLAGS}" CXXFLAGS="-fprofile-arcs -ftest-coverage ${CXXFLAGS}" LDFLAGS="-lgcov ${LDFLAGS}" ]) dnl dnl duma support dnl AC_ARG_ENABLE(duma, [ --enable-duma Debbuging DUMA library (default disabled)],, [enable_duma="no"]) if test "${enable_duma}" = "yes" then AC_CHECK_LIB([duma], [_duma_malloc],[], [enable_duma="no"]) if test "${enable_duma}" != "no" then LDFLAGS="-lduma ${LDFLAGS}" else AC_MSG_WARN([The DUMA library needs to be installed before]) fi fi # Checks for header files. AC_HEADER_RESOLV AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h syslog.h unistd.h values.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_INT32_T AC_TYPE_SIZE_T AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT8_T # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_REALLOC AC_CHECK_FUNCS([alarm gettimeofday inet_ntoa memset socket strerror strstr]) AC_CONFIG_FILES([Makefile doc/Makefile src/Makefile]) AC_OUTPUT #put resume at the end echo "" echo "-------------------------------------------------------" echo "MuMuDVB configure results:" echo "" echo "Features" echo "" if test "${enable_cam_support}" != "no" ; then echo "Build with CAM support: yes" else echo "Build with CAM support: no" fi if test "${enable_transcoding}" != "no" ; then echo "Build with transcoding support: yes" else echo "Build with transcoding support: no" fi if test "${atsc_long_names}" = "yes" ; then echo "Build with ATSC long names support: yes" else echo "Build with ATSC long names support: no" fi echo "" echo "Debugging" echo "" if test "${enable_coverage}" = "yes" ; then echo "Build with code coverage debug symbols yes" else echo "Build with code coverage debug symbols no" fi if test "${enable_duma}" = "yes" ; then echo "Build with debugging DUMA library yes" else echo "Build with debugging DUMA library no" fi mumudvb-1.7.1/depcomp000077500000000000000000000475561177353207000146020ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2011-12-04.11; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011 Free Software Foundation, Inc. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/ \1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/ / G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mumudvb-1.7.1/devtools/000077500000000000000000000000001177353207000150435ustar00rootroot00000000000000mumudvb-1.7.1/devtools/update_version.sh000077500000000000000000000002331177353207000204270ustar00rootroot00000000000000#/bin/bash # $date=date +%Y%m%d sed -e s/VERSION/`date +%Y%m%d`_`git branch --contains HEAD | grep \* | tr -d "* "`/g configure.ac.template > configure.ac mumudvb-1.7.1/doc/000077500000000000000000000000001177353207000137515ustar00rootroot00000000000000mumudvb-1.7.1/doc/CAM_menu_interface.png000066400000000000000000000414321177353207000201270ustar00rootroot00000000000000PNG  IHDRK;EtEXtSoftwareAdobe ImageReadyqe<BIDATx;o$GS #{ 9md, h`/#-ІAwELh:?cog3p29$baKvXZ{bX<.U!Yd2 _)u ` 7:ܼ2խT>74%ёы{zGUi;I'='vS }ʠΡэ}rҩu>ZZ9f3:)HZë*㜻4f{w)l2;& :7::5IwMt:;Q<'j4ߑlNεaU|4nFpyhGHbѮWمwN Ch (FI3ZuQ8p@p@ ( (P8p@(P8p@ B!+߬ydq)efWnHJ^z=;E ک MY_mK]]-bYX2\5T`>UkU:V YYՅ?nMGl*fVv*|2tiE^kOfhv6[ϵMˋMy\j>ܑx^:uu'՟e\gFNZU8܎֪&y鄋E QDAĠGE8ZPivRG٩=4{C9ަ@}/+UnȦ .!J$.>$62]^<~rVŹQf^;_aswMr~Cc -XL^'Ȍ@mCuaⴺ6<6D]cMˋ+-Ջ}q\ )TF\m|g+2wFG5yiMM8UMV)\Z <'y?'m EUh*ZZ <]^梲^,vky)̻o>.,h2B*tm2.YXf;AD(RtkYRK_lƈuY=tl񾉼I>WOgFhU}jhfH_DZ !g^e zJFhӊ Pv@my 9k=㇬C&={]yHGĤOI{̷F Yv7:^۞zE]MO*2۶5ȳMe& (8k[*v%qZlj(o&bǰș0c1fD6haDgy 闞*N5s ?],H^G>]Osԥ"'T$"ƕ5=o^ ךz>2w G"9{xpY"bFAޓNFhexfWf~I퐸Um>NL2hS뱹:y";97g]tx M٫vZz i]j%L.Ӫxu_W \-,quVsm&Ulk*f$텬чJⳆёLhԻr[kiqz=/6ہN7:TMfEzweUo-zpՋ[=ݞ}S-Mr! 关{.\`TD0$^ӭ\>XdtJ_+* k<'DW1u[5wHԡJH][}`wxyLվ6葦#<<׃ɼo~2Ws*b>o]HLw4y0Oqi7֥pֶyx6 ƮR>I:æY:a+Ux3SٴpIA$%^`UZ])U%H^g儓zL,^x6гVi7rKJV <^P8p@ @ (P8 (P8p@P8p@ W&4׎1"VwMřԋ+duqXe%ʣ%IS]7bӚW緆(R۰P㋣y(?]l*|XX^u[ٱ-OlvM^dySQ,\,ʣPFoCdhf[M%i.]̃8sy?&-Ipϥ'9Y1v˭>q::$rW.:[m (u{i֦pG AH0=Zh<]i$}Ǜxi~{{]ƻ{փ)e. 1ĴϞK]Hvvxg'៖yR&PYo LY'F_j\h;r> a<I{='rͫvΥC@ ![o=^L߰}8 (P8p@(P8p@ @ )|6Q4qF!v#>}(jO3c*}8.P8p¯.4yg-|*Γx\0y(.NGU96xk"%g+gTL =U| h'ƣT*8 ;:Y߉2y-1bQJ#O/^\nݝQteU W'^!Uq]=u |5 Pݕ˳FyRpppp}9|]_wG4KE]__B&r0wd*uY%>^)_TA2e 'Wd!UBvX/ #*E[܈=(Hw;oH[3x:ͺfڣ*?^6zC($䶘b)9|-;B''F R5DONN鍇wHȐ@mu9JgY*TswVԕQ^U#!r NtP]7GJݴMzPDnwԪߗWa\,Y9jnDQ yemuTbWgdPm,2 Gih-WhD _XEueE*6% pvkLj] ]58!މje{PCr`h35 L=iKdeӬb 7RRMMÛ1PCdU 7<4L-1-BUT$ ,X)Y)ݎ'˲Ɩe~uPJ㒮3 ~ɟViV]k*'=͌-[b P՞b͙!)#~aw^ &Ҋ{D{r֥职̙ Q) \F.T?=-)wb?<3.vW~H>ԈaҼ}vRជaLKyz&uF1\ug7DL{c2n=UߞMˮPSD-!tyn>UibłLsf-륬Ew*s$.+GWih\XԢzy=WyP]og,𬟯:F1C`3cqq>ygH,*}b%:ԙl$~oogz+{([FчV9ڇ Q:~p%0(UAwyzvVWnG R[^R0Gq(|$t4BOM=/} R$ȠoiziruyquBY4Z"'ӓlwngb{@tmDvzbE< <ϩ%n~.R=Ơ El@[49w=fr81<ƂQf5H΅LarSH\ḧV"E|򝮬 1:CEubk1y&ko_ ^ BcliVfJ ]kDε1P̆9DEzvb@%zW-B*n-خܽ^#48 EsV q_;6ݜʡͺu،o49v\mm#t ;^,TTMNrJF)G儘w uvgegkV$oEgPGK DjcY)"~Hp:1re;񢉹z Ʊ̼sk/"oj.rW$RL=֌^[엾.pu&_:ߖ (R@ K J`(P8NyvFLW^Đr};dc-bmΖ B6nPr wnJP焓6 R^(+VvɦT~@nTߢE80<^ٲv/'X'i͓+yq"v͝R|~_- C|Rۼ6Y(k~/o{iK4E__鮁JO// 4=KBye"Y48Τ|CxL)Mzw~]h6:>gV3os VD)âV6gfjKw-H`vU/bFwy,T5LBoU/ *oޢ3)oR8]Wx;Y~uW>E6t\=^Wx%:쿵۟}5Shu?PW}u~)fe|UuYz[rseY] dq^syBwp|siO 7Pa'=PnKV/|ӓ}l3\7\lu7^ʭR|CXjVB@oowf".dpG'j(#pnδew-+X_~z@OVM[on' yf^Y LךP+tKFQI<އ-@=5zj/uXXd k/YvC|'^NA[ՌU< j1ir.CkN9Q^pDt~WYh9ȦPW6 ,h7J/uWՈ*Ri6MW.'u^DiJhz`Gb^icqCE Vs%5'}hv7Dc1ɕ8_bKAn8^*N=r>Ch-n' oʫ{e2ԾTh9l_Wo@kCZzeP|_|N˽]~:3ױcYcictXh(^*˗ʢƒ*dWy`l}x`ٟt~2{dmEIU` wJ_OBbUحT_կ ~^Eja{,;:@+^ۀ~=nU [:.)6x'ÕIlHCwLZ(%:UoF=+'N{Q\ZS`p;xu<׭KE{qY>83`N(8k~ԩC*}YO`eo?W{pIJp6jXuwS(X_z{"?# H]ՉL=^w6jxL.9a/!޿3ܜ_zJhn嬎9-&մTqԼYў_#B&s#8\CVvIY ΍`} ߈_zU[SL#&s#X7痮fȮEԸ5L#&\t@tYVЗӸɇ Mb)_.'^ f1j~vf~9@Ͼ z3~; qz< )S ŒDj;Ed]#7w8Q: Ke `]Q:p@` &aSz ,[ tatԃ64ڋvVoxS`.}Ps>Ȇ=WFm;冡D$^?6ЪD(N;?{]ŞZqXϵ:8҉҃yp.PFkK7,-ֺYx6(s_.RQ>2..ϭ&nLj{+v^wl˃s =AحK/پK s EZi-d![)+gqasH3C% pJl~踲:70?V\\=Xy`\Ck՘떭* 3 >"j\K6W`k (/z(^ Fsks'-[K&չ.nh'_Έ[&ҭ,`yȦĵ/p<+juo1ro`/Rg2 (`/}Pec #SnhU `y;sQ.x[:OV対uSܱZ;:@?m)b7~^^2&gWg8zWRqO4ҝG (ԃz,`Y0wOZ^`׼W /M6l6x8K SKs/]aYSbvUIcz6E\=Y$}8pXs_:}8l/ (P8 (P8p@P8p@ @ Փ"-mّ"i7ɛNy [^<7],F2Eb[|*[/T1>]tx F^;S ;ũūC R'IEMضU%wT$V~ U`DS#ŸN4aOQO]ݓP)6'ֽ}&pKȨvdH f>~:)aְdrش{r:Gzn8rr^UN+EU:!1 O;NFdάEŢ;zd>/]'lgQE5IحϗdVU뺝v/u2+;ԅַ#[K:nxr oW c ]o(Pjh6jOny>8Njo^T53ޮ7 ܐ|F80 (P8p(P8p@p@ ( (P8p@O|eBmjgj&wX<9#gV!)\4Z?բٰ_ZܷMͳuv\`X,"ˋ-og+Mb]ݶ&[}?r::zxhZԀqWF {ǹ(ogG_,[eA{5B\^<co9} o|◊znuAuӣu@8 qmg-|§vSL;3K}-H-g\x"gI˧M`Z<0K[\5^b0~r.|Z\\,u[`~0OB_-܆bt)kC+}&|m(`]p@  (P8p(P8p@gE0:\ޣPv#>s _}EGѭ輿Ӈk^_bJ>WlѵVxw25EGmIѵVxPݠ( 8 > 7>`z l]h%]+t%woMPjy_-8WS*M(,Qv+Wبq^Qs%ӌvN> s^٣Gb $Q }yLM}ďc̥a=ÜK.e61 QEr-*77ߣpf'#@?zuA܌k mTӯou=ә'elh˼~ Aˠp(P87(Q*>AQt#Px܍(:q8l\2E#J;Xp0X^ۆk5`y=n{3ֈEGm(P8(VcVºePkFKMl7 .}u&J8c:"ӉXZVSjeJѳ͒q }s̪ݺ*Rg|:g8Bxrbt q[#,ڊH={6qd 3lDVXʨhgmUvGua-''=u[oB+g3FxV&ܣq8ۂEM(cǑ-˜(u6\v ʄ]Y#3E8V+LX^HL8,GmCѵVxq E=EZk6p(8 '[[ io(^E7214u먰Eǚ'm-Yt2(|5Ux|I?^d[Ś1c߆&;bFp#V/kZ\«(q*gCo.B6O踋uF${|hROxH2InYEZh.[FD=[LhY*ƼX|L>w2ޗ^H=#]^oQcF#+S)Vz_0-uۚoǹDEG (HaeBQtۮpֈ EGэ@c+ vV&\,GmV& ף趡Z+/AYܼKY$Bx_Lݕ{BڏrOO)/Ÿ~Ȟҵ7ٓ?/{FjeQ->=~?y /{4"n>uOˎo?7eHtY6O>ůr2?+\?츑;|2x~_)~1ݟeP]عn?Lq?~㏽^g>){'wӴ~On~2L""k.˼WGoV{.B߳Yk巟T7,ysDW ߖ׏/R0/"坫?>?~qlǺ|<ɧ|cF;Kh?r<Εi {:}t߼ӟ_Oӏs_?0w4?|_כ`.ǟۄŏo:s)v~kDW?}2c>N7DGt=DӇ?y^~^e+pÖEcF^ۍ[ip?'giwȅ$t9cj:B保◝>hcQ_~T可{Z% >r==bV}_g~O~_za/#^鹑`4EĞɈ=wC?r8~;}-djdw/??~'ŊO> Version 1.7.1 [NOTE] An HTML version of this file is availaible on http://mumudvb.braice.net[MuMuDVB's website]. image::http://mumudvb.braice.net/mumudvb/logo_mumu_wiki.png[caption="logo MuMuDVB"] Presentation ------------ Description ~~~~~~~~~~~ MuMuDVB (Multi Multicast DVB) is originally a modification of dvbstream that http://www.crans.org[cr@ns] made. We have decided to redistribute it. Now, it's a standalone project. MuMuDVB is a program that redistributes streams from DVB (Digital Television) on a network (also called IPTV) using multicasting or HTTP unicast. It can multicast a whole DVB transponder by assigning each channel a different multicast IP. Website ~~~~~~~ http://mumudvb.braice.net[Mumudvb main site] Authors and contacts -------------------- .Upstream author - mailto:mumudvb@braice.net[Brice Dubost] .Contributions - mailto:manu@REMOVEMEcrans.ens-cachan.fr[Manuel Sabban] (getopt) - mailto:glondu@REMOVEMEcrans.ens-cachan.fr[Stéphane Glondu] (man page, debian package) - Special thanks to Dave Chapman (dvbstream author and contributor) - Pierre Gronlier, Sébastien Raillard, Ludovic Boué, Romolo Manfredini - Utelisys Communications B.V. for the transcoding code .Mailing list: - mailto:mumudvb-dev@REMOVEMElists.crans.org[MuMuDVB dev] - https://lists.crans.org/listinfo/mumudvb-dev[MuMuDVB dev list information and subscription] [NOTE] When contacting about an issue, please join the config file used and the output of MuMuDVB in verbose mode ( -vvv on the command line) and any other information that could be useful. Contents and features --------------------- Features overview ~~~~~~~~~~~~~~~~~ - Stream channels from a transponder on different multicast IPs - Support for scrambled channels (if you don't have a CAM you can use sasc-ng, but check if it's allowed in you country/by your broadcaster) - Support for automatic configuration i.e channels discovery, see <> section - Generation of SAP announces, see <> section - Support of DVB-S2, DVB-S, DVB-C, DVB-T and ATSC - Possibility to partially rewrite the stream for better compatibility with set-top boxes and some clients. See <> and <> sections. - Support for HTTP unicast see <> section - Support for RTP headers (only for multicast) - Ability to transcode the stream (only for multicast for the moment) see the <> section - CAM menu access while streaming (using a web/AJAX interface - see WEBSERVICES.txt and CAM_menu_interface.png for screenshot) Detailled feature list ~~~~~~~~~~~~~~~~~~~~~~ - Can show reception level when streaming - Show if channels are successfully descrambled by the CAM - Makes a list of streamed and down channels in real time - Can deamonize and write his own process id in a file - Supports standard and universals LNBs - Can stop himself if it receives no data from the card after a defined timeout - Stops trying tuning after a configurable timeout - The mandatory pids are always sent with all channels : * PAT (0): Program Association Table * CAT (1): Conditionnal Access Table * NIT (16): Network Information Table: intended to provide information about the physical network. * SDT (17): Service Description Table: data describing the services in the system e.g. names of services, the service provider, etc. * EIT (18): Event Information Table: data concerning events or programmes such as event name, start time, duration, etc. * TDT (20): Time and Date Table: information related to the present time and date.This information is given in a separate table due to the frequent updating of this information. - Can suscribe to all multicast groups (IGMP membership request) in order to avoid some switches to broadcast all channels see <>. - Supports autoconfiguration, see <> section * In autoconfiguration mode, MuMuDVB follow the changes in the PIDs and update itself while running. - Debian flavor initialisation scripts - The buffer size can be tuned to reduce CPU usage, see <> section. - Can avoid the sending of scrambled packets - Automatically detect the scrambling status of a channel - Can reset the CAM module in case of a bad initialisation - Can sort the EIT PID to send only the ones corresponding to the current channel - Data reading can be done using a thread, see <> section. - Playlist generation, see <> - Templates support - Simple webservice exposing detailed streaming status (see WEBSERVICES.txt) Installation ------------ From sources ~~~~~~~~~~~~ From a snapshot ^^^^^^^^^^^^^^^ If you downloaded a snapshot, you will have to generate the auto(conf make etc ...) files. In order to do this you will need the autotools, automake, gettext and libtool and, type in the folder of MuMuDVB ---------------- autoreconf -i -f ---------------- Then you have a source which can be installed as a release package. From a release package ^^^^^^^^^^^^^^^^^^^^^^ In order to install MuMuDVB type: --------------------------------- $ ./configure [configure options] $ make # make install --------------------------------- The `[configure options]` specific to MuMuDVB are: --------------------------------------------------------------------- --enable-cam-support CAM support (default enabled) --enable-coverage build for test coverage (default disabled) --enable-duma Debbuging DUMA library (default disabled) --------------------------------------------------------------------- You can have a list of all the configure options by typing -------------------- $ ./configure --help -------------------- [NOTE] The CAM support depends on libdvben50221, libucsi (from linuxtv's dvb-apps). The configure script will detect automatically the presence of these libraries and deactivate the CAM support if one of them is not present. [NOTE] The decoding of long channel names for autoconfiguration in ATSC depends on libucsi (from linuxtv's dvb-apps). The configure script will detect automatically the presence of this library and deactivate the long channel name support if it is not present. The full autoconfiguration will still work with ATSC but the channel names will be the short channels names (7 characters maximum) [NOTE] If you want to compile the doc i.e. generate HTML files using asciidoc, type `make doc`. The rendering for the tables will work with asciidoc 8.4.4 (can work with lower version but not tested). In order to install starting scripts (debian flavor) type: ------------------------------------------------------------ # cp scripts/debian/etc/default/mumudvb /etc/default/mumudvb # cp scripts/debian/etc/init.d/mumudvb /etc/init.d/mumudvb ------------------------------------------------------------ [NOTE] It is advised to create a system user for MuMuDVB, e.g. : `_mumudvb`, you have to add this user to the video group and make the directory `/var/run/mumudvb` RW by this user. By doing this, you'll be able to get all the features of MuMuDVB. From Debian package ~~~~~~~~~~~~~~~~~~~ If you want to install a version which is not in your repositories, you can install it by hand by typing: ---------------------- # dpkg -i mumudvb*.deb ---------------------- Otherwise you can use aptitude/synaptic as usual Usage ----- The documentation for configuration file syntax is in `doc/README_CONF.txt` (link:README_CONF.html[HTML version]). Usage: -------------------------------------- mumudvb [options] -c config_file mumudvb [options] --config config_file -------------------------------------- Possible options are: ------------------------------------------------------------------ -d, --debug Don't deamonize and print messages on the standard output. -s, --signal Print signal strenght every 5 seconds -t, --traffic Print the traffic of the channels every 10 seconds -l, --list-cards List the DVB cards and exit --card The DVB card to use (overrided by the configuration file) --server_id The server id (for autoconfiguration, overrided by the configuration file) -h, --help Show help -v More verbose (add for more) -q More quiet (add for less) --dumpfile Debug option : Dump the stream into the specified file ------------------------------------------------------------------ Signal: (see kill(1)) ------------------------------------------------------------------ SIGUSR1: switch the signal strenght printing SIGUSR2: switch the traffic printing SIGHUP: flush the log files ------------------------------------------------------------------ [[autoconfiguration]] Autoconfiguration ----------------- MuMuDVB is able to find the channels in the transponder and their PIDs (Program IDentifiers). Without autoconfiguration, you have to set the transponder parameters, and for each channel, the multicast ip, the name and the PIDs (PMT, audio, video, teletext etc...) At the end of autoconfiguration, MuMuDVB generates a config file with the discovered parameters. This file is: `/var/run/mumudvb/mumudvb_generated_conf_card%d_tuner%d` If the PIDs are changed, MuMuDVB will automatically update the channels except if you put `autoconf_pid_update=0` in your configuration file. MuMuDVB is able to do two kinds of autoconfiguration: Full autoconfiguration ~~~~~~~~~~~~~~~~~~~~~~ This is the easiest way to use MuMuDVB. Use this when you want to stream a full transponder or a subset of a transponder (using autoconf_sid_list). [NOTE] You don't have to specify any channel using this mode In this mode, MuMuDVB will find for you the different channels, their name and their PIDs (PMT, PCR, Audio, Video, Subtitle, Teletext and AC3). In order to use this mode you have to: - Set the tuning parameters to your config file - Add `autoconfiguration=full` to your config file - You don't have to set any channels - For a first use don't forget to put the `-d` parameter when you launch MuMuDVB: e.g. `mumudvb -d -c your_config_file` .Example config file for satellite at frequency 11.296GHz with horizontal polarization ---------------------- freq=11296 pol=h srate=27500 autoconfiguration=full ---------------------- The channels will be streamed over the multicasts ip adresses 239.100.c.n where c is the card number (0 by default) and n is the channel number. If you don't use the common_port directive, MuMuDVB will use the port 1234. [NOTE] By default, SAP announces are activated if you use this autoconfiguration mode. To deactivate them put `sap=0` in your config file. By default, SDT rewriting is activated if you use this autoconfiguration mode. To deactivate it put `rewrite_sdt=0` in your config file. By default, PAT rewriting is activated if you use this autoconfiguration mode. To deactivate it put `rewrite_pat=0` in your config file. By default, EIT sorting activated if you use this autoconfiguration mode. To deactivate it put `sort_eit=0` in your config file. [NOTE] A detailled, documented example configuration file can be found in `doc/configuration_examples/autoconf_full.conf` Name templates and autoconfiguration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By default the name of the channel will be the name of the service defined by the provider. If you want more flexibility you can use a template. For example, if you use `autoconf_name_template=%number-%name` The channels name will be in the form : - `1-CNN` - `2-Euronews` There is different keywords available: [width="80%",cols="2,8",options="header"] |================================================================================================================== |Keyword |Description |%name | The name given by the provider |%number | The MuMuDVB channel number |%lang | The channel primary language |%card | The DVB card number |%tuner | The tuner number |%server| The server number specified by server_id or the command line |%lcn | The logical channel number (channel number given by the provider). Your provider have to stream the LCN. The LCN will be displayed with three digits including 0. Ex "002". If the LCN is not detected, %lcn will be replaced by an empty string. |%2lcn | Same as above but with a two digits format |================================================================================================================== Please refer to README_CONF to see which options accept which templates Other keywords can be easily added if necessary. [[autoconfiguration_simple]] Simple autoconfiguration ~~~~~~~~~~~~~~~~~~~~~~~~ [NOTE] This autoconfiguration mode will soon disapear. If you absolutely need it except for setting the channel names and their IP adresses, please contact. Use this when you want to control the name of the channels, and their IPs better than using the templates. - You have to add 'autoconfiguration=partial' in the head of your config file. - For each channel, you have to set: * the Ip adress (except if you use unicast) * the name * the PMT PID MuMuDVB will find the audio, video, PCR, teletext, subtitling and AC3 PIDs for you before streaming. [NOTE] If you put more than one PID for a channel, MuMuDVB will deactivate autoconfiguration for this channel. [NOTE] A detailled, documented example configuration file can be found in `doc/configuration_examples/autoconf_partial.conf` [NOTE] Simple autoconfiguration can fail finding the good pids if a PMT pid is shared within multiples channels. In this case you have to add the `service_id` option to the channel to specify the service id. [[sap]] SAP announces ------------- SAP (Session Announcement Protocol) announces are made for the client to know which channels are streamed and what is their name and adress. It avoids to give to the client the list of the multicast ip adresses. VLC and most of set-top boxes are known to support them. MuMuDVB will automatically generate and send SAP announces if asked to in the config file or if you are in full autoconfiguration mode. The SAP announces will be only sent for alive channels. When a channel goes down, MuMuDVB will stop sending announces for this channel, until it goes back. Asking MuMuDVB to generate SAP announces ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For sending SAP announces you have to add `sap=1` to your config file. The other parameters concerning the sap announces are documented in the `doc/README_CONF.txt` file (link:README_CONF.html[HTML version]). SAP announces and full autoconfiguration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you use full autoconfiguration, you can use the keyword '%type' in the sap_default_group option. This keyword will be replaced by the type of the channel: Television or Radio. .Example If you put `sap_default_group=%type`, you will get two sap groups: Television and Radio, each containing the corresponding services. Configuring the client to get the SAP announces ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VLC > 0.8.2 ^^^^^^^^^^^ You have to enter the settings, choose advanced settings. The SAP announces are in playlist->service discovery. Don't forget to save the settings. You should have now a SAP section in your playlist. VLC < 0.8.2 ^^^^^^^^^^^ Click on the "Settings" menu, then on "add interface" and choose SAP playlist. Then open you playlist, the SAP announces should appear automatically. [[unicast]] HTTP Unicast ------------ In addition to multicast, MuMuDVB also supports HTTP unicast. This make you able to use MuMuDVB on networks wich doesn't support multicast. There is one listening connection, the channel is selected via the HTTP path, see further. And you can have listening sockets per channel, in this case the client will always get the same channel independantly of the path. [NOTE] Be careful with unicast, it can eat a lot of bandwith. Think about limitting the number of clients. [NOTE] If you don't want the (always here) multicast traffic to go on your network set `multicast=0` Activate HTTP unicast ~~~~~~~~~~~~~~~~~~~~~ To enable HTTP unicast you have to set the option `unicast`. By default MuMuDVB will listen on all your interfaces for incoming connections. You can also define the listening port using `port_http`. If the port is not defined, the default port will be 4242. Activate "per channel" listening socket ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can create listening connections only for a channel. In this case, when a client connect to this socket he will alway get the same channel independantly of the HTTP path. If you use full autoconfiguration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You need to set the option `autoconf_unicast_start_port` which define what is the output port for the first discovered channel (for the following channels the port will be incremented). If you don't use full autoconfiguration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For the channels for which you want to have a listening unicast socket you have to set the option `unicast_port` which define the listening port of the socket Client side, the different methods to get channels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [[playlist]] Using a playlist ^^^^^^^^^^^^^^^^ MuMuDVB generates m3u playlists. If you server is listening on the ip 10.0.0.1 and the port 4242, ------------------------------------- vlc http://10.0.0.1:4242/playlist.m3u ------------------------------------- [NOTE] In this playlist the channels will be announced with URLs type `/bysid/` (see below), if you want a playlist for single channel sockets, use the URL `/playlist_port.m3u`. [NOTE] Playlists for multicast are also generated, they are accessible using the following names: "playlist_multicast.m3u" and "playlist_multicast_vlc.m3u" Single channel socket ^^^^^^^^^^^^^^^^^^^^^ If the client connect to a single client socket he will get the associated channel independantly of the path. If you server is listening on the ip 10.0.0.1 and the port for the channel is 5000, ------------------------- vlc http://10.0.0.1:5000/ ------------------------- Get the channel by number ^^^^^^^^^^^^^^^^^^^^^^^^^ You can ask the channel by the channel number (starting at 1). If you server is listening on the ip 10.0.0.1 and the port 4242, ------------------------------------ vlc http://10.0.0.1:4242/bynumber/3 ------------------------------------ will give you the channel number 3. This works also with xine and mplayer. Get the channel by service id ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can ask the channel by the service id. If you server is listening on the ip 10.0.0.1 and the port 4242, ---------------------------------- vlc http://10.0.0.1:4242/bysid/100 ---------------------------------- will give you the channel with the service id 100, or a 404 error if there is no channel with this service id. This works also with xine and mplayer. Get the channel by name ^^^^^^^^^^^^^^^^^^^^^^^ [NOTE] This is not implemented for the moment, it will be implemented in a future release Get the channels list ^^^^^^^^^^^^^^^^^^^^^ If you server is listening on the ip 10.0.1 and the port 4242, To get the channel list (in basic html) just enter the adress `http://10.0.0.1:4242/channels_list.html` in your web browser. To get the channel list (in JSON) just enter the adress `http://10.0.0.1:4242/channels_list.json` in your web browser. HTTP unicast and monitoring ~~~~~~~~~~~~~~~~~~~~~~~~~~~ This HTTP connection can be used to monitor MuMuDVB. Monitoring information is avalaible in JSON format (http://en.wikipedia.org/wiki/JSON) vis the following urls `/monitor/signal_power.json` and `/monitor/channels_traffic.json` It's quite easy to add new informations to these files if needed. Monitoring ---------- You can use http://mmonit.com/monit/[Monit] to monitor MuMuDVB an restart it when it experiences problems (MuMuDVB kill himself when big issues appear). You have to install the init scripts (automatic if you used the Debian package) and add the following lines to your `/etc/monit/services` file: ---------------------------------------------------------------------- check process mumudvb with pidfile /var/run/mumudvb/mumudvb_adapter0_tuner0.pid start program = "/etc/init.d/mumudvb start" stop program = "/etc/init.d/mumudvb stop" ---------------------------------------------------------------------- [NOTE] The 0 have to be replaced by the DVB card number if you have multiples cards. For more detailled information, refer to the http://mmonit.com/monit/[Monit Website]. MuMuDVB usually run for many days without problems, but with monit you are safe. Monit is also able to send e-mails in case of problems. Scrambled channels support -------------------------- Important note : check the contract with your broadcaster to see if you are allowed to stream the scrambled channels you're subscribed to. Hardware descrambling ~~~~~~~~~~~~~~~~~~~~~ MuMuDVB supports scrambled channels via hardware descrambling i.e. a CAM (Conditionnal Access Module). It can ask the CAM to descramble multiple channels if the CAM supports it (Aston Pro, or PowerCam Pro are known to work with multiple channels). If you are limited by the number of PIDs the can can decrypt simultaneously, it is possible to ask the CAM to decrypt only the audio and video. This feature is not implemented, please ask if you need it. [NOTE] The hardware descramblig uses almost no CPU, all the descrambling is made by the CAM. [NOTE] MuMuDVB doesn't query the CAM before asking for descrambling. The query is not reliable. Most of CAMs answer a menu when the descrambling is not possible and MuMuDVB will display it on the standard error. The information concerning the CAM is stored in '''/var/run/mumudvb/caminfo_adapter%d_tuner%d''' where %d is the DVB card number. .Example contents of '''/var/run/mumudvb/caminfo_carte%d''' ---------------------------------------------------- CAM_Application_Type=01 CAM_Application_Manufacturer=02ca CAM_Manufacturer_Code=3000 CAM_Menu_String=PowerCam_HD V2.0 ID_CA_Supported=0100 ID_CA_Supported=0500 ---------------------------------------------------- [NOTE] In case of issues with some king of CAMs the libdvben50221 could have to be patched: http://article.gmane.org/gmane.linux.drivers.video-input-infrastructure/29866[Link to the patch] How to ask MuMuDVB for descrambling? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .You are using full autoconfiguration : Just add `cam_support=1` to your config file .You are using partial autoconfiguration or no autoconfiguration * Add `cam_support=1` to your config file (before the channels) * For each scrambled channel add the `cam_pmt_pid` option. This option is made for MuMuDVB to know wich PID is the PMT PID wich will be used to ask for descrambling [NOTE] You have an example of CAM support in doc/configuration_examples/autoconf_partial.conf Software descrambling ~~~~~~~~~~~~~~~~~~~~~ Important note : this solution is not allowed by some provider contracts. MuMuDVB has been reported to work with software descrambling solutions like sascng + newcs + dvbloopback. In this case you don't need to set the `cam_support` option. Just ajust the `card` option to fit with your virtual dvbloopback card. If you use these solutions, see <> section. Some information on how to configure SASC-NG ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The following informations have been given by MuMuDVB users on the MuMuDVB-dev mailing list When the channels are not sucessfully descrambled (channel down in MuMuDVB) the following options are reported to improve the situation -------------------------------------------------- --sid-nocache --buffer 8M --sid-filt=200 -D -------------------------------------------------- You can try also the option --sid-allpid It seems to happend with transponders with a lot of channels (TV or RADIO channels). Scrambling status ~~~~~~~~~~~~~~~~~ The scrambling status is stored together with the streamed channel list. .Example ---------------------------------------------- 239.100.0.7:1234:ESCALES:PartiallyUnscrambled 239.100.0.8:1234:Fit/Toute l'Histoire:PartiallyUnscrambled 239.100.0.9:1234:NT1:PartiallyUnscrambled 239.100.0.10:1234:ACTION:PartiallyUnscrambled 239.100.0.11:1234:MANGAS:PartiallyUnscrambled 239.100.0.12:1234:ENCYCLOPEDIA:PartiallyUnscrambled 239.100.0.13:1234:XXL PL:PartiallyUnscrambled 239.100.0.14:1234:France 5:HighlyScrambled 239.100.0.16:1234:LCP:FullyUnscrambled 239.100.0.17:1234:VIDEOCLICK:FullyUnscrambled ---------------------------------------------- * FullyUnscrambled : less than 5% of scrambled packets * PartiallyUnscrambled : between 5% and 95% of scrambled packets * HighlyScrambled : more than 95% of scrambled packets [[pat_rewrite]] PAT (Program Allocation Table) Rewriting ----------------------------------------- This feature is mainly intended for set-top boxes. This option will announce only the streamed channel in the Program Allocation Table instead of all transponder channels. Computer clients parse this table and decode the first working program. Set-top boxes usually try only the first one which give usually a blank screen in most of the channels. To enable PAT rewriting, add `rewrite_pat=1` to your config file. This feature consumes few CPU, since the rewritten PAT is stored in memory and computed only once per channel. [NOTE] PAT rewrite can fail (i.e. doesn't solve the previous symptoms) for some channels if their PMT pid is shared. In this case you have to add the `service_id` option to the channel to specify the service id. [[sdt_rewrite]] SDT (Service Description Table) Rewriting ----------------------------------------- This option will announce only the streamed channel in the Service Description Table instead of all transponder channels. Some clients parse this table and can show/select ghost programs if it is not rewritten (even if the PAT is). This can rise to a random black screen. To enable SDT rewriting, add `rewrite_sdt=1` to your config file. This feature consumes few CPU, since the rewritten SDT is stored in memory and computed only once per channel. [NOTE] If you don't use full autoconfiguration, SDT rewrite needs the `service_id` option for each channel to specify the service id. EIT PID (Event Information Table) Sorting ----------------------------------------- This option will make MuMuDVB stream only the EIT packets corresponding to the streamed channel instead of all transponder channels. Some clients parse this table and can show/select ghost programs (even if the PAT and the SDT are rewritten). To enable EIT sorting, add `sort_eit=1` to your config file. [NOTE] If you don't use full autoconfiguration, EIT sorting needs the `service_id` option for each channel to specify the service id. [[reduce_cpu]] Reduce MuMuDVB CPU usage ------------------------ Normally MuMuDVB reads the packets from the card one by one and ask the card if there is data avalaible between each packets (poll). But often the cards have an internal buffer. Because of this buffer, some pollings are useless. These pollings eat some CPU time. To reduce CPU usage, one solution is to try to read several packets at the same time. To do this use the option `dvr_buffer_size`. .Example ------------------ dvr_buffer_size=40 ------------------ To see if the value you put is too big or to low, run MuMuDVB in verbose mode, the average number of packets received at the same time will be shown every 2 minutes. If this number if below your buffer size, it is useless to increase it. The CPU usage reduction can be between 20% and 50%. [[threaded_read]] Data reading using a thread --------------------------- In order to make MuMuDVB more robust (at the cost of a slight CPU consumption increase), MuMuDVB can read the data from the card using a thread. This make the data reading "independant" of the rest of the program. In order to enable this feature, use the option `dvr_thread`. This reading uses two buffers: one for the data just received from the card, one for the data treated by the main program. You can adjust the size of this buffers using the option `dvr_thread_buffer_size`. The default value (5000 packets of 188 bytes) should be sufficient for most of the cases. The message "Thread trowing dvb packets" informs you that the thread buffer is full and some packets are dropped. Increase the buffer size will probably solve the problem. [[transcoding]] Transcoding ----------- MuMuDVB supports transcoding to various formats to save bandwidth. The transcoding is made using ffmpeg librairies. This feature is pretty new, so feel free to contact if you have comments/suggestions. For transcoding support, you have to compile MuMuDVB yourself. Due tu API changes, transcoding is broken for recent versions of MuMuDVB. [NOTE] Transcoding doesn't work for the moment with unicast To have more details on transcoding, see the dedicated documentation file [[ipv6]] IPv6 ---- MuMuDVB supports IPv6 multicasting. It is not enabled by default you have to activate it using the multicast_ipv6 option To "enjoy" multicasting you need a switch which supports the http://en.wikipedia.org/wiki/Multicast_Listener_Discovery[Multicast Listener Discovery] protocol. IPv6 use extensively the concept of http://en.wikipedia.org/wiki/Multicast_address[scoping]. By default MuMuDVB uses the scope "site-local" (ie multicast addresses starting with FF05) the SAP announcements are also sent with this scope. If you need to have more flexibility on this side, please contact. For more details, please consult the http://mumudvb.braice.net/mumudrupal/node/52[IPv6 page] on MuMuDVB's website Technical details (not sorted) ------------------------------ * CPU consuming: MuMuDVB takes 15% CPU of a celeron 2.6GHz with an Hauppauge card and linux version 2.6.9 when streaming a full transponder (about 30MBit/s) * Try to avoid old via or nForce chipsets and in general ultra low cost motherboards. They can't deal with a lot of data on the PCI bus. * When the program starts, he writes the channel list in the file `/var/run/mumudvb/channels_streamed_adapter%d_tuner%d` (where %d are the card number and the tuner number). This file contains streamed channels (updated every 5 seconds) in the form: "name:ip:port:Scramblingstatus" * MuMuDVB is able to support as many cards as the operating system does. Old versions of udev+glibc were not able to support more than 4 cards but this problem is solved using relatively recent versions (udev > 104 and libc6 > 2.7) * When daemonized, MuMuDVB writes its process identifier in `/var/run/mumudvb/mumudvb_adapter%d_tuner%d.pid`, where %d is replaced by the card number and the tuner number * MuMuDVB supports satellite in the Ku band, with universal or standard LNBs. The support of satellites in the S or C band is implemented via the use of the lo_frequency option. See `doc/README_CONF.txt` (link:README_CONF.html[HTML version]). MuMuDVB Logs ------------ MuMuDVB can send it's logs to the console, to a file or via syslog. It can also be several of these channels. The formatting of the logs can also be adjusted. By default, the logs are sent to the console if not daemonized and via syslog otherwise. If the logs are sent to a file, you can ask MuMuDVB to flush the file using the SIGHUP signal. For more detail about these features see `doc/README_CONF.txt` (link:README_CONF.html[HTML version]). Known issues ------------ VLC can't read the stream but it is fine with xine or mplayer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * For VLC, you must specify the PMT PID besides audio and video PIDs. It's a frequent issue. To solve it you can use the verbose mode of VLC (`vlc -v`) and you'll see a ligne like: `[00000269] ts demuxer debug: * number=1025 pid=110` you'll have the PMT PID associated with your program number, you can also use dvbsnoop, or see how to get pids in `doc/README_CONF.txt` (link:README_CONF.html[HTML version]). Another solution is to use full autoconfiguration. VLC reads the video but no audio ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * This problem can happend if the PCR (i.e. clock) information is not carried with the video. In this case you have to check if the PCR PID is in the PIDs list. MuMuDVB can't deamonize ~~~~~~~~~~~~~~~~~~~~~~~ * In order to deamonize, MuMuDVB needs the directory `/var/run/mumudvb/` to be writable, in order to write his process identifier and the channel list. The system crashes or freeze ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Old via chipset or nForce chipset are not professional chipsets. They can't deal with a lot of data on PCI. But you can try to tune your BIOS. Tuning issues with DVB-T ~~~~~~~~~~~~~~~~~~~~~~~~ * You must check tuning settings, knowing that auto bandwidth usually does'nt work. The set-top box display a blank screen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * If the stream is working well when reading it with a computer and not with your set-top box, this is probably because your set-top box needs the PAT PID to be rewritten. To do this add `rewrite_pat=1` to your config file. Simple autoconfiguration fails finding the right pids ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * This can happend if a PMT PIDs is shared among multiple channels, see <> section for more details. The CAM is complaining about locked channels ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Some viaccess CAMs can have a lock for "mature" channels. To deactivate this lock go on the CAM menu using "gnutv -cammenu" for example (from linuxtv dvb-apps). You have to set the maturity rating to maximum and unlock Maturity rating in Bolts submenu. VLC doesn't select the good program even with PAT rewriting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You also have to rewrite the SDT PID using the `rewrite_sdt` option [[problems_hp]] HELP ! my multicast traffic is flooded (I have a HP procurve switch) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The best explanation is found in the HP multicast routing guide. On switches that do not support Data-Driven IGMP, unregistered multicast groups are flooded to the VLAN rather than pruned. In this scenario, Fast-Leave IGMP can actually increase the problem of multicast flooding by removing the IGMP group filter before the Querier has recognized the IGMP leave. The Querier will continue to transmit the multicast group during this short time, and because the group is no longer registered the switch will then flood the multicast group to all ports. On ProCurve switches that do support Data-Driven IGMP (“Smart” IGMP), when unregistered multicasts are received the switch automatically filters (drops) them. Thus, the sooner the IGMP Leave is processed, the sooner this multicast traffic stops flowing. Switches without problems (supporting data driven igmp): * Switch 6400cl * Switch 6200yl * Switch 5400zl * Switch 5300xl * Switch 4200vl * Switch 3500yl * Switch 3400cl * Switch 2900 * Switch 2800 * Switch 2500 Switches WITH problems (NOT supporting data driven igmp): * Switch 2600 * Switch 2600-PWR * Switch 4100gl * Switch 6108 So if you have one of the above switches this is "normal". The workaround is to make MuMuDVB join the multicast group. For this put `multicast_auto_join=1` in your configuration file. MuMuDVB is eating a lot of CPU with sasc-ng ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you use sasc-ng + dvbloopback, MuMuDVB will eat more CPU than needed. A part of this CPU time is used to descramble the channels, another part is due to the way dvbloopback is implemented and the way MuMuDVB ask the card. To reduce the cpu usage, see <> section. In the case of using MuMuDVB with sasc-ng this improvement can be quite large. The reception is working but all the channels are down ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If the signal is good but MuMuDVB tells you that all the channels are down and you are sure about your pids it can be due to your CAM module if you have one. Try after unplugging your CAM module. I want to stream from several cards ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The solution is simple: just launch a MuMuDVB process for each card. I want to stream the whole transponder on one "channel" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MuMuDVB can stream all the data received by the card to one "channel" (multicast or unicast). In order to do this you have to use the put the PID 8192 in the channel PID list. I have several network interfaces and I want to choose on which interface the multicast traffic will go ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In order to specify the interface, you can specify a route for the multicast traffic like : --------------------------------------------------- route add -net 224.0.0.0 netmask 240.0.0.0 dev eth2 --------------------------------------------------- or use multicast_iface4 and multicast_iface6 options What does the MuMuDVB error code means ? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Here's a short description of the error codes ------------------------------ ERROR_ARGS=1, ERROR_CONF_FILE, ERROR_CONF, ERROR_TOO_CHANNELS, ERROR_CREATE_FILE, ERROR_DEL_FILE, ERROR_TUNE, ERROR_NO_DIFF, ERROR_MEMORY, ERROR_NETWORK, ERROR_CAM, ERROR_GENERIC, ERROR_NO_CAM_INIT, ------------------------------ I get the message "DVR Read Error: Value too large for defined data type" what does it mean ? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This message means that an overflow append in the ard drivers buffer. I.e MuMuDVB was not able to get the packets sufficiently fast. This issue can have various causes, anything which an slow down (a lot) MuMuDVB an create this message. To avoid it you can try threaded_read see <> section. An explanation can be networking issues : I experienced the "DVR Read Error..." message very often on my Streaming Server (ia64 Madison 1.3Ghz) (with errors in the video). I could solve the problem by exchanging the network switch. The old switch was limiting multicast traffic to 10Mb/s per port. This limit is not documented. I have tested the limit the programm dd and mnc (Multicast netcat, http://code.google.com/p/mnc/) dd if=/dev/zero bs=188 count=1000000 | ./mnc-bin 239.10.0.3 I looked with "iftop" at the current network statistics and with my old switch i saw the limit at 10Mb/s with another switch I was able to transmit 92Mb/s ~ 100% of the avaiable bandwith. Thanks to Jan-Philipp Hülshoff for the report Using MuMuDVB with "particular" clients --------------------------------------- People were able to use MuMuDVB with various clients, I will report here the tutorials I received for some of them XBMC (for XBOX originally) ~~~~~~~~~~~~~~~~~~~~~~~~~~ *Description:* XBMC (XBMP really) started as a program for modified XBOX consoles. In the following years, XBMC has grown into a multi-platform, multi-architecture media center that runs on most standard hardware. The hardware and legal limitations of the XBOX were always a concern and the Team has instead focused on running on the hardware that most people already have. *Website:* http://xbmc.org/ *Tutorial:* Here`s what You have to do, open Your favorite text editor and write an ip address with the protocol You are using of the particular program and port save it as something.strm. You have to create .strm files for every program You are streaming. Once you have done that fire up WinSCP and connect to the ip address of Your XBMC box if You are using the live version username and password is xbmc xbmc if You have installed the live version then You have provided the username and password during install process. Now copy theoes .strm files to the XBMC box in lets say home folder. Now in XBMC go to the video menu then click add source then click browse and navigate to the home folder and click ok then u have to give the name of that source use what ever You like and click ok and thats it. Go to the video menu You will see that You have a folder named as You named the source open it and You will see all of Yours .strm files click on it and it will start to play the stream from mumudvb. Works weather You are using multicast or unicast. Thanks to Ivan Cabraja for the tutorial MythTV ~~~~~~ *Description:* MythTV is a Free Open Source software digital video recorder (DVR) project distributed under the terms of the GNU GPL. *Website:* http://www.mythtv.org/ *Tutorial:* Configuring Mythtv and mumudvb Mumudvb Configuration: ^^^^^^^^^^^^^^^^^^^^^^ You need to turn pat rewriting on (i.e. rewrite_pat=1). You can use either multicast or udp streaming to mythtv (udp streaming is achieved by using a non-multicast ip address in the configuration file i.e. ip=192.168.1.100). Http unicast streaming is not supported in mythtv, but RTSP should be when this is implemented in mumudvb. The channel name needs to be in the following format "channel number" - "channel name" (e.g. name=1 - TV One ) Mythtv configuration: ^^^^^^^^^^^^^^^^^^^^^ *Single-transponder* In mythtv-setup you need to add a new "network recorder" capture card. Enter the address of the playlist mumudvb provides in the "M3U URL" field. This will be something like http://192.168.2.2:4242/playlist_multicast.m3u You then create a video source as normal, and associate this with the "Network recorder" capture card via the "input connections" option. You then need to carry out a channel scan (while you are associating the video source or via the channel editor). The channel scan appears to hang on 0%, but just select finish after a couple of seconds. This should have loaded the channels defined in the M3U file into mythtv. Relying on the EIT information embedded in the stream does not appear to work, so you need to load this information from an external xmltv source. You do this by going into the channel editor and adding the correct xmltv ID for each channel. Once you have done this you exit out of mythtv-setup and run something like: mythfilldatabase --file 1 freeview.xml (where in this case the the xmltv file is called freeview.xml). To allow recording and viewing of multiple channels from the one transponder, you need to add additional (identically configured) "network recorder" capture cards. For example if you want to be able to record two channels and watch a third at the same time you need to have set up a total of three network recorder cards. *Multiple-Transponders* if you are streaming channels from several transponders (by using several instances of mumudvb) you have two options: 1) The obvious thing to do is to define a different network recorder for each transponder (with the appropriate playlist defined), each transponder has to be associated with a different video source (assuming each transponder contains different channels). However, this does not seem to work well, with regular crashes when changing channels, and it also requires that you first switch between video sources to be able to change between channels on different transponders [this may be due to my lack of skill at configuring mythtv] 2) An easier way is to generate a custom m3u file, that contains the channels of all the transponders. This also allows you to define the xmltvid of each channel as well - removing the need to do this manually in the channel editor. In this case when you set up the network recorders, you can enter a file path for the location of the m3u file, as opposed to accessing it via a web-server (e.g. file///home/nick/channels.m3u ). Once again you simply make multiple copies of the (identical) network recorder capture card if you want to record/watch multiple channels. An example of a m3u file is as follows (in this case the first four channels defined are from one mumudvb instance, and the last two from another - of course care has to be taken in configuring the various mumudvb instances to make sure none of the channels are assigned the same port etc): -------------------------------------------------- #EXTM3U #EXTINF:0,1 - TV1 #EXTMYTHTV:xmltvid=tv1.freeviewnz.tv udp://192.168.2.101:1233 #EXTINF:0,2 - TV2 #EXTMYTHTV:xmltvid=tv2.freeviewnz.tv udp://192.168.2.101:1235 #EXTINF:0,6 - TVNZ 6 #EXTMYTHTV:xmltvid=tvnz6.freeviewnz.tv udp://192.168.2.101:1236 #EXTINF:0,7 - TVNZ 7 #EXTMYTHTV:xmltvid=tvnz7.freeviewnz.tv udp://192.168.2.101:1237 #EXTINF:0,3 - TV3 #EXTMYTHTV:xmltvid=tv3.freeviewnz.tv udp://192.168.2.101:1238 #EXTINF:0,4 - c4 #EXTMYTHTV:xmltvid=c4.freeviewnz.tv udp://192.168.2.101:1239 -------------------------------------------------- Thanks to Nick Graham for the tutorial mumudvb-1.7.1/doc/README_CONF.txt000066400000000000000000000651231177353207000162630ustar00rootroot00000000000000MuMuDVB - README for the configuration file =========================================== Brice Dubost Version 1.7.1 General behavior ---------------- MuMuDVB needs a configuration file in order to run properly. The order of the parameters is most of the times not relevant. You can put comments everywhere in the configuration file: just start the line with `#`. In line comments are not allowed i.e. `port=1234 #The multicast port` is *not* a valid line. All parameters are in the form: `name=value` .Example -------------------------- #The tuning frequency freq=11987 -------------------------- The configuration file contains two parts Common part ~~~~~~~~~~~ This is the first part of the configuration file, it contains the parameters needed for tuning the DVB card and the global parameters. See the <> section for the list of parameters used to tune the card. and <> section for parameters like autoconfiguration, cam support etc ... Channels part ~~~~~~~~~~~~~ If you are not using full autoconfiguration you need to set the list of the channels you want to stream. Each channel start with an `ip=` or `channel_next` line. .Example (unicast only) --------------------------- channel_next name=Barcelona TV unicast_port=8090 pids=272 --------------------------- .Example --------------------------- ip=239.100.0.0 port=1234 name=Barcelona TV pids=272 256 257 258 --------------------------- See <> section for a list of detailled parameters. Example config files -------------------- You can find documented examples in the directory `doc/configuration_examples` [[tuning]] Parameters concerning the tuning of the card -------------------------------------------- [NOTE] You can use w_scan to see the channels you can receive see <>. Otherwise you can have a look at the initial tuning files given with linuxtv's dvb-apps. For european satellite users, you can have a look at http://www.kingofsat.net[King Of Sat] Parameters concerning all modes (terrestrial, satellite, cable, ATSC) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In the following list, only the parameter `freq` is mandatory [width="80%",cols="2,7,2,3",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Comments |freq | transponder's frequency in MHz | | Mandatory |modulation | The kind of modulation used (can be : QPSK QAM16 QAM32 QAM64 QAM128 QAM256 QAMAUTO VSB8 VSB16 8PSK 16APSK 32APSK DQPSK) | ATSC: VSB_8, cable/terrestrial: QAM_AUTO, satellite: QPSK | Optionnal most of the times |delivery_system | the delivery system used (can be DVBT DVBT2 DVBS DVBS2 DVBC_ANNEX_AC DVBC_ANNEX_B ATSC) | Undefined | Set it if you want to use the new tuning API (DVB API 5/S2API). Mandatory for DVB-S2 and DVB-T2 |card | The DVB/ATSC card number | 0 | only limited by your OS |tuner | The tuner number | 0 | If you have a card with multiple tuners (ie there is several frontend* in /dev/dvb/adapter%d) |card_dev_path | The path of the DVB card devices. Use it if you have a personalised path like /dev/dvb/card_astra | /dev/dvb/adapter%d | |tuning_timeout |tuning timeout in seconds. | 300 | 0 = no timeout |timeout_no_diff |If no channels are streamed, MuMuDVB will kill himself after this time (specified in seconds) | 600 | 0 = infinite timeout |check_status | Do we check the card status and display a message if lock is lost | 1 | 0 = no check. |================================================================================================================== Parameters specific to satellite ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="2,6,1,3,2",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |pol |transponder's polarisation. One char. 'v' (vertical), 'h' (horizontal), 'l' (left circular), 'r' (right circular) | | h, H, v, V, l, L, r or R | Mandatory |srate |transponder's symbol rate | | | Mandatory |lnb_type |The LNB type | universal | universal, standard | Universal : two local oscilators. Standard : one local oscillator.Most of the LNBs are universal. |lnb_lof_standard |The frequency of the LNB's local oscillator when lnb_type=standard | 10750 | | In MHz, see below. |lnb_slof |The switching frequency frequency of the LNB (define the two bands). Valid when lnb_type=universal | 11700 | | In MHz, see below. |lnb_lof_low |The frequency of the LNB's local oscillator for the low band. Valid when lnb_type=universal | 9750 | | In MHz, see below. |lnb_lof_high |The frequency of the LNB's local oscillator for the high band. Valid when lnb_type=universal | 10600 | | In MHz, see below. |sat_number |The satellite number in case you have multiples lnb, no effect if 0 (only 22kHz tone and 13/18V), send a diseqc message if non 0 | 0 | 1 to 4 | If you have equipment which support more, please contact |switch_type | The DiSEqC switch type: Committed or Uncommitted | C | C, c, U or U | |lnb_voltage_off |Force the LNB voltage to be 0V (instead of 13V or 18V). This is useful when your LNB have it's own power supply. | 0 | 0 or 1 | |coderate |coderate, also called FEC | auto | none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto | |rolloff |rolloff important only for DVB-S2 | 35 | 35, 20, 25, auto | The default value should work most of the times |================================================================================================================== Local oscillator frequencies : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - S-Band 3650 MHz - C band (Hi) 5950 MHz - C band (Lo) 5150 MHz - Ku Band : this is the default band for MuMuDVB, you don't have to set the LO frequency. For information : Hi band : 10600, Low band : 9750, Single : 10750 Parameters specific to terrestrial (DVB-T) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [NOTE] `auto` usually works fine for all the parameters except `bandwidth` [width="80%",cols="2,8,1,4",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values |bandwidth |bandwidth | 8MHz | 8MHz, 7MHz, 6MHz, auto (DVB-T2: 5MHz, 10MHz, 1.712MHz) |trans_mode |transmission mode | auto | 2k, 8k, auto (DVB-T2: 4k, 16k, 32k) |guardinterval |guard interval | auto | 1/32, 1/16, 1/8, 1/4, auto (DVB-T2 : 1/128, 19/128, 19/256) |coderate |coderate, also called FEC | auto | none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto |================================================================================================================== Parameters specific to cable (DVB-C) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="2,6,1,3,2",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |srate |transponder's symbol rate | | | Mandatory |qam |quadrature amplitude modulation | auto | qpsk, 16, 32, 64, 128, 256, auto | This option is obsolete, use modulation instead |coderate |coderate, also called FEC | auto | none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto | |================================================================================================================== [NOTE] The http://www.rfcafe.com/references/electrical/spectral-inv.htm[spectral inversion] is fixed to OFF, it should work for most of the people, if you need to change this parameter, please contact. Parameters specific to ATSC (Cable or Terrestrial) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="1,3,1,2,2",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |atsc_modulation | the modulation for ATSC | vsb8 | vsb8, vsb16, qam256, qam64, qamauto | This option is obsolete, use modulation instead |================================================================================================================== [NOTE] VSB 8 is the default modulation for most of the terrestrial ATSC transmission [[other_global]] Other global parameters ----------------------- Various parameters ~~~~~~~~~~~~~~~~~~ [width="80%",cols="2,8,1,2,3",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |show_traffic_interval | the interval in second between two displays of the traffic | 10 | | |compute_traffic_interval | the interval in second between two computations of the traffic | 10 | | |dvr_buffer_size | The size of the "DVR buffer" in packets | 20 | >=1 | see README |dvr_thread | Are the packets retrieved from the card in a thread | 0 | 0 or 1 | Experimental, see README |dvr_thread_buffer_size | The size of the "DVR thread buffer" in packets | 5000 | >=1 | see README |server_id | The server number for the `%server` template | 0 | | Useful only if you use the %server template |filename_pid | Specify where MuMuDVB will write it's PID (Processus IDentifier) | /var/run/mumudvb/mumudvb_adapter%card_tuner%tuner.pid | | the templates %card %tuner and %server are allowed |check_cc | Do MuMuDVB check the discontibuities in the stream ? | 0 | | Displayed via the XML status pages or the signal display |================================================================================================================== Packets sending parameters ~~~~~~~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="2,8,1,2,3",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |dont_send_scrambled | If set to 1 don't send the packets detected as scrambled. this will also remove indirectly the sap announces for the scrambled channels |0 | | |filter_transport_error | If set to 1 don't send the packets tagged with errors by the demodulator. |0 | | |psi_tables_filtering | If set to 'pat', TS packets with PID from 0x01 to 0x1F are discarded. If set to 'pat_cat', TS packets with PID from 0x02 to 0x1F are discarded. | 'none' | Option to keep only mandatory PSI PID | |rewrite_pat | Do we rewrite the PAT PID | 0 | 0 or 1 | See README |rewrite_sdt | Do we rewrite the SDT PID | 0 | 0 or 1 | See README |sort_eit | Do we sort the EIT PID | 0 | 0 or 1 | See README |sdt_force_eit | Do we force the EIT_schedule_flag and EIT_present_following_flag in SDT | 0 | 0 or 1 | Let to 0 if you don't understand |rtp_header | Send the stream with the rtp headers (execpt for HTTP unicast) | 0 | 0 or 1 | |================================================================================================================== Logs parameters ~~~~~~~~~~~~~~~ [width="80%",cols="2,4,4,2,4",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |log_header | specify the logging header | %priority: %module | | The implemented templates are %priority %module %timeepoch %date %pid |log_flush_interval | LogFile flushing interval (in seconds) | -1 : no periodic flushing | | |log_type | Where the log information will go | If neither this option and logfile are specified syslog if deamon, console otherwise | syslog, console | The first time you specify a logging way, it replaces the default one. Then, each time you sepcify a logging channel, it is added to the previous |log_file | The file in wich the logs will be written to | no file log | | The following templates are allowed %card %tuner %server |================================================================================================================== Multicast parameters ~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="2,8,1,2,3",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |multicast |Do we activate multicast, deprecated, use multicast_ipv4 instead | 1 | 0 or 1 | |multicast_ipv4 |Do we activate IPv4 multicast | 1 | 0 or 1 | |multicast_ipv6 |Do we activate IPv6 multicast | 0 | 0 or 1 | |multicast_iface4 |The network interface to send IPv4 multicast packets | empty (let the system choose) | | |multicast_iface6 |The network interface to send IPv6 multicast packets | empty (let the system choose) | | |common_port | Default port for the streaming | 1234 | | |multicast_ttl |The multicast Time To Live | 2 | | |multicast_auto_join | Set to 1 if you want MuMuDVB to join automatically the multicast groups | 0 | 0 or 1 | See known problems in the README |================================================================================================================== CAM support parameters ~~~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="2,5,2,2,5",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |cam_support |Specify if we wants the support for scrambled channels | 0 | 0 or 1 | |cam_number |the number of the CAM we want to use | 0 | | In case you have multiple CAMs on one DVB card |cam_reset_interval |The time (in seconds) we wait for the CAM to be initialised before resetting it. | 30 | | If the reset is not successful, MuMuDVB will reset the CAM again after this interval. The maximum number of resets before exiting is 5 |cam_delay_pmt_send |The time (in seconds) we wait between the initialization of the CAM and the sending of the first PMT This behavior is made for some "cray" CAMs like powercam v4 which doesn't accept the PMT just after the ca_info\ _callback | 0 | | Normally this time doesn't have to be changed. |cam_interval_pmt_send |The time (in seconds) we wait between possible updates to the PMT sent to the CAM | 3 | | Normally this time doesn't have to be changed. |================================================================================================================== Autoconfiguration parameters ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="3,5,1,2,5",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |autoconfiguration |autoconfiguration 1, partial: find audio and video PIDs, 2, full: full autoconfiguration | 0 | 0, 1, 2, partial or full | see the README for more details |autoconf_ip_header |For full autoconfiguration, the first part of the ip for streamed channel | | | obsolete, use `autoconf_ip4` instead |autoconf_ip4 |For full autoconfiguration, the template for the ipv4 for streamed channel | 239.100.150+%server*10+%card.%number | | You can use expressions with `+`, `*` , `%card`, `%tuner`, `%server` and `%number` |autoconf_ip6 |For full autoconfiguration, the template for the ipv6 for streamed channel | FF15:4242::%server:%card:%number | | You can use the keywords `%card`, `%tuner`, `%server` and `%number` |autoconf_radios |Do we consider radios as valid channels during full autoconfiguration ? | 0 | 0 or 1 | |autoconf_scrambled |Do we consider scrambled channels valid channels during full autoconfiguration ? | 0 | 0 or 1 | Automatic when cam_support=1. Sometimes a clear channel can be marked as scrambled. This option allows you to bypass the ckecking. |autoconf_pid_update |Do we follow the changes in the PIDs when the PMT is updated ? | 1 | 0 or 1 | |autoconf_unicast_start_port |The unicast port for the first discovered channel | | | `autoconf_unicast_start_port=value` is equivalent to `autoconf_unicast_port=value + %number` |autoconf_unicast_port |The unicast port for each discovered channel (autoconf full). Ex "2000+%number" | | | You can use expressions with `+` `*` `%card` `%tuner` `%server` and `%number`. Ex : `autoconf_unicast_port=2000+100*%card+%number` |autoconf_multicast_port |The multicast port for each discovered channel (autoconf full). Ex "2000+%number" | | | You can use expressions with `+` `*` `%card` `%tuner` `%server` and `%number`. Ex : `autoconf_unicast_port=2000+100*%card+%number` |autoconf_sid_list | If you don't want to configure all the channels of the transponder in full autoconfiguration mode, specify with this option the list of the service ids of the channels you want to autoconfigure. | empty | | |autoconf_name_template | The template for the channel name, ex `%number-%name` | empty | | See README for more details |================================================================================================================== SAP announces parameters ~~~~~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="2,6,1,2,5",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |sap | Generation of SAP announces | 0 (1 if full autoconfiguration) | 0 or 1 | |sap_organisation |Organisation field sent in the SAP announces | MuMuDVB | | Optionnal |sap_uri |URI field sent in the SAP announces | | | Optionnal |sap_sending_ip4 |The SAP sender IPv4 address | 0.0.0.0 | | Optionnal, not autodetected, if set, enable RFC 4570 SDP Source Filters field |sap_sending_ip6 |The SAP sender IPv6 address | :: | | Optionnal, not autodetected, if set, enable RFC 4570 SDP Source Filters field |sap_interval |Interval in seconds between sap announces | 5 | positive integers | |sap_default_group | The default playlist group for sap announces | | string | Optionnal. You can use the keyword %type, see README |sap_ttl |The TTL for the multicast SAP packets | 255 | | The RFC 2974 says "SAP announcements ... SHOULD be sent with an IP time-to-live of 255 (the use of TTL scoping for multicast is discouraged [RFC 2365])." |================================================================================================================== HTTP unicast parameters ~~~~~~~~~~~~~~~~~~~~~~~ [width="80%",cols="2,8,1,5",options="header"] |================================================================================================================== |Parameter name |Description | Default value |Comments |unicast |Set this option to one to activate HTTP unicast | 0 | see the README for more details |ip_http |the listening ip for http unicast, if you want to listen to all interfaces put 0.0.0.0 | 0.0.0.0 | see the README for more details |port_http | The listening port for http unicast | 4242 | You can use mathematical expressions containing integers, * and +. You can use the %card, `%tuner` and %server template. Ex `port_http=2000+%card*100` |unicast_consecutive_errors_timeout | The timeout for disconnecting a client wich is not responding | 5 | A client will be disconnected if no data have been sucessfully sent during this interval. A value of 0 deactivate the timeout (unadvised). |unicast_max_clients | The limit on the number of connected clients | 0 | 0 : no limit. |unicast_queue_size | The maximum size of the buffering when writting to a client fails | 512kBytes | in Bytes. |================================================================================================================== [[channel_parameters]] Channel parameters ------------------ Each channel start with an `ip=` or `channel_next` line. The only other mandatory parameter is the `name` of the channel. Concerning the PIDs see the <> section [width="80%",cols="2,8,1,1,3",options="header"] |================================================================================================================== |Parameter name |Description | Default value | Possible values | Comments |ip |multicast (can also be unicast, in raw UDP ) ipv4 where the chanel will be streamed | | | Optionnal if you set multicast=0 (if not used you must use channel_next) |ip6 |multicast (can also be unicast, in raw UDP ) ipv6 where the chanel will be streamed | | | Optionnal if you set multicast=0 |port | The port | 1234 or common_port | | Ports below 1024 needs root rights. |unicast_port | The HTTP unicast port for this channel | | | Ports below 1024 needs root rights. You need to activate HTTP unicast with `ip_http` |sap_group |The playlist group for SAP announces | | string | optionnal |cam_pmt_pid |Only for scrambled channels. The PMT PID for CAM support | | | |service_id |The service id (program number), olny for autoconfiguration, or rewrite (PAT or SDT) see README for more details | | | |name | The name of the channel. Will be used for /var/run/mumudvb/channels_streamed_adapter%d_tuner%d, logging and SAP announces | | | Mandatory |pids | The PIDs list, separated by spaces | | | some pids are always sent (PAT CAT EIT SDT TDT NIT), see README for more details |================================================================================================================== [[getpids]] Get the PID numbers ------------------- The simplest way is to use autoconfiguration and modify the generated configuration file : `/var/run/mumudvb/mumudvb_generated_conf_card%d_tuner%d` You use autoconfiguration ~~~~~~~~~~~~~~~~~~~~~~~~~ If you use full autoconfiguration, you don't need to specify any channel and don't need any PID, this section does not concern you. If you use partial autoconfiguration, you'll need the PMT PID for each channel. You do not use autoconfiguration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you don't use autoconfiguration (see the README), you have to get the PIDs (Program Identifier) for each channel. For each channel it is advised to specify at least : - One video PID (except for radios) - One audio PID - The PMT PID - The PCR PID (if different from video/audio) If you don't have access to the PIDs via a website like http://www.kingofsat.net[King Of Sat], the easiest way is to use linuxtv's dvb-apps or w_scan. You don't know on wich frequency to tune and the channels you can receive. In this case, you can use <> or using <> from dvb-apps if you have an initial tuning config file. [[w_scan]] Using w_scan to get an initial tuning file ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [NOTE] w_scan works for DVB-T, DVB-C, DVB-S/S2 and ATSC. You can find wscan in the http://wirbel.htpc-forum.de/w_scan/index2.html[w_scan website - German] or http://wirbel.htpc-forum.de/w_scan/index_en.html[w_scan website - English translation]. w_scan have one disavantage over dvb-apps scan: it takes (usually) more time. But it have several advantages: no need for initial tuning file, card autodection and deeper channel search. Once you compiled it (optionnal for x86), launch it with the options needed (country is mandatory for terrestrial and cable. for DVB-S/S2 you need to specify your satellite) [NOTE] Here's the main options for w_scan -------------------------------------------------------------- -f type frontend type What programs do you want to search for? a = atsc (vsb/qam) c = cable s = sat t = terrestrian [default] -c choose your country here: DE, GB, US, AU, .. ? for list -s choose your satellite here: S19E2, S13E0, S15W0, .. ? for list -------------------------------------------------------------- For more information, see w_scan's help Your will get lines channels with the file format described http://www.vdr-wiki.de/wiki/index.php/Vdr%285%29#CHANNELS[here] If you want to use full autoconfiguration, this contains all the parameters you need. For example the second row is the frequency. [[scan_inital_tuning]] Using scan with an initial tuning file ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [NOTE] With satellite this allow you to find all the frequencies (if the broadcaster follow the norm). Because, every transponder announces the others. If you don't know where to find the inital tuning file, recent versions of scan give the default locations by calling scan without arguments. You need `scan` from linuxtv's dvb-apps Type -------------------------------------------------------- scan -o pids pathtoyourinitialtuningfile -------------------------------------------------------- You'll first get blocks like ---------------------------------------------------------------------------------------------------------------- >>> tune to: 514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE 0x0000 0x7850: pmt_pid 0x0110 Barcelona TV -- Barcelona TV (running) 0x0000 0x7851: pmt_pid 0x0710 COM Radio -- COM Radio (running) 0x0000 0x7855: pmt_pid 0x0210 TV L'Hospitalet -- TV L'Hospitalet (running) 0x0000 0x7856: pmt_pid 0x0510 Radio Hospitalet -- Radio Hospitalet (running) 0x0000 0x785a: pmt_pid 0x0310 Televisio Badalona -- Televisio Badalona (running) 0x0000 0x785b: pmt_pid 0x0610 Radio Ciutat Badalona -- Radio Ciutat Badal ---------------------------------------------------------------------------------------------------------------- You have now acces to the PMT PID (in hexadecimal), you can convert it to decimal and use partial autoconfiguration. After this blocks, you'll get lines like ---------------------------------------------------------------------------------------------------------------- Sensacio FM (0x273f) 02: PCR == A A 0x0701 urBe TV (0x7864) 01: PCR == V V 0x0300 A 0x0301 (cat) Canal Catala Barcelona (0x7869) 01: PCR == V V 0x0200 A 0x0201 (cat) 25 TV (0x786e) 01: PCR == V V 0x0400 A 0x0401 (spa) TT 0x0402 ONDA RAMBLA PUNTO RADIO (0x786f) 02: PCR == A A 0x0601 (cat) Localia (0x7873) 01: PCR == V V 0x0100 A 0x0101 ONA FM (0x7874) 02: PCR == A A 0x0501 TV3 (0x0321) 01: PCR == V V 0x006f A 0x0070 (cat) 0x0072 (vo) 0x0074 (ad) TT 0x0071 AC3 0x0073 SUB 0x032b ---------------------------------------------------------------------------------------------------------------- You have now acces to the other PIDs MuMuDVB wants the PIDs in decimal, so you have to convert the pids from hexadecimal to decimal. Scan only one transponder ^^^^^^^^^^^^^^^^^^^^^^^^^ You first have to tune the card on the wanted frequency (with `tune`, `szap` or `tzap` for example). After you use the scan utility: ---------------------- scan -o pids -c -a 0 ---------------------- Where 0 is the card number And you'll get results like in the section <> mumudvb-1.7.1/doc/TODO000066400000000000000000000005231177353207000144410ustar00rootroot00000000000000 * HTTP unicast * Master connection not mandatory, option unicast=1 * Autoconfiguration * make the syntax autoconfiguration=1/2 obsolete and replace by full/partial * In partial autoconfiguration, add a step for channels with a service ID and no PMT (this step will be skipped in full autoconf since we get both automatically) mumudvb-1.7.1/doc/TRANSCODE.txt000066400000000000000000000524311177353207000160410ustar00rootroot00000000000000MuMuDVB - README for the configuration of the transcoding ========================================================= General information ------------------- Compiling MuMuDVB with transcoding support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In order to compile MuMuDVB with transcoding you will need the following librairies: libavcodec, libavformat and libswscale Then you have to add the --enable-transcoding flag to your configure. Ex: `./configure --enable-transcoding` Check at the end of the configure that the transcoding is effectively enabled. If not there is probably a library missing. Using transcoding ~~~~~~~~~~~~~~~~~ For transconding the stream you have to make a choice for three different parameters : - The video Codec (and it's encoding parameters) - The audio Codec (and it's encoding parameters) - The container (how the audio and video data are mixed together) Future developments for transcoding ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Making it work with unicast, in particular RTSP Common problems ~~~~~~~~~~~~~~~ Data queue is full. ^^^^^^^^^^^^^^^^^^^ If you get the message `Data queue is full`, this usually means that your system is too slow to transcode what you asked. Ie the video data arrives faster that your ability to transcode it. Codec not found ^^^^^^^^^^^^^^^ If you get a message like `Couldn't find video encoder.` or `Couldn't find audio encoder.` this means that you don't have the codec you asked for installed on your system. You can check if you made a typo in the codec name by <>. If the codec is really missing there is several solutions: - Install extra codecs (libavcodec-extra-* on debian/ubuntu) - On debian, due to licence restrictions, you could try to install ffmpeg from the debian-multimedia repositories - Compile ffmpeg yourself Broken ffmpeg default settings detected ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you get a message saying "Broken ffmpeg default settings detected" Adding the following options to your transcoding configuration will make it work ------------------------------ transcode_me_range=16 transcode_qdiff=4 transcode_qmin=10 transcode_qmax=51 ------------------------------ The untranscoded stream is still sent ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For avoiding the original stream to be also sent, use the transcode_send_transcoded_only option Placement of the options ~~~~~~~~~~~~~~~~~~~~~~~~ All the transcoding configuration concerning a channel has to come just after the channel it concerns. If you define some transcoding option before any channel, this configuration will be common to all channels. [[list_codecs]] Listing the available codecs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To see the installed codecs on your system run MuMuDVB in verbose mode (one -v on the command line) with transcoding enabled and configured (ie transcode_enable=1). The available codecs will be displayed on the log output after the initialisation of avlibs. Otherwise you can use the `ffmpeg -codecs` command (see `man ffmpeg` for more information on this command). If your ffmpeg is not sufficiently recent, you can use `ffmpeg -formats` which will give you a clue. Transcode and autoconfiguration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Transcoding should work with autoconfiguration, please report any problem. Templates ~~~~~~~~~ You can use templates for the following options : - transcode_sdp_filename - transcode_ffm_url - transcode_rtp_port In the case of *transcode_rtp_port* you can use mathematical expressions like "transcode_rtp_port=1000+%server*100+%number*2" The allowed templates are: `%server`, `%card`, `%tuner` and `%number`; Examples -------- See the examples in the `doc/transcode/examples` directory Options ------- transcode_enable ~~~~~~~~~~~~~~~~ *Type:* *Description:* enables or disables transcoding *Possible Values:* 0 - disable (default); 1 - enable. transcode_send_transcoded_only ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* Send only the transcoded stream *Possible Values:* 0 - send both (default); 1 - send only the transcoded stream. transcode_video_codec ~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* video codec for encoding *Possible Values:* mpeg4 (for MPEG-4), libx264 (for H.264) etc. transcode_audio_codec ~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* audio codec for encoding *Possible Values:* libmp3lame (for MP3), libfaac (for AAC) etc. transcode_streaming_type ~~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* streaming type *Possible Values:* * mpegts - for MPEG-2 TS streaming. * rtp - for RTP streaming. * ffm - FFM feed to ffserver transcode_ffm_url ~~~~~~~~~~~~~~~~~ *Type:* *Description:* URL of FFM feed (required for FFM streaming) *Allowed templates:* `%number`, `%card`, `%tuner` and `%server` transcode_rtp_port ~~~~~~~~~~~~~~~~~~ *Type:* *Description:* base port for RTP streaming Each RTP stream (audio or video) must go on an even port. MuMuDVB will took for each media stream next even port starting from value specified in this option. *Allowed templates:* `%number`, `%card`, `%tuner` and `%server`. You can use operations `*` and `+` like "transcode_rtp_port=1000+%server*100+%number*2" transcode_sdp_filename ~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* path to generated SDP file (for RTP streaming) *Allowed templates:* `%number`, `%card`, `%tuner` and `%server` transcode_video_scale ~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* factor for video scaling transcode_video_frames_per_second ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* FPS of output video transcode_audio_channels ~~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* number of output audio channels Common values are: 1 - mono 2 - stereo transcode_audio_sample_rate ~~~~~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* output audio sample rate Common values are: 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 transcode_aac_latm ~~~~~~~~~~~~~~~~~~ *Type:* *Description:* enable LATM payload type for AAC streams while RTP streaming *Possible Values:* * 0 - disable (default) * 1 - enable transcode_aac_profile ~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* profile in case of AAC audio encoding *Possible Values:* * low - Low Complexity (LC) - the simplest and most widely used and supported. * main - Main Profile (MAIN) - like the LC profile, with the addition of backwards prediction. * ssl - Sample-Rate Scalable (SRS) - a.k.a. Scalable Sample Rate (MPEG-4 AAC-SSR). * ltp - Long Term Prediction (LTP) - added in the MPEG-4 standard an improvement of the MAIN profile using a forward predictor with lower computational complexity. transcode_video_bitrate ~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* set video bitrate (int bits/s) Enables target bitrate mode for video. Attempts to reach a specific bitrate. Bitrate mode is generally the worst ratecontrol mode H.264 has. transcode_audio_bitrate ~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* set audio bitrate (int bits/s) Enables target bitrate mode for audio. transcode_x264_profile ~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* set H.264 encoding profile *Possible Values:* * baseline - Baseline Profile This is equivalent to : ----------------------------------- transcode_coder_type=0 transcode_enable_8x8dct=0 transcode_loop_filter=1 transcode_sc_threshold=1 transcode_x264_partitions=1 transcode_video_codec=libx264 ----------------------------------- * main - Main Profile This is equivalent to : ----------------------------------- transcode_coder_type=1 transcode_enable_8x8dct=0 transcode_loop_filter=1 transcode_sc_threshold=1 transcode_x264_partitions=1 transcode_video_codec=libx264 ----------------------------------- * high - High Profile This is equivalent to : ----------------------------------- transcode_coder_type=1 transcode_enable_8x8dct=1 transcode_loop_filter=1 transcode_sc_threshold=1 transcode_x264_partitions=1 transcode_video_codec=libx264 ----------------------------------- [NOTE] Specify different video encoding options after declaration of transcode_x264_profile may change profile to higher one. For example option "transcode_enable_8x8dct=1" will enable 8x8 transform that is supported only by High Profile. transcode_level ~~~~~~~~~~~~~~~ *Type:* *Description:* set level of encoding Example values: 10 for level 1.0 11 for level 1.1 12 for level 1.2 20 for level 2.0 21 for level 2.1 30 for level 3.0 etc. transcode_x264_partitions ~~~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* enables best use of partitions for H.264 *Possible Values:* * 0 - disable * 1 - enable Reccomended default to enable it for H.264. FFmpeg equivalent: partitions +parti4x4+parti8x8+partp8x8+partb8x8 One of H.264's most useful features is the ability to choose among many combinations of inter and intra partitions. P-macroblocks can be subdivided into 16x8, 8x16, 8x8, 4x8, 8x4, and 4x4 partitions. B-macroblocks can be divided into 16x8, 8x16, and 8x8 partitions. I-macroblocks can be divided into 4x4 or 8x8 partitions. Analyzing more partition options improves quality at the cost of speed. The default is to analyze all partitions except p4x4 (p8x8, i8x8, i4x4, b8x8), since p4x4 is not particularly useful except at high bitrates and lower resolutions. Note that i8x8 requires 8x8dct, and is therefore a High Profile-only partition. p8x8 is the most costly, speed-wise, of the partitions, but also gives the most benefit. Generally, whenever possible, all partition types except p4x4 should be used. transcode_loop_filter ~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* enables loop filter *Possible Values:* * 0 - disable * 1 - enable Reccomended default to enable it for H.264. transcode_mixed_refs ~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* one reference per partition, as opposed to one reference per macroblock *Possible Values:* * 0 - disable * 1 - enable H.264 allows p8x8 blocks to select different references for each p8x8 block. This option allows this analysis to be done, and boosts quality with little speed impact. It should generally be used, though it obviously has no effect with only one reference frame. transcode_enable_8x8dct ~~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* high profile 8x8 transform (H.264) *Possible Values:* * 0 - disable * 1 - enable Gives a notable quality boost by allowing x264 to choose between 8x8 and 4x4 frequency transform size. Required for i8x8 partitions. Speed cost for this option is near-zero both for encoding and decoding; the only reason to disable it is when one needs support on a device not compatible with High Profile. transcode_gop ~~~~~~~~~~~~~ *Type:* *Description:* set the group of picture size Keyframe interval, also known as GOP length. This determines the maximum distance between I-frames. Very high GOP lengths will result in slightly more efficient compression, but will make seeking in the video somewhat more difficult. For H.264 recommended default: 250. transcode_b_frames ~~~~~~~~~~~~~~~~~~ *Type:* *Description:* use 'frames' B frames B-frames are a core element of H.264 and are more efficient in H.264 than any previous standard. Some specific targets, such as HD-DVD and Blu-Ray, have limitations on the number of consecutive B-frames. Most, however, do not; as a result, there is rarely any negative effect to setting this to the maximum (16) since x264 will, if B-adapt is used, automatically choose the best number of B-frames anyways. This parameter simply serves to limit the max number of B-frames. Note that Baseline Profile, such as that used by iPods, does not support B-frames. Recommended default for H.264: 16. transcode_mbd ~~~~~~~~~~~~~ *Type:* *Description:* macroblock decision algorithm (high quality mode) *Possible Values:* * 0 - simple - use mbcmp (default) * 1 - bits - use fewest bits * 2 - rd - use best rate distortion *FIXME* enables high quality mode for MPEG-4 compression. transcode_cmp ~~~~~~~~~~~~~ *Type:* *Description:* full pel me compare function *Possible Values:* * 0 - sad - sum of absolute differences, fast (default) * 1 - sse - sum of squared errors * 2 - satd - sum of absolute Hadamard transformed differences * 3 - dct - sum of absolute DCT transformed differences * 4 - psnr - sum of squared quantization errors (avoid, low quality) * 5 - bit - number of bits needed for the block * 6 - rd - rate distortion optimal, slow * 7 - zero - 0 * 8 - vsad - sum of absolute vertical differences * 9 - vsse - sum of squared vertical differences * 10 - nsse - noise preserving sum of squared differences * 11 - w53 - 5/3 wavelet, only used in snow * 12 - w97 - 9/7 wavelet, only used in snow * 13 - dctmax - * 14 - dct264 - * 256 - chroma - *FIXME* Used in MPEG-4 compression transcode_subcmp ~~~~~~~~~~~~~~~~ *Type:* *Description:* sub pel me compare function *Possible Values:* * 0 - sad - sum of absolute differences, fast (default) * 1 - sse - sum of squared errors * 2 - satd - sum of absolute Hadamard transformed differences * 3 - dct - sum of absolute DCT transformed differences * 4 - psnr - sum of squared quantization errors (avoid, low quality) * 5 - bit - number of bits needed for the block * 6 - rd - rate distortion optimal, slow * 7 - zero - 0 * 8 - vsad - sum of absolute vertical differences * 9 - vsse - sum of squared vertical differences * 10 - nsse - noise preserving sum of squared differences * 11 - w53 - 5/3 wavelet, only used in snow * 12 - w97 - 9/7 wavelet, only used in snow * 13 - dctmax - * 14 - dct264 - * 256 - chroma - *FIXME* Used in MPEG-4 compression transcode_crf ~~~~~~~~~~~~~ *Type:* *Description:* enables constant quality mode, and selects the quality (H.264 only) Constant quality mode (also known as constant ratefactor). Bitrate corresponds approximately to that of constant quantizer, but gives better quality overall at little speed cost. The best one-pass option in H.264. transcode_refs ~~~~~~~~~~~~~~ *Type:* *Description:* reference frames to consider for motion compensation (H.264 only) One of H.264's most useful features is the abillity to reference frames other than the one immediately prior to the current frame. This parameter lets one specify how many references can be used, through a maximum of 16. Increasing the number of refs increases the DPB (Decoded Picture Buffer) requirement, which means hardware playback devices will often have strict limits to the number of refs they can handle. In live-action sources, more reference have limited use beyond 4-8, but in cartoon sources up to the maximum value of 16 is often useful. More reference frames require more processing power because every frame is searched by the motion search (except when an early skip decision is made). The slowdown is especially apparent with slower motion estimation methods. Recommended default for H.264: 6. transcode_b_strategy ~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* strategy to choose between I/P/B-frames libx264, by default, adaptively decides through a low-resolution lookahead the best number of B-frames to use. It is possible to disable this adaptivity; this is not recommended. Recommended default for H.264: 1 0: Very fast, but not recommended. Does not work with pre-scenecut (scenecut must be off to force off b-adapt). 1: Fast, default mode in libx264. A good balance between speed and quality. 2: A much slower but more accurate B-frame decision mode that correctly detects fades and generally gives considerably better quality. Its speed gets considerably slower at high bframes values, so its recommended to keep bframes relatively low (perhaps around 3) when using this option. It also may slow down the first pass of libx264 when in threaded mode. transcode_coder_type ~~~~~~~~~~~~~~~~~~~~ *Type:* *Possible Values:* * 0 = vlc variable length coder / huffman coder * 1 = ac/CABAC arithmetic coder * 2 = raw raw (no encoding) * 3 = rle run-length coder * 4 = deflate deflate-based coder CABAC is the default entropy encoder used by x264. Though somewhat slower on both the decoding and encoding end, it offers 10-15% improved compression on live-action sources and considerably higher improvements on animated sources, especially at low bitrates. It is also required for the use of trellis quantization. Disabling CABAC may somewhat improve decoding performance, especially at high bitrates. CABAC is not allowed in Baseline Profile. transcode_me_method ~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* set motion estimation method *Possible Values:* * 1 - zero - zero motion estimation (fastest) * 2 - full/esa - full motion estimation (slowest) * 3 - log - log motion estimation * 4 - phods - phods motion estimation * 5 - epzs/dia - EPZS motion estimation (default) * 6 - x1 - X1 motion estimation * 7 - hex - hex motion estimation (x264 specific) * 8 - umh - umh motion estimation (x264 specific) * 9 - iter - iter motion estimation (snow specific) * 10 - tesa - tesa motion estimation (x264 specific) One of the most important settings for x264, both speed and quality-wise. epzs - is the simplest search, consisting of starting at the best predictor, checking the motion vectors at one pixel upwards, left, down, and to the right, picking the best, and repeating the process until it no longer finds any better motion vector. hex - consists of a similar strategy, except it uses a range-2 search of 6 surrounding points, thus the name. It is considerably more efficient than DIA and hardly any slower, and therefore makes a good choice for general-use encoding. umh - is considerably slower than HEX, but searches a complex multi-hexagon pattern in order to avoid missing harder-to-find motion vectors. Unlike HEX and DIA, the merange parameter directly controls UMH's search radius, allowing one to increase or decrease the size of the wide search. full - is a highly optimized intelligent search of the entire motion search space within merange of the best predictor. It is mathematically equivalent to the bruteforce method of searching every single motion vector in that area, though faster. However, it is still considerably slower than UMH, with not too much benefit, so is not particularly useful for everyday encoding. transcode_me_range ~~~~~~~~~~~~~~~~~~ *Type:* *Description:* limit motion vectors range MErange controls the max range of the motion search. For HEX and DIA, this is clamped to between 4 and 16, with a recommended of 16. For UMH and ESA, it can be increased beyond the 16 to allow for a wider-range motion search, which is useful on HD footage and for high-motion footage. Note that for UMH and ESA, increasing MErange will significantly slow down encoding. transcode_subq ~~~~~~~~~~~~~~ *Type:* *Description:* sub pel motion estimation quality An extremely important encoding parameter for H.264 which determines what algorithms are used for both subpixel motion searching and partition decision. 1: Fastest, but extremely low quality. Should be avoided except on first pass encoding. 2-5: Progressively better and slower, 5 serves as a good medium for higher speed encoding. 6-7: 6 is the default. Activates rate-distortion optimization for partition decision. This can considerably improve efficiency, though it has a notable speed cost. 6 activates it in I/P frames, and subme7 activates it in B frames. 8-9: Activates rate-distortion refinement, which uses RDO to refine both motion vectors and intra prediction modes. Slower than subme 6, but again, more efficient. transcode_trellis ~~~~~~~~~~~~~~~~~ *Type:* *Description:* rate-distortion optimal quantization *Possible Values:* * 0 - disabled * 1 - enabled only on the final encode of a MB * 2 - enabled on all mode decisions The main decision made in quantization is which coefficients to round up and which to round down. Trellis chooses the optimal rounding choices for the maximum rate-distortion score, to maximize PSNR relative to bitrate. This generally increases quality relative to bitrate by about 5% for a somewhat small speed cost. It should generally be enabled. Note that trellis requires CABAC. transcode_sc_threshold ~~~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* scene change threshold Adjusts the sensitivity of x264's scenecut detection. Rarely needs to be adjusted. Recommended default for H.264: 40. transcode_rc_eq ~~~~~~~~~~~~~~~ *Type:* *Description:* set rate control equation Ratecontrol equation. Recommended default for H.264: 'blurCplx^(1-qComp)'. transcode_qcomp ~~~~~~~~~~~~~~~ *Type:* *Description:* video quantizer scale compression QP curve compression: 0.0 => CBR, 1.0 => CQP. Recommended default for H.264: 0.60. transcode_qmin ~~~~~~~~~~~~~~ *Type:* *Description:* min video quantizer scale Minimum quantizer. Recommended default for H.264: 10. transcode_qmax ~~~~~~~~~~~~~~ *Type:* *Description:* max video quantizer scale Maximum quantizer. Recommended default for H.264: 51. transcode_qdiff ~~~~~~~~~~~~~~~ *Type:* *Description:* max difference between the quantizer scale Set max QP step. Recommended default: 4. transcode_keyint_min ~~~~~~~~~~~~~~~~~~~~ *Type:* *Description:* key interval mumudvb-1.7.1/doc/WEBSERVICES.txt000066400000000000000000000236761177353207000163110ustar00rootroot00000000000000Webservices =========== Sebastien RAILLARD To activate the webservices, just enable the unicast mode with something like that: ---------------- unicast=1 : Activate the internal webserver ip_http=127.0.0.1 : IP address for accepting the HTTP requests port_http=8005 : Listening port ---------------- The webservices responses are not SOAP compliant, but formatted in simple XML documents (UTF-8). The output can be easily parsed in PHP for example. Status monitoring : --------------------- There is no input parameters. URL : http://ip_http:port_http/monitor/state.xml Example of response with comments: ---------------- => adapter and frontend devices => MuMuDVB version 19574 => process PID 45 => process uptime in seconds => frontend name 1 => 0 if adapter not tuned, 1 if adapter is tuned 11856000 => tuning frequency (always in kHz) => "-" if polarization isn't applicable, or "V" (Vertical), "H" (Horizontal", "L" (Left), "R" (Right) 27500000 => Satellite symbole rate in symbols per second (or 0 if not applicable) => System used : "DVB-C", "DVB-T", "DVB-S", "DVB-S2", "ATSC" => Tuner lock status: "S"/"-" (Signal), "C"/"-" (Carrier), "V"/"-" (Viterbi), "Y"/"-" (Synchro), "L"/"-" (Locked) 0 => RAW BER value from driver (unsigned 16-bits integer) 56955 => RAW Signal level value from driver (unsigned 16-bits integer) 54759 => RAW Signal to noise ratio from driver (unsigned 16-bits integer) 1 => 0 if not autoconfiguration or autoconfiguration in progress, 1 if autoconfiguration is finished 1 => 0 if no CAM support asked, 1 if CAM support was asked 0 => CAM slot number => When CAM is initialized, CAM model 0 => 0 if CAM isn't initialized, 1 if CAM is initialized => Loop over channels, one node per channel, with MuMuDVB internal id (starting at 1) 0 => If present, Channel Logical Number (Channel number) => Channel name => See function "service_type_to_str" in "log.c" file for complete description => Multicast IP address (0.0.0.0 if multicast is disabled) 0 => Multicast UDP port (0 if multicast is disabled) 0 => 0 if channel is not streamed, 1 if channel is streamed 7 => Channel streamed IP bandwidth in kB (kilo-Bytes) per second 99 => Percentage of scrambled packets received 8201 => Service ID of channel 1280 => PMT PID of channel 0 => Unicast port associated with the channle if unicast is setup by port => Loop over all the CA systems listed in the PMT for the channel => CA identifier and description if avaliable => End of CA systems loop => Loop over all PID related to the channel and declared in the PMT => PID number, Language associated (or "---" if no language associated), PID description if avaliable => End of PID loop => End of channels loop => End of response ---------------- Access to the CAM menu: ------------------------- These two webservices allow for accessing the CAM menu during streaming. This is usefull for checking rights or download status for example. The file `cam_menu.php` is a simple demonstration on how to use these webservices in order to make a web interface with AJAX compatible with the most important browsers (Firefox, Chrome, Internet Explorer). For using it, you just need a webserver (lighttpd, apache, etc.) with PHP activated. The web page accept one GET parameter: `port_server`. This is the unicast port setup for accessing MuMuDVB webservices. The CAM menu is refresded every 2 seconds and buttons can be used to navigate in the menus. MENU, LIST and ENQUIRY MMI objects are supported. * First webservice return the latest menu returned by the CAM. There is no input parameters. URL : http://ip_http:port_http/cam/menu.xml Below, some examples of response with comments. Case when the CAM isn't initialized: ---------------- => Last update time/date => No object to show <![CDATA[CAM not initialized!]]> => Message about CAM not initialized ---------------- Case when the CAM is initialized but there is no menu to display: ---------------- => Last update time/date => CAM model => No object to show <![CDATA[No menu to display]]> => Message about no menu to display ---------------- Case when a object is send by the CAM to be displayed: ---------------- => When the object was received => CAM model => Object: "MENU", "LIST" or "ENQUIRY" <![CDATA[Module Aston]]> => Object title => Object subtitle (when an "ENQUIRY" object is display, show the number of characters expected in the answer) => For "MENU" and "LIST" objects, contain the lines of information or the items to be choosen. The "num" attribute correspond to the key to press to choose the item. => Object bottom line ---------------- * Second webservice allows for sending response to the CAM. There is one integer GET paramter: `key`. Possible keys: `0` to `9` (numbers), `M` for asking the CAM menu, `C` for cancelling an `ENQUIRY` object. URL : http://ip_http:port_http/cam/action.xml?key=X There are 4 king of responses. OK: ---------------- ---------------- Unknown key: ---------------- ---------------- CAM not initialized: ---------------- ---------------- MuMuDVB compiled without CAM support: ---------------- ---------------- mumudvb-1.7.1/doc/cam_menu.php000066400000000000000000000200231177353207000162430ustar00rootroot000000000000000 && ($query==1 || ($query==2 && $key!=""))) { // XML proxy reply header('Content-Type: application/xml; charset=UTF-8'); if ($query==1) $url="http://localhost:".strval($port_server)."/cam/menu.xml"; if ($query==2) $url="http://localhost:".strval($port_server)."/cam/action.xml?key=".$key; $cmdline="wget -T 1 -O - '".$url."'"; passthru ($cmdline,$error); if (intval($error)!=0) echo("wget error ".$error.""); die(); } else { // HTML page header('Content-type: text/html; charset="utf-8"'); // HTML en UTF-8 } ?> CAM Menu Management

CAM Management

0) echo('

Mumudvb HTTP port number : '.$port_server.'

'); else echo('

Mumudvb HTTP port number : (>0)

'); ?>

CAM Menu

Status: Not yet loaded

No menu to display

CAM actions

Status: No key sent

mumudvb-1.7.1/doc/configuration_examples/000077500000000000000000000000001177353207000205165ustar00rootroot00000000000000mumudvb-1.7.1/doc/configuration_examples/autoconf_full.conf000066400000000000000000000042521177353207000242300ustar00rootroot00000000000000#This is an example configuration file for mumudvb using full autoconfiguration #All the commented lines are optionnal (except for tuning you have to match your system) #If you want to set HTTP unicast, see the README and the README_CONF #------------ TUNING ------------- #The DVB/ATSC card we want to use #card=2 #The Transponder frequency freq=11137 # ---- SATELLITE (DVB-S) ----- #The polarisation (can be h, v, l, r) pol=h #The symbol rate srate=27500 # ----- CABLE (DVB-C) ---- #The symbol rate #srate=27500 # ---- TERRESTRIAL (DVB-T) ----- #For DVB-T if the bandwith is 8MHz you don't have to set other parameters # # ----- ATSC ---- #For ATSC you could have to set the modulation if it's different from VSB_8 # #---------- AUTOCONFIGURATION ----------- #We want the full autoconfiguration (ie we discover the channels and their pids) autoconfiguration=full #Do we want to add the radios to the list of channels (default 0) ? #autoconf_radios=1 #Do we want to configure channels marked as scrambled (automatically done if cam_support=1) #autoconf_scrambled=1 # #--------- NETWORKING -------------- #What is the "ip header"? #The autoconfigured multicast ip have the form header.card.channelnumber #The default header is 239.100 #autoconf_ip_header=239.10 # #Do we want to change the default port (optionnal) ? #common_port=4422 # #Do we need to change the default multicast TTL (if you have routers, default value : 2) ? #multicast_ttl=10 # #--------- SAP ANNOUNCES -------------- #The sap announces are sent automatically with full autoconfiguration #Do we want NOT to send the announces ? #sap=0 # #What is the default playlist group for the SAP announces (optionnal) ? sap_default_group=My channels #Who is the organisation wich send the stream (optionnal) ? #sap_organisation=my_organisation #The intervall between the SAP announces in second (default 5) #sap_interval=10 # ---------- PAT REWRITING ---------- #If some of the clients are set top boxes we will probably need to rewrite the PAT pid #rewrite_pat=1 # # ---------- SCRAMBLED CHANNELS ---------- #Do we want hadware descrambling ? #cam_support=1 # #If you have multiple CAMs you can specify the number of the one wich will be used #cam_number=2 mumudvb-1.7.1/doc/configuration_examples/autoconf_partial.conf000066400000000000000000000047771177353207000247360ustar00rootroot00000000000000#This is an example configuration file for mumudvb using partial autoconfiguration and sending sap announces #All the commented lines are optionnal (except for tuning you have to match your system) #To set unicast HTTP refer to README_CONF and README # #------------ TUNING ------------- #The DVB/ATSC card we want to use #card=2 #The Transponder frequency freq=12597 # ---- SATELLITE (DVB-S) ----- #The polarisation (can be h, v, l, r) pol=V #The symbol rate srate=27500 # ----- CABLE (DVB-C) ---- #The symbol rate #srate=27500 # ---- TERRESTRIAL (DVB-T) ----- #For DVB-T if the bandwith is 8MHz you don't have to set other parameters # # ----- ATSC ---- #For ATSC you could have to set the modulation if it's different from VSB_8 # #---------- AUTOCONFIGURATION ----------- #We want the partial autoconfiguration (ie we discover the pids of the defined channels) autoconfiguration=partial # #--------- NETWORKING -------------- #Do we want to have the same port for all the channels ? common_port=1234 # #Do we need to change the default multicast TTL (if you have routers, default value : 2) ? #multicast_ttl=10 # #--------- SAP ANNOUNCES -------------- #The sap announces are sent automatically with full autoconfiguration #Do we want to send the announces ? sap=1 # #What is the default playlist group for the SAP announces (optionnal) ? sap_default_group=My channels #Who is the organisation wich send the stream (optionnal) ? #sap_organisation=my_organisation #The intervall between the SAP announces in second (default 5) #sap_interval=10 # ---------- PAT REWRITING ---------- #If some of the clients are set top boxes we will probably need to rewrite the PAT pid #rewrite_pat=1 # # ---------- SCRAMBLED CHANNELS ---------- #Do we want hadware descrambling ? #cam_support=1 # #If you have multiple CAMs you can specify the number of the one wich will be used #cam_number=2 # # # ----------------------- THE CHANNELS --------------------- # #For each channel you have to define : # * The ip address # * The port (if you didn't used common_port) # * The name # * At least the PMT pid (if there is more than one pid, no autoconfiguration will be done for this chanel) # #Ip adress ip=239.210.203.200 #Name of the channel name=BBC World News #The PMT pid pids=1027 # # ip=239.210.203.201 name=Euronews pids=1034 # #A channel WITHOUT autoconfiguration ip=239.210.203.202 name=eng Euronews pids=1034 2221 2232 768 # #A scrambled channel, add cam_support=1 before the channel lists #ip=239.210.203.203 #name=Japan satellite TV #cam_pmt_pid=1037 #pids=1037 mumudvb-1.7.1/doc/configuration_examples/dvb-s2.conf000066400000000000000000000037411177353207000224670ustar00rootroot00000000000000#This is an example configuration file for mumudvb using full autoconfiguration #All the commented lines are optionnal (except for tuning you have to match your system) #If you want to set HTTP unicast, see the README and the README_CONF #------------ TUNING ------------- #the delivery system delivery_system=DVBS2 #The DVB card we want to use #card=2 #The Transponder frequency freq=12674 # ---- SATELLITE (DVB-S) ----- #The polarisation (can be h, v, l, r) pol=h #The symbol rate srate=16935 #the FEC coderate=2/3 #---------- AUTOCONFIGURATION ----------- #We want the full autoconfiguration (ie we discover the channels and their pids) autoconfiguration=full #Do we want to add the radios to the list of channels (default 0) ? #autoconf_radios=1 #Do we want to configure channels marked as scrambled (automatically done if cam_support=1) #autoconf_scrambled=1 # #--------- NETWORKING -------------- #What is the "ip header"? #The autoconfigured multicast ip have the form header.card.channelnumber #The default header is 239.100 #autoconf_ip_header=239.10 # #Do we want to change the default port (optionnal) ? #common_port=4422 # #Do we need to change the default multicast TTL (if you have routers, default value : 2) ? #multicast_ttl=10 # #--------- SAP ANNOUNCES -------------- #The sap announces are sent automatically with full autoconfiguration #Do we want NOT to send the announces ? #sap=0 # #What is the default playlist group for the SAP announces (optionnal) ? sap_default_group=My channels #Who is the organisation wich send the stream (optionnal) ? #sap_organisation=my_organisation #The intervall between the SAP announces in second (default 5) #sap_interval=10 # ---------- PAT REWRITING ---------- #If some of the clients are set top boxes we will probably need to rewrite the PAT pid #rewrite_pat=1 # # ---------- SCRAMBLED CHANNELS ---------- #Do we want hadware descrambling ? #cam_support=1 # #If you have multiple CAMs you can specify the number of the one wich will be used #cam_number=2 mumudvb-1.7.1/doc/configuration_examples/example.conf000066400000000000000000000043331177353207000230230ustar00rootroot00000000000000#This is an example configuration file for mumudvb with sending of sap announces #All the commented lines are optionnal (except for tuning you have to match your system) #To set HTTP unicast refer to README and README_CONF # #------------ TUNING ------------- #The DVB/ATSC card we want to use #card=2 #The Transponder frequency freq=12597 # ---- SATELLITE (DVB-S) ----- #The polarisation (can be h, v, l, r) pol=V #The symbol rate srate=27500 # ----- CABLE (DVB-C) ---- #The symbol rate #srate=27500 # ---- TERRESTRIAL (DVB-T) ----- #For DVB-T if the bandwith is 8MHz you don't have to set other parameters # # ----- ATSC ---- #For ATSC you could have to set the modulation if it's different from VSB_8 # #--------- NETWORKING -------------- #Do we want to have the same port for all the channels ? common_port=1234 # #Do we need to change the default multicast TTL (if you have routers, default value : 2) ? #multicast_ttl=10 # #--------- SAP ANNOUNCES -------------- #Do we want to send the announces ? sap=1 # #What is the default playlist group for the SAP announces (optionnal) ? sap_default_group=My channels #Who is the organisation wich send the stream (optionnal) ? #sap_organisation=my_streamed_tv #The intervall between the SAP announces in second (default 5) #sap_interval=10 # ---------- PAT REWRITING ---------- #If some of the clients are set top boxes we will probably need to rewrite the PAT pid #rewrite_pat=1 # # ---------- SCRAMBLED CHANNELS ---------- #Do we want hadware descrambling ? #cam_support=1 # #If you have multiple CAMs you can specify the number of the one wich will be used #cam_number=2 # # # ----------------------- THE CHANNELS --------------------- # #For each channel you have to define : # * The ip address # * The port (if you didn't used common_port) # * The name # * At least the PMT, Video and Audio PIDs # #Ip adress ip=239.210.203.200 #Name of the channel name=BBC World News #The PIDs pids=1027 163 92 41 # # ip=239.210.203.201 name=Euronews pids=1034 2221 2231 2232 2233 2234 2235 2236 2237 2238 2239 768 # ip=239.210.203.202 name=eng Euronews pids=1034 2221 2232 768 # #A scrambled channel, add cam_support=1 before the channel lists #ip=239.210.203.203 #name=Japan JSTV #cam_pmt_pid=1037 #pids=1037 2000 2001 2002 mumudvb-1.7.1/doc/configuration_examples/ipv6.conf000066400000000000000000000001111177353207000222420ustar00rootroot00000000000000freq=586 sap=1 multicast_ipv6=1 multicast_ipv4=0 autoconfiguration=full mumudvb-1.7.1/doc/diagrams/000077500000000000000000000000001177353207000155405ustar00rootroot00000000000000mumudvb-1.7.1/doc/diagrams/TS_add_data_all_cases.dia000066400000000000000000000137331177353207000223630ustar00rootroot00000000000000]nHກJ/q72If;@N?m6eI+Ix\oGlp̾ %EY|_-<l\\g26NQNO~lup7@GOl4_VnTʈP1T8?_0Id~ )]n "󛳋xX79 &E׸u^\]fѥE(#ոP_=UXXS$[ʿ$~;W [Çr@zr;\`rL;o!"[?eKzBga{r"'kYm0@('&_ۛ5jz^kͰ`uUs¦JU .BH5'&h`rۨ Gja!pc:eR^vb|O-/b\lKFp?y=RQ$hwvq x %;ә}_ -|ppt{x>DׂRbEv3xzxm+M 6bTQ]nV68X=mT%:aI*qRrˍLqiՑ+>RB8nd+·^2׫PT.m(dq0T0M(Ͻlr Ҍ,ra0oV)RRkgďvP!|mQ$r/Or 4[0OO㓍6.J tWԂadL}/I.HԈAD(X[UmK\ rÔs]UJhNiT@.ر. @hʄFK+}mk+7/U=j6U-h.MΠι^,}7&*H B2Kx a\*絕Nu'fys<@3̏'//;cpĉm*m~'+xfJ%SԶY;:398}QMAXK98_Әdſc>נ}2V 0Rt&J;*Ng{e&2jXG?_"Ӹ_ &F apnǏD5 "C~>𬂺F.(spmiîR'yٓ\p\VS,+ ;vb4!s_ ?1E[mA?{q{v:hbM@4,h' (+tܥl*m ga*Op8#Syzzye?Iג]flr AoJoY6TO>烫+IVE oL!ZEE x%1rC1Kk#a۠ۀbp1p.6 p+v_VD4mWjrAsN.HՒgٞn^H`llX jua]V?ʺ*r[ݴQwwG=AG"]+NQiǃ$_{AdBd\MLjMӁC2" / V .1z1"8tdE i%0aT1q9K Fu%FLo`[-r Y#5ʕBbc<ƬO`Q,z= e^u77HN޼X^k&e%e pL.PGvBri_?}|BB\dZdc}K9vWDJRm:3 -}ȿ46%#'#aj=">Fӿv*2ĥ5l.) RD0:B0a BF ((q%%%C% оײ?|B;m҆txdCU%lN/>r.IȀOJ2Iۅ42j_ǸvLD`9:g-YHB+3g|V0l6tyT윉[*$ X~:j=)n鞬)tLǤfR%s݄ZrF6SIT9Ey\?Ts=q1yes-5jcn){ħ/.ǘw\b*ZBՋ=zG#ZņmxC)D:|C&TA9a[)X5ɍC[}bw*(T@E5ih* hd"vSyRE>]?&v\.b1禕c\& ajAC0B0B0B0:0 F-у *}K>c _>K>}C~H^yGUdx"O*(lu<8Y\Xft1Fu"(#iD#AcP l}`OuaL8;pXM9RJD\:F\, a¯Cb0.BXBXZJLjJW\hA+6Dqa1\.Ud/ւ f WBܴMVAc $1oe̚lqlVoSu ^~UһEj)@A-PƱZKmd /Nȃ$ abHRDn{46>0%_=ZQOIb|{lfAr;>5Vc; U+gh#ZbXTzD}.w=m(GbgZ芼vM"D#Dܓ2)ݓSI.$+%"SRDh:FhRMDDNS!%!$U,ADu=K7`9Zm5ttl1H2Dk0%т(a1"tHˏj]pY;"Tf-%dD52E%NltS+.ʘ13ϭ(u҃vD*]c$4o^ ]Q`2P.]QOsR+4ک+jKf?jg9" ThBywA '_2 v_F& qob $&fƃLF6)v$wH![Y CjH!ۡ5@!9\ fAxgr<7:9r;qH␼)))8XB*fdֶ!kMr;bM] GF=e//_޿M7oҤ{ #6Ȥ7:%#V d%2) SaFSx2iD-KR}c%OsRK*\k&2ɟL&Ȥs:8+bɹ$!0 L֞vd҉H &oY@09Mnidd;g}5a"lH& d\gH{ DT*(e Lr<7:2I^IL:#gd$a_5VCP1x()[Xյsx̷q.U K`U+‘ `iU72-\z5V*ըwmx&Іn͆n.)):VD 渗u]lT~&cЕ\ԖJ_\d*;qAqmi z,2*o7e- Bç !6c\hEtq i];k☳q2$Y=}x^L z4QM&&i멸hKjmbfH3 f;I0Cmˣw?7Ln.#ZO &ߧ~&K4c` "#$Oܟ($d9iInr7EMTR(_SlU[qR *HLlͭkQ@ Ed,ZѾKP纀,V%C-&L4^ rxU-4~mQ]!Rpar1WQa3kS.2ldpHCZSf1rv|Jց`ndz*T0|-HOcRFT声騞 CIZt%,-L9RT41IT=-Ge~Ę]_֓sgףa0ZyݡmްȂf4y9"<#<ΒF+i.=< "1&ɴNU頓d֟@NL>Fh6ݦ>D:iREإ#@)VWQ2 jJil^_5kg!6JYĩb]! )0q5"=ds&-Cb,T$}\1D(<.϶lfEcm}wzp0Wjt8.&IVoϔݖC05FvC&> stream x[M$ȳso` >=Ltv})UfwWbfR)C )ŋb];MO<~ifǯ_'3gp>Ӝ-)ln0η!jf ~Xost`OgdVOӦֹ1 i4̶d~9a͠BKy~9g9~ܺDF/h o}o<_df`5Dfk\pYЖl#u9"O&fW OA\"U"4cX -d2kvko{W1 ^h d6C-ڗSv%Ad5=&@J*94em`W/{FMD^AL@|B6/s~Wxx ٞQyx\*,RTpaJ>VZ-Éب:{%>qK^E"`4 جcQ;0o Q=n JX gM^`#6=ޑ6EYh Oޚ~4)J[>n\؊jVAn:X~ÜC@jk~IeiLWND@=sxp eXy4&c|u:RɊ5fEl4n1j (qވn NHF ֺJL\7JH>JF*4rא6F}d\hRkS#< L$75 "9`'3 1h BbӧCh\ۇFB*rd;m4vlNdXn YX$6brP{ML)* y0&+^,jRstmЖ'1a+O.z*`GV{B l\)JBtSD|EɕȟOH)(r0OOI@q V긎n7A<9S 2.ߒ hNԉ؉À<hIXΨYBK'7#Yӯb[M v# 5ZuuyE[L($y֢ 6W 2ea+qE(E.7I:mPΑ:ؕT 6[ Y%g6%MyThy#v8.?c29:)@tY 3@d-*l rFRm>ܹS5B$jlp'GR| ê=ާ1m,'9<+=u54)UܰV!.C>yg/l ƗOJovZQ%#,T^>s^i1F& 'Qk""؝]%1x r[#!;vZ#v$?9,dw V 8B !|`4WM!LZ9~ TT(bVؤ/H̬q0XNGˀ!3t꼺͠Z4qT0R[NO(Z?ŏΊ`!,йit'hH 05rm^]KHX֦.ɇq;aH. x@A6L!E{Ki>0%``]. Y[oElOJP*scu]WoH҈[^[U;ӐՏ>` s>M`1eNTwjY@=˜c! \27OE$rt੫ڦh:m ާʨSV-ɫHZ ![XD_/+2""o tr0@)Gsr>>&- #BrڇnC>Thw]=!sI2zrƢ-Q49º%7$]sQj׷~N 17B`gzD6HWBðzRiv]}uF=xD1|R#gP9P.厩޳# K>.ѥ(#( endstream endobj 4 0 obj 3544 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 5 0 R >> >> endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 7 0 obj << /Length 8 0 R /Filter /FlateDecode /Length1 13632 >> stream xzy|U9W;ٗP4@ȨD Ĉ &q":xDpߩNs{yTwUu9*B !&)#@S4> !xn<0R,bW]B+TL!n SMFi(cLƘ6f3Ukܣp]טb79ț6n3 ] 0jӈ}ZsZoa6q=魵v!OC;DDi#:lѶzƯ}vwvY8bp> {|=‹-ॼ=6fk1UqSa(Wycl~{ II, EiFhKAogre`TyP jA}1l :αd, QNN@mM!Et*S|:]{Ęd{>9̡ b, RuVF9׶^ d]fYQݨ=3[;Nm^[ݭշ_vo(:Mg#{N(sbI64 gP'>?(0]nWjuzOP}MbI`Tt=q깾YG7@Btvkg9{v6&w㥬Ce5ᕔۅYN}ιRуa[]]Wo'vŧ޵_C6*DS_' *ux4I iE%" ';=ñIuvC%+!+ePZ0.L.q Ă.i3ӖUW$T*uYV֜u000P83~fIJ@YbDMoiFڧCIz$gG{|3uu;v7=ȄrK&>s0Oz{oyKW'-UyB؏| tr6M70Yns:-4]$Քue?L'z|_hXv78oni_Xj:c=:@zF^fnqߙ tY4A^ j覘?nɐd Xv}J+`0h.m>9)ouZ2X5z-g6/eA=k0QʦQ)iPZ;v)>{`ڔխꑯu&D)+'U+:2'u۔}n/&!&y,;q'cZ)[j_}}s~momٺ ׶ejQlGq90uΕ hØŊΡ22wf:1ENSceah^Ztv}}WJN%/mW~S4I4_0~Q/0!YAuc gѠN^w+:S'dQ(55Xg]O>9-ŽXN21dNCY1rׄ5}IKVNܻoTuDgg*7JJ:;~ԭ)%[+c  CT?{-4iΎgYp_ƒP Lgca 8!I𥺺_czluJ;)Ͱӧ5mm  )G&`Jfx3x`y~C'2ģ$玖w8̥/et$İ:`ӊ/.i')YrxOBZN*O>}}8#wÆѭ:nŲSކa]x%k +*U9)\AbÝ܌R<|f]*z<'/D.{00r)g*hU~c%NajzM{t((srMt`tڈ$I3YCPVT27GC%K*UUO5hiJ~:hTt2#Og"sIafP;jujlM`]Zu0Ԁ;| .D8rES #^ʑ&7,ngQ;4'%L %*@~x}fܫ7}AY|{?xUmya]G}l7$4ǔwoȮ^Dy3g$ >9hcaK6!"XW{;j|kRÈdԌp'B)%XRjz-fйtv1X>V[,sc*4(QJc#s9ѳc]BʣD/YS^&}߫@S do6ʙt:qRߐ{={̣k=aOܐ;'jۍ({)rY\ uT4ʸUV5!aŲLj'K]\壍!% xjJa2mghVRI*Mt%\)YP2P>L 'J^LscJ0B2Z XjRM7MQ7j~NoZΐw}wŽ-Fþ+5Vnp˾ MHgLa*ӨS_Ъ(V66;ǻ <ŴM3t>*]IcmQt=cT٪웜\m{{]=<힩 *Z[7ru6:'Qi,4|2u=bZLbϼ2F"uN#v LQT[~w?Wv"#n&ٛf͔Qu3Wn/j*KVH&yVd72Bu2,q5g8k ͇DNy>l]9}5%}#NqЙeey|dQBd>'GLJuŴ[:o *mtl l &˦@%*ozԋ׮=ecۺOR=𖇅׻>5.wEt-.) χ8-iSnejmD5Y1vT߱c}Վ:!Z&5j˝:w`G-:Wn=J|jnoyϔf@o=Ru@- H7TŌ S+oeaa B&y/!% UK?I<!; LL'% Ix](Pq{o0!/gCw:龷;7l¸4]Uk7M]2v|}7d y}z[رQ,\(rg3D.nE_Xby$4p*]咰mvVS&,m5'3BG(2"^z^j'ze B9lA͊)IZջeD]{тr~u@C/t = B, r}|y:]X.$0Ӊ6;>FnLcaL*ot?4踧lUQR^2954WzX} LROv jۢѶ Ñ&}!h"0j:E2Q7>{8MG>A^^R㦊} کV#8@ތ:P`i(]*'X>dm]>7 -{[GchT=UεxFb=(;^W{p ЬObnGU:nJ8]qyoj61=M3[WKdW?:Ml+k }>L o'/⣔N ;y3 tiǎi 6|ScˇlȮegTc&z!ı%Ѱ3ҰcARj~TT3`r"V-0m+a4hwHCDًxc>ݘ/@, ೞ0Ra5ݏt1-=Ei#?ݪï-<(Kifr3VReU^DhK ¢8qƆ؞*!8eN^W-shK*ItsϽ hk S.-!}ˎ}Qb2V,xt̝oR8^NRP ~DNMHd %kn9\o7- ѡ)MGS/~0G! ʓenfϦ?BSR^fV*W**GTS0h1Ӵg4ew;J"-'f- 8~`vm$P:!<|-_Acy]>+1 LjVEfmKK|< yL}^,g\ˌ'mΗt6AZ|;)*w?}ū\يh!mP.ARC_4])l;6kYtu^Q[dB02shDף$AuI5Ҙ-[-;C+H#^q ZrCT\ldgKnPԧwktXF> DwǦ\ ; MGۨ>јذ4 m:N'XfY|J!Ar.,Ug ((i|pnY@Hl[-~_Wm0:jŏD$FxUf:%ZRBr_FЃ}FUy#RYn/oVRd鲚T7bŋ;Gp8 kԨOUt |mܰpǴ^l;YU]lR$ŋ+@z`0\gUΕyܫǚ}6n-!lu0=p|?.! aͰ^qV|F5A~/Siގ綠M:P獖 L߈u9ј5$.Fɼ֝[? G!ĐXDU$I$]H2̺+Fe7AclH"7lk%Iҗ~Eבz!N<*35YFwqZz๝(xe9{P8qa>LG8Fkx:3|q8峖QG;_=cJ c dD>2KHJ acɽ0? #aGޖRm# 2o]SMf qVȍ|qr̒c$٢Ɯ%QH{N1"Hz#Ĺ5:/WnoN\n2[s.ss1;25Lȥʧ$Zܶ_B|-MYM}19=%Ĉĭ+a aŽ̎\ر'ֵ7^k&/ܶ o _NHh&5D¿/3_|N^ nO?D|,#'x~Bx0 x Cw#mo xSoh/O^{ xDZrO)`; *J^^P+e%'ۛ=^7xa7.zw 𢀝vxa9 ٰ A ^RS [lyηx⛋Mnllr3&l7v@֯s]ank^kY=y֔)J'T rEOR$MP+}xQS)OX× X (l/EEP2KR`;a0Gc-0mY-0S x( `'O 0m1< (0EdAa g0Aq&L;<ߝ ch?EHFQc!`n>RnMͭF wa0> stream x]M0@ Ɛ"jC?Դ?"m9_mFJ< 4ٟêqce2mT?U(kd|~p=MÜ*-PO_ _2T#!E=y=,UYӨ> v{{ *Oϧ~[/c $֔>ܖևNӨ},LUAZ76pED&Q 2) Gd Ujd / B#ONz"eyhl"]@_-ki*5~D8]ge ?+kiJnBgA_5@U7t?>#~܋q?r<@eiuDJeY9>gy=QqgV'yղgMYg+" endstream endobj 10 0 obj 486 endobj 11 0 obj << /Type /FontDescriptor /FontName /MUPHIO+DejaVuSans /FontFamily (DejaVu Sans) /Flags 4 /FontBBox [ -1020 -415 1680 1166 ] /ItalicAngle 0 /Ascent 928 /Descent -235 /CapHeight 1166 /StemV 80 /StemH 80 /FontFile2 7 0 R >> endobj 12 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /MUPHIO+DejaVuSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 11 0 R /W [0 [ 600 748 615 817 317 634 612 392 294 352 633 634 411 277 277 549 579 520 633 633 698 694 636 636 591 684 274 611 634 688 317 974 634 591 500 770 837 636 787 634 629 634 530 629 837 610 631 610 751 774 862 686 557 988 591 966 400 603 390 390 731 ]] >> endobj 5 0 obj << /Type /Font /Subtype /Type0 /BaseFont /MUPHIO+DejaVuSans /Encoding /Identity-H /DescendantFonts [ 12 0 R] /ToUnicode 9 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 6 0 R ] /Count 1 >> endobj 13 0 obj << /Creator (cairo 1.10.0 (http://cairographics.org)) /Producer (cairo 1.10.0 (http://cairographics.org)) >> endobj 14 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 15 0000000000 65535 f 0000015478 00000 n 0000003659 00000 n 0000000015 00000 n 0000003636 00000 n 0000015319 00000 n 0000003768 00000 n 0000003982 00000 n 0000013968 00000 n 0000013991 00000 n 0000014555 00000 n 0000014578 00000 n 0000014848 00000 n 0000015543 00000 n 0000015671 00000 n trailer << /Size 15 /Root 14 0 R /Info 13 0 R >> startxref 15724 %%EOF mumudvb-1.7.1/doc/diagrams/TS_packet_getting_all_cases.dia000066400000000000000000000133321177353207000236250ustar00rootroot00000000000000]rF@)U;[Hpb{&ubWݭ ! T͏}}}n)>rBHM4Km}Jq6<%Fjφqoߟ%";cw,{(&h$ϓvЋOhLfMʲ.'e erǠMٸQ>*OIksbv+qd^iG1ɭbwqfwC*4f6jl sƿ>{m{J!mR ?~yлA/FEY$Y)r4d8RUk1m܏p]ge9zdFI>3?}ʈg@`z@w<ٰ~Xx{0[%u*R?&Y??VTf6cWk׋ȓ(".O;P\٧2&)џ Y{O͢'v7(AT &?Mqy.H<]H^J*KX3yi^\rZ^ͩEM n{di&l|3b= rqC56ύOiT}޼[f G;ieQ{hXn~]'Y`.Oqn[JOi]%Xl_^]o ;[({"nD;Y*iq;A o_h:nջ6S4_,Cs}AZ  #&zT#l_KEPmfRu4)((Њ]2)v4 b*нvx%#75m!BX[C_TV HD*O iєh*1!@JJj͕GN`B0f0*W/|/&ìv^dþE!3M~Ry -vE B1'q#{)8ׄ4px~&{ͯz6WHv\ݭ?Ķ^gؿHbt~ź/t8إF{ (WnW] 2Ktc7 uˑwգ_ULWߌ7kO= v6lvg[$6ЌNYٙ@\𢼹xtgWo@qiA),)b"[>45“Fry`L|TK{e׸vLMDDŽh"-I ze=l8 @O&:~|2 #Uk$xekDjbn-uHLK1$YbŞ?. @xP U U2H4=;ד:IR*`+YDǙjUA ĥg0'zXOtÛ+f}ϕwӃtSZ44 QCCLG)ZC[$w՜靐E}# nKp#[8.M b-G'+4H œBi=:Y(UvFΚY(̺]Fpňdsچ,Y(n41 ΤBx$G;rz.6Is>7"˜# uйm'X3ّs&aƸ\3OP3-&NL<ˠEtaj`DXs@ܪuF$&!_ee3텵MTК\pȺ+@!2D&NJ1.gY"rr}=*(rE4Kp/r(ҺDK!C-=tb*z‰Рki>(5_y^'7,<"Ohnq' ee8A@"ŏgߚ}hdXo!T6>G/< H }T \7mنDt@3)cek̼EŮni< Le꣫pdkpE`]>0rg$;;MQ {򼆈UW{n%j8b:g4!OS:.nFEO3D+3%JrF Ba1M;4Rx2_pN Uۻ}ٱ6C"ϳZa5TX|$RiܢLXoox3ě޲ھpN&\MoKbԈmn@ $[_GIO( 3mbj0)YX<Ċk/H>,geXa1Gvwo!P n7vM8V׺tpK|XbA #Nk}/=;}=;EUS6%lR\&!z A*0=t*O߶{UݴA S8NV\Xڠ&fcnߎq\ld$}j?`=u\RąAЧXr kr% iqS-Z1*dQ֢\SW  bզvg(gV~4jM<;gI. }Vޜ~ j^FwmNԷ{#/Q1^d-Γ//>zp DāY4dJݪQGUk$DBHjkTX-0ML˟8'vPj(=kJ2bC:e8.E".B+q:`s`|Xn^I+ Y]k*ݰծ\9Ś`\wBб`r9 \Ⱦ}L8Ӹ*?&_;3ﬦ܂/m_өd> L"X5$7.>CM^&:t/F`A"\mŒ"Xm&>9D TF_/{lG2DAr(u܎m>U%DiU.%Ehad4ձT VԌ:w1ɚYkR`i1;˦Ca"(A1M3ML QŔyz˴2({8Bh$35 +XrT{SԄ5㽥K 0T.E8u;@7"ukabZ)KqНokjDΫ^^mUNڡ@5-'0 ݷ4Љ!]C6dv6tTW;&NՆ]̰21L-QLDeB@V&Zp`+(:(S[qgAhs&"ZѤXhrO#1#U6Ց~*N:0 sGo#VSAR Z z`R)Hgݶ69$Xuo|/|{"f0޺6 $dცs9 i*`bOhZ9[ҁ3Mpu5?qz9+;K(0e\V} RBA#K1N;wu`敶SR B ßaG:u|l?꬞I!7i(UYA{`fU9 >SG}vOQb(&+.3Wk0HlYr5w/l8D݃Ѩ?}77>w%E%o a6Io ߣa]N"ɮnq}urx§#OܯqWY/(O[z\&dA>Og>*'v+O={ɫ*-p(uכ8F덧0qpS?q{悧};7EX2Opߜ_o ϓu*ɭ?,:g.ZAü7~UyUiI!w7_rhlhdXo!T*p+! G.@@@DOӮ>a9您}"C`pJ<^$Tk+% *&SfжE )%fác4,iėN&Y+#) +C4̇a>&o1Z@vh9#Qd`R; :]W,R)$4e.۔Jiœ$f%`I;afcQ _=P#MM׬aO! @ªC ӄ(.*aδ%Xin)־}}u[6:b{*w!i؝1^t펒vyVw%UfӟN_߫{1T]=Z) Ip̯%œ6PpNQ^n_pPp<84t{E`gpܔ$M}7(¤)A\rW5ǝC(sy2݀Ė^LD< h]AT\Έˑ.#n!2۱ ;OXX /Y L4ԺL q;V"Йut[HPj Cdubq4_]79F4uYՄk)wN\ϱ6g iX9%Z0V,VG>>>Z38S<&) ~QN=2#.a~z1zٗg?{^9{󟢳wWg| K9SW!=0 u+Jݫ'-$1EoJ PPX  SUtHh1=0׺tcG YAZޒXy}fCc`J=fE U/k` pӞ8s j]@1Xhԑ%:A̱A(%MSy3EwNR8ǹ4ë"u9kWka7',BX+B,@;/6` s'*sYc# LZ5EB%Is5%7ܽLuCʔ`&E=%(FX(8at0Z֤5fа䈚 ehkx9r٧Ƥ{2z{ݴ򜛝'YQ亜u_CO\;qi7u |s(9Df& :tmVu)Up7tVBѽdF~Xpu䇇 WrA%GՂsAҥppr) 5[HR1M|rTgdQdೱ.& gt8ݤI}# |b-DBRe*!;0~qnh1ޒdE \`O@C> stream x\Ko$sd ,t009>j$ *C~b͑fFN`#X EV_&Aia Vaw>X]}ZsQ+r_\j䭍j FwxN*c;|~^~qBE/ sGGu!|sJvuNhM+)!eZ?異o/Wb_Ȁ%k\Q||'$x^~$T>Nws~X|?|">uΏ}MXU oqI^X֮!cJk8/5 E.m{ccdN3k/%=s#dP*I&ߌY5I[_W͇WmIx֯k0mJs KʺR: &ϱy #J';̀f,6q "} ύy^..DvD2solB^vEw:Rj4}ڍi.o{ͫdf5y:2w&Ic#)Xw~ IC0a gsO=T*Ƌ#]Q1Jrle*dmR  A 'ŕn @BkQ31*gb.;%/ p Rre0|3y4 9pt3^T.FZ)\g 8H@ez4KQSS&2x0ʰ*V1 Jj; 4$We*-jRdSRX~96\mA gPTl[~^ w; +'ppmN;?K:&x`y\곇cP# @Ϟqf+5qq T,x#Z{q1Nu40~;9~k;3L1rM)r9ȈNn|M8v./1s=1eEJI )tK4dPP艼hmDQ~0ָ1wDP.mCWan]H cߪ]e.IRW%dz60XrF۲)ަ4R`V3MB2NvÜ1 J|,(6k5 r~/̷¦:/.]d)_H=QP ;wktiZEEWڶ`8.*S6ݍi{oˉwIlcHue=¾)eU|1h9ХBcgQF"sCHn%V|Ry` "&Vjxda(yJnՈ^k!lĩ't%WN1E+r2;2\kSqʘglXemċAI}l%R.9b٭0M%ґ :ub#P`T3lJK(֥␅ɝ5rsQi7M- u[RnNlX=\'ɐ G4gFb*A3}H›6&(0LN=KBG?ՆkXxݨxDi?fU$ug V)VI]ruhp 8k2ꃺ.@f)P#Bq㸊sL(]j"! 5 6Vp0!OR 4ȎWm: A ITDBsWS544Yɍ=muL6;m~7.aufR08} . RA=Luws{zqkmt2vZ%x0 %49#Qk霵}&|L$OxHvܩhlmVM3jCN评ql>tRܫNwc' r` s7*P =xGȚ|*$q H#^ UJ}:w}L8Eh&p (ktY+9mAkyoHIT9boK9c^KMG[~jKcLmYŅGm݇-sKe6 .L6/;0}$ϸ,8B&eiGQn@eB/0fǿ]:y< "sVjkߥ1T[GewA`l^0˟W"fRq9Z7*逬jnl.5Ҭ]jQ.K`$QvIIS)[K?]viay큝kp'88ZS2ICy_;/*3 ro5io|((Ow/Nk(mˑ%=Jm[igWRᶾ&ڕ"D|(02,py?12RyQ7fB{|u(5Nw d3?*̎1MdG˄һC/*jsЮ7QII!C؞λbRp7T(_%W\gb77V Hx/@t|Sm8WXu.)JL es ZBjߪ6ԳC:Z]W+A_᧑lE|4C,.(?:kdAz]wׅG @62 t%QokSSa>,,<9^GtutmVM\iMU9~ ׻NfuKGl0*!bNILRdžs^xg4&-c'ξyMc[ ^s'(toz rL0NB|m_!, \$EkF)FnS3=>PPN9 ?ZdMڐ+A͒9~j,S;_u704TFiqwuʷ30Ю2ͧya0l T}a|R}k@= ߟOug5ߟw%ŰyV ?\gFK&uYP8w"W!u/ ؚ۾_D%o endstream endobj 4 0 obj 3970 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-0 5 0 R >> >> endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 7 0 obj << /Length 8 0 R /Filter /FlateDecode /Length1 13884 >> stream x{y|TEoUξtF.jT`E  AL4DGpQn(3" I坺yzV[U9=^%Xd1|ęc.籷aIt%ʲStcw.kM2q3zMg7q;3#{q3&O$bABrQry3>m!xLB32{10R&y؁I|/5D$D{DSn/՗K-e6$|)u/?ܭe4Gq|qd~8YQFOӵ"yY"'ny[Z|WMy4VT@ ^> ogebkԂ4^Bkc)vmޯU6wJ}>|K;JQk(N^H5w]HAYg}+x9 23N\n'wbuՉ Af r {'z75`Mgu,v䆳&LIsҹ$1 M1rn 2`33 LMyz4-D|^G4M?2i/#4sױ+6׻٭_:ҳ.hj(zq[!D+%I 5aZ&m0rXl4etC>. Cg>`NϘoVֽEJBqo$G&#SEvl{œړ^ci3"Aԙ/ax%+kOMsд1u_}y/䇧)^R UP- mk&aƪ}!=q4\| a4,}ƅBV) 3m9R4_ƿo={8ll8G]NvddRR,Gr R|,!ǫȆu՝-GJN:%ĹqN5"\Fo+,x&ٟzu;F9}}6 Dd NY̡=hAh>l۷|vU~,L~qyO5Tn.-;^k񽓧u=uԧ9ch 'w^ӧ76y͒5ɟ&s:!U+E`i2ï$v:3o˟a}x'Tݺ_N |5L;s6Y\_9Kw\E2HC8+.cɓ1ZZ|b}Zou@4)`gZ>ˍv-盼o  } MMM vN 'S¡pjSqRqrqJq8Sq̬eIɕ)efdJ㢎 JKRJB%3g L]8eqhqjM\I{ P;e앟Z`kI/Pf/}6weOl,94jK/+4쑭)_WcOVVapuGrVX>^J.2,08r:)YO7aqڄA/3?5/\hol]sBv`_׮_?E׮{~7u=E 6 Є4E:4&( j!eo'}l>sY^ qf,eVƦ\Yh<05K YuiP\ JF =8 g~OGMzm~sG@XZ(oo4VEGJˁ-_mM76)s=t>U~4 'Kkf핕b|mMk6o +YCDUT|ԵF]9_ϐ&lN4+\,6KqQ8i/P!c<:ld18&yjp8P䷛<9D4 +b3 c i={7"biwD:EAe"뚃 1!z?wWǚ~ WnhiIVWfU(wV* o_w.wڲZos/Ϟ3G#lo&B:ݗHpTt eNᕲ&Vs+hK[/5-\X9v¶nҎJ^JwYư/a1=nmi#)8qoz+ݱ/E?hAswV*x6M aa-ƒBM"%QGKgk'_KY_, kɁ\ӛMQd#xPvyEX1SC*n'gIjo8VyIyk\"5GMn+ΫA.-tЖ3R8ڮ(]/ؼهyRvA%rZ}rC[wگĘYCW f9,B Ӈt0!*Ev9-Y6'u(zMm`ic-4I{w,U|9C3mŸ4Wkuuk9ޚnUֻE ud^1Vpƻ=Y$la;ҝY..7),>V/G/gWГ뻊i!̴l u w} 6y3ts{WF4v_1=ϳo.s,sttl2U͞νZ߻O|m)/v| 1rT~wJo=<-ůkw(mM2>Cϟȓ0ml`S&Y9cm~Kڢ :'sqzu+ʭ# s3~O]̜Wߤٮ։۶_W6V~3c\C9Soj7]WX3. n: miD"QyjM%Y*ޙh%:=0Yg99!Bkluvt DwNNMZn-w,w.w,Np<8HIfVN۲+gͮ>:뷄XK#n+'mظ翍?|G7O);yԨTwM+JK{` gxҫlݗL:0F~}$709]g6薆қcx[%E)Tݶ[&)n]^|ɓh_ Ӿ&QrEI'S]ӓM[IQGR2+1' $3>** G ܂ޢBȮI؅C7X B0!aT@d"hSw 6~lNiRu,3+5>mr̘`v't"Ùߌ-I:+BPEV3<ʼnF4;`DW9rӋgM韤[e_Bʒ_{Κ]w}`W} ʅ"'mQmˏ$e꤅<}trG[BcW{6hSÅ_<۹▗'%YA\#|ّg>x)[_rک$ܳt7*~oQd\8QxxRd[kXNtS.c$2 p1f/l7mnY(P8X 4fMDI_kʑ!PtiM;u*>仈Fwն 8-Bն1Z#OK$MW_Ad7(`F*ZQh`͒kp%s;}R5Ck!׮:ŵ=ɐL צ~ǝ^Gߣ^35E<.v'ͯrY)g|>pK{\zMA@I$t}[؂؃aL{띩dLFf\Վ#uLI?$ãt6 /W["-=`3/I+谍M;OlƢ>#TbyE>fM([GБjfS4Ooe%/F:Ja4&a;r&o;$|U=lBT(W2IGMt[tDˎ=|a'vt'=1ɭ-!$bML`];>IӤ+8x#ׅy]7`97YԽo8-08)߀;̀K{O?6>ß?!)T";-0.eaaj_Y{KM}iݴInt|Yy^밇@]bEHD03o$M6ȥaWGme=M'YW{L;siFId@﨎;i: ^Y#PNsfXbGuWx42Yh;F)֪j. 2Uu"u. eu0װ%lTگKy@{((g:FoK4!l*K8c{8 Nz,zv%ziz*|p 㜄2OSbsjk5~OgES릪޳T;U[?>ds[|mt_zr(UquΨOY:R4 s).__{; "/-=rȞ/tNrmN oA2,n;0aX8+r7?Ut]* eeL=gZ!^`r}-їXkY4 FAIc9ŘnkG.TG `[iQڝ.☬h'[ Hi!4f^+`嚟/Ƅĥk$r+'}ƊyP\` z{K.ڰQ%9#}-}Ohcηaϗj>GҸQ`i=fҥIS/gl9:8F gqK&qG))N&![}+6~M"b<,kDgWbX<]H&d<[dh!EomL|#c2v;], "9bueޥFF>=E# _VvFn]'B_5TBMa3W/b2_[nCĨE̹fcLf{`LY jZbMh}:mu(̐7):z +<5#%dߒ.{Bh,M21TmΑ l{\Y~}޼#;7t㾢!#q?dd"zv͝9<=`(ށ{-T+r&ᬸMD*KlD> Ũ-I CJ<+vsph8o4# qoBe 귯[vLFxʮ#hB8\N#rr/+AD+J|ϲNBcY9`b`DxnD †zdF)|s=ʑ /Жet%+rTӍl3< xh3υ(WJ2R4QBMދ~v<U)N4$I;IBKb;Kʯѱ㭷Z;x6wU m/CD$*H2Ɍ$z87Yō-k*fR R}墨Iji4DwMÆ|OEY“>Dő*ˬcfo=s,*.EwbK9Fr‹0Srĝ/~H듺it=>.h m4/^XS5;qX0Y3wб;u!.iyx<o?z|ZИ&[E:FliZ#ٵ [+~/Z%򍅢B,YH҉ɐIp Btc$xCHBAAֆ來K s=+@YRNdKnA#~NaDKH%HH9W£2\,a22{cc.}<=(We#(r(Zk(u 38g㼄Ϧ]̏B'd6y|h|ag81 帖A*0܈=Gq_3t+}W<]JNad+=r#?0U 2\8^FPǹ&I]_H<관(iԐe<Ț7k2:eWr5:K /'د+p΃F4`yQ~tĕ_q}q}JM ( [9OPMHZo^2qQϢќczN"ֲ᥵ƆڽoC^=TKk]Cummc錫aݏuvMPmA.}7ů 75iKjCޟ~#îe=;ko ݯKwmCtw$B\A / D --(o"Ud [E[Jl3Y|;Zi ɫ?If ?y^X$Gqr%'mMؿw=Wz=D߉9K8pտ!D9}AJu4^A?9i|bHlدbE"2AKv@s4b! q5yZbMw#$ z/gb;OH4Ơu|JH,}MHo>?X'O '_Iw%#x5},Y-X2G%'HףQa IxU+^%4HxA>_!%=ܡ П2ġ 68ʀP+i K)7ۛ!=~7I\Ͱ[vIv7> stream x]ˎ0@|fnCMMET*R">Lvr\]?:®y1\[y^ m](~+T|_p9.Z=gS*G⼜Nm.aUUtaJ۷T>eoA̚-׭Cs(U:uaC0}:W ]&!m!TPvPYN2_詡WH2{hH4A*5#_δƯƯe]k3~Nb4~VzxH5~VTd@[瘒ϲqdϱ3cfZ2񫙒J~F?$ ~NJ&~瘼gi1A+~bL<`~y ߠmUt endstream endobj 10 0 obj 485 endobj 11 0 obj << /Type /FontDescriptor /FontName /MAOTUD+DejaVuSans /FontFamily (DejaVu Sans) /Flags 4 /FontBBox [ -1020 -415 1680 1166 ] /ItalicAngle 0 /Ascent 928 /Descent -235 /CapHeight 1166 /StemV 80 /StemH 80 /FontFile2 7 0 R >> endobj 12 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /MAOTUD+DejaVuSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 11 0 R /W [0 [ 600 748 615 817 317 610 634 634 612 549 579 392 277 634 611 633 629 277 603 591 500 633 520 411 698 634 530 974 634 352 837 636 633 688 770 837 629 787 684 694 610 636 336 500 274 294 524 655 631 862 390 390 684 557 636 636 591 751 774 686 988 685 360 ]] >> endobj 5 0 obj << /Type /Font /Subtype /Type0 /BaseFont /MAOTUD+DejaVuSans /Encoding /Identity-H /DescendantFonts [ 12 0 R] /ToUnicode 9 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 6 0 R ] /Count 1 >> endobj 13 0 obj << /Creator (cairo 1.10.0 (http://cairographics.org)) /Producer (cairo 1.10.0 (http://cairographics.org)) >> endobj 14 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 15 0000000000 65535 f 0000016138 00000 n 0000004085 00000 n 0000000015 00000 n 0000004062 00000 n 0000015979 00000 n 0000004194 00000 n 0000004408 00000 n 0000014620 00000 n 0000014644 00000 n 0000015207 00000 n 0000015230 00000 n 0000015500 00000 n 0000016203 00000 n 0000016331 00000 n trailer << /Size 15 /Root 14 0 R /Info 13 0 R >> startxref 16384 %%EOF mumudvb-1.7.1/doc/diagrams/TS_packet_getting_cases123.dia000066400000000000000000000201031177353207000232150ustar00rootroot00000000000000]rȑ)Uwv<3=xS콸uNR/*H$)RERu>{܋]HY"EPVmR̯w᏿\t0<ft_w߸?~{=9~b4 ^^fWleZ6\ix^~{ew//fEl6\lT\/OO8_Xw:'oΪ˼XΆk_ɤ,>_\^j<ٗ{KjfjFֺ%2,&}:l!n~äW$`z|5&`vx<,ќlr]nOgzZ q{l3i^[nw6ptV MXy9< Ҋ|gǿ$Itɰ\wѬiNŷ Ղ}ߕԏA>͖\bCO}u]3ՊH /dqWwR~s5,F;^PV?߼X']~7>(&O_o )?"^ V2nu._}Q* P·-8`_ގb9,/OǓ}"_ Tv(&bVmq##6>^=, C=Ѹ=+VaaeMݓԻu+_>rVn:A>Q Ί \1fٗxs9 NX;~AnyqGtvQƕ,6X!B|tYBYIZ8uBŭx^^XyKPTd^=3wJQR)J IB!PipjV(egr'\8\:&݆m0Mrzz ͏:q1?^vOJya9:$B*nI< S_8+{ <, ĝ+=ߠk>,+wԞb4.W'XT=g+͌t)hy ErSIsyR;W߾Ɵ?ZOD+)RH63Y 9% < ɥK4M$eP;dR cq8t$a0GG$`01t1e1ZJ)b!eA4gkTKH` a2[ .-9uN wHA/fӃw|{80c^Y|sp|-"Fi2!ҁH)qNE@;Aܒdvq n{Q>ґL;'& 㨳 FrҒH}PJt#lzmpͻ|!E*pv&K)BI:τt)WJ{Z pt ?@Ajv7Rޤ= .`QPW$Z-+%$ه_K_Bh_I ,sII i!4y`zAΌ/H.PU[%Tz5[ijn$o+t]đ>qɄ'~׹fG)v!E+/GzQbL+QL:1w_(?QVD7.FI5υ OˍeV&o @x,„ 7#c e:BMm:Ѻ&סsJ9F7/ϳU4lymͣxw"QUA7\FF Q&4IILϤ]PB}2y\v$ DW9=*Wc󘐲Wni_r.j\~ Dˈ*MٟҔPsCt}`*e#-$pRKW2e (F*XH/Ei^+ €jBGVNA9Ss"PscBR8 LtB Ot tqLJ!gh?BeI0\(kᶕ$fZHؤ6q-a)O l]K$Q#D2wD6-FlTŖs޵hƖӌJ;9J:cHt%oKm7A:sc\ߑTL0 SvǐJ0<-G bԯN6(0,/ nX$ՁV&Q+F 2wK@D vML}w G8H8H8H8qrr6[; Y$)ӎCED5Rli_!Ng)!3D1X򓻔%-|8sY@ zrCcH $Ϊ?U%_5mf YE R1I.-b< wS1LUoSA$dD'S|y5@w_Q]/ôps:&Z* X}v8H"*ҫvTa6o ,WҫHJW=W'$-!T\\J|FD,yzjihBN2qQ#ED`:Ba3Wh1' WߝZ)M뿳|NI"  U-nӅ{nbbt4CE:WDR$=3:b㶇D.WKadX/)Ot(exW[TvN:=TT͝8\Z&{- !:Ll="q:!7yM_wElN˴7,^P6EBm/-/=nBøI;U`qFAZ&7.uooQ-UM6#LU]z5ܸAĆ,0%{lw;]ITk 쑒Y$ϤL0@L<܄IElvhu3IZkݱ\z{-wyR3o|QLF9aeEF&*tMGWj^V.m k[a|xQNy?FEr1uOyzVu4"V{Wo/_r{j|tDŸT.ݺ^1[h<%@}Eҽ@!L2mXgoȥ" |u 1u5ᅳ3hz⎧_-f|-4QFu4wTwlncSkعsEw(˖Pv3yolWkܦ1*7zۤ#A"g!tO]q5Q?NY6$(ٮZ ȍ [kw-8BF:QaЫ BumX(h惇?be '5[|dHM<nLzB4{@k5y@u<`aεLܴʤ@GдEn_80_ gɻ"8P_͝;)gr~qq]ETpaIy>rYƢ #[I#ہ>:czhP+6|›ߜĉs˵`^*̧ ;c sNh:CD#w<Ј:҇]ۤi<NI07P@(]~*/t/ݏdQnRkl0WE`TZܜ:*&tB7:gY!VKmN^o@ Vq|Pmk9]AUd_(!un?k e21-6m ,0=q ն0{-9JJd>fi^haǠ< *!ĩ{_IʽhB*B {cc >v*J\ATBeG* R`N$_Q.2J{R:JE$\lIL5K$k5|]uȺ,&A1˫eZNG"c[m,W5UQ6AQf$ɖǬZ"rvJ]UjDWZ"U8)*Vu(!4ᩞt ۑ {P]a|EQfBi )|p+I$0ܴ  }:Ɨ(s+KHZUtz+[͸[e9+tSkI=%27ʇ:"XCl06 qVwh PV I4K2'80%Q 1lF- oQx[- 9Rk!ƥif"+lE]I=svgY(햬J*(wީ,(Pvɔ~ [SUxe`B4]ITX3ktygsp攤GPu5&eaÑ:R ix%#Kgo6tV̮v]OR&?iFMť)>=$sP6[w%/3EH{Sozp⮞5ŽU38VTSANXm;^qp-cNIO(@.M+h!! {R**R\ Yځќ595jA5>Vɲ]OF'}7 ̃XQ]m+Fs ]V nT)EHm0'#tO!k.*1"ҊhyKr9Ar$$jX֜gp8,( a 0xֲA#ڄ!wÓu7w;,Qv}>$teA:S?QT)q6,XU5]&NJh-!ڣZMjbN8/ eW>Tk`}I;ي.ޛp^]`t9 !XJu+@TP[HMʻqۇ`Kd۪ɛY.Ȁֽw &D݆I{i:&2]C4sIZ$Cܞt.|xlSe\+zpto.s ,쬜wLa9 ߆׋I 'קkdb价3^룣 >/&%OO7o>||oY B_nY۵Hzz G;6CGмdF>Gy?0iȅ`& j&dBZҸ kw"{vI A $$$`|`ȅb:mBw;ppqPwbGW.H2iSvx 28NU^Y/He &dxyc\p'" =Hŭv\(esy(~ ͅeC[.XkC3;waO[3/&$R){qRm+KÐyRo0t[Yn J?l;FBB*)RNq@H:'+J d/HX3Xܴn!34Ӥu lFF8L\7aZ˕c:e1R I_ts ZaYh)@ɪ=I3܌4srpjeGGu&hLT-pU *7'l|%45 =C}E6EM(Iaϕ z*JZ8aL6SgR)o橚:& Y;s+^h.(IYu\DpcjܸT>C x,%?"\w!f7-'+t67ֽcliu;i*w?SBҥEAV%VxoFknagxHY^պ G9.­S"Lәiio4?!y#|y#B>>>g |u)Ba:es\5|&Pޙ`Z]nF)u|_Qג}#þ-wNI:БvDτrŸQnW|d^y}&Cs: s9,:H鴘'sYȦp8.6]l4Syw1^r K,]2HTZa|{0'a %^mumudvb-1.7.1/doc/diagrams/TS_packet_getting_cases123.pdf000066400000000000000000000462641177353207000232510ustar00rootroot00000000000000%PDF-1.5 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream x]I$q篨Nq_ |=ӛ ”}32g &/>0k.Au:6˓v^~OBヒ_gq[%93X\ś?oӟrMR\w|Fm:R 닱sT" P?Oy<MfZFщ1;af6I< cYҋNbr ~_~"~? {y˷?Nq೙3J9huqrV_GQ2ͩ|O/<:~}K/)5'x}O=?|aOE0`UZwq]4ZS03]הrGNbqfSnz6[d{cPH>3W'M:jk|z?o|0G79[Z׷)|LY (fi$-Afs46LS$ vQiqGcvxqIFǎm1.Tƥϝ?F}|])]EQe/&:Ʃͭ*iAdl}ؽ$R1Hxx/ggUԇiOĄ,p L RVAB غň$/? ZDZL!s!M5c 5Lvn,Ul;h|67+RIkKl0J@`l&%aWhߗ,uzi+4VoN4dnBMڭQT1h}݋3i[vyoSȶ1lô%v6:jf#T,Yc5v_}Ř ]ޚMK凞%', oI-0t߭myH%u =)$F^@Yx&g)XlBa ) <=!m# 4!m Z3;uԇ^FRg4h<@ĝ 'X#x iT80qȨi)3{)AvKs<'%6qPT'wtEgɰA8| \62G=+1Drdj`K$$Hɳb i,ajJtq} ɐZݵ9;- :!@(Rf 橯uݾO0(QG.O"E7 {ǜ]<' :k0i8 tp-_u%Qgm k^^ {\7Ý­-f'p]*f QyVV?֣ !68Xf g kgy?ANhrkKv@]mkXbNiC-ako䶮[~*5&{O9 mG^~L+Ł7FV1yS-__P(fo9 |XfFBư&,Oi 9ENK.x5>G_ִ1Nll,@8ǤTG~ŹIQz/yDSjv2тbU0 Ҙ9)C+|P '>P^0 *mB˚3 Ӏaz}eγ-SBcX3yzlz{$: ۊma7zCUēghrt{c}w-p3gw$J`P Kӯ l2qk~-[٘ƒ2jvaj5Gk YjW04YշNRqQ2p_E_[:-;PTWPE8I#Z"'B-2؜skj-|gi!A)s Rzs53$uC=a1*\7|eD |W(r0r@r\6x*|E FX(fA-7Cl3D Ma-y"K"ߊ7ޚ&/BKRU80Uw)T&c=}d㺵T@r]y<8:hHI3V'5HK0Sn"tFrݠX7`BT] V_lZ?M ٹZOhWV8YtlIuEDjǀ:Ԅ DG )p^+rUnwy–pR'>͍҃u1I i?o#ˑ co]`!-f/Bar#/ߐ1ovj)A7ʇ7Z^{$$ ݆;Gi6调<Ha B㺦pW;6V2.kOAå&?Eq]ة0\ id埪j{E1'Ɠژw[+l.y ɧM3DQBp)g*+Tq4@^:CiO8{xqQ+/1Y1C"1=Ra+)A'& ֢mn}u%p MiSq,l04#PncEj7-Tso PL@`UK~sU7뛭` ET1puubX 8` Gz֭ Tbcv٩qmR 鞡V1ՉP"!G[3Sfjfd<SgSr2M殷We]RaSR un@+~PP@J*52p8$%6 64 \cpKqʧMʴ=#9hEvc#T>qFlQIgb%5iW5 PQG^/Ipg˚bb_ݚ;QD&c$SƂъg$P6<.j*K$Ys7̚Cҫ1aN"#Qy>N%g|i/~Zx,'8 ;q=\W%!PrMY:dHo|VT!0v߈TW"U*5RT ;s7Y=UB)BIh}HtO=.u+$)t#e4([ZIB)s_{ܘ*-ʼAN ҅dmz P+J{c*()DS"d&si &yyB!x?Kpg= MG6ԣѹI:nCe~vfiK @Jt >wrfΕY06jJFg[K8j RL/̸361:(:A?3K BmVKlH:g%L0h8(En5υޢl>&9 6XozC+g\7m; 5Zv}.¡#)uKVO_..MD=QtWK(Uը%gO@V1zfD2B':I =2 ~)VuWdǤT tWK2>nu_&Vu=q=9,ɺ2 .%YX[SJE9 G$Ɏ[j,oSeTGiwDfc˼R$".:w; u~PiEZ_e3:s$ pt:OI冿UYX~)jHnhai[a'BpؓNs,kN24&-[wI+/_HMuۢj3<K, &sMGcT>zu!cEiw{rj\4]&qv<(cbV A8p`g3rx1Ԇo̮=k*{ f]`G\?9i2tk~l ӉԒBoUFR?u?Yl}-< J3r謲1a(GːtcϸMISm6ZpphEj:&CyҊΞ,iqXnigTIjI"׳ ]HyM0V)9UJSAJ M eˮuET5%M'.% wGp%T_~+K[N+ZD>Ym Ku{gT]aPeZԜsř:3T=eAs pGMw_i<La}aHN[渾tKuSĺ+uD0ھb54u+RbS\iMc/);Z[k1bPčٍDSu[.~BmEq3(\6ƅڤIcLv}<Ha!'}A+J{ &sD:Q*q:;A2>Q [J@؈XaUケF]e<:|x{ְ:}VqsOF,\Sտ1wzgi$LQ"# J%V灖Mw_(`+y*@mŽ:'5ݙǗ/m/TõN,9KwrWb1qdg^^pRJK> >> /Font << /f-0-0 5 0 R >> >> endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 7 0 obj << /Length 8 0 R /Filter /FlateDecode /Length1 14964 >> stream x{{|U̬:s~7PjT@BxTDhx  #RLDV?H?ZmHf_{u?799{Ϟf5B !YD$O|p ^g !TV̘ޏN#:NvO~`^EaBz2i|ޗ Lg$mʃ %xOOϝ>U苘QS Xm(MhTm>MVwB}>|K=JY^,N^J⟶O/%3/Ϋx% 82#FԬ6 T49kMF 3=Cq[}~ֳx;Bكf$'&BDAlPpPfk:Nq渙t $҂>}nL|^RO^4}N;2ao~./#437ojrƾqw{~Ԣ& n%& yqoB(MGY&Eai>Ѕ Й, țLCu=qK5{niyϘ&PRzKOpno[JEu.m~T \[n4tYH)Yp6\ B=1*b kbDaٓbu#H;e8L<8,"y3̀#L'4eB OݴnziY)Tg}"g{(CyC`s5rܣh:;ĝڝzq9H$6 &ib6MMfyl! |JWsyfYi=Xajg`3J<=o4Buέdζn[6;_r Dc1OY{AUhnS_~(toߝeu0MKP>m?u2"X-YiIHg]lϣjǼN B2 ۯ4A$EJҽfȜan5qLR4׎-]m'Em$ t9 KJJ,I{b=A_HCy yyIyy)yeBPr(%ԭ$$$$$[Ie 55I55)˺ɬϼuiE]%%%H4#yFʢEIDC,/[Fa>)BHƙ=oljlthK=Io r¬SoXb^_W]ʆ1V9U #t9wW[M>J.2,0$~65yq!8oܢ5qq^c]MJ~$W{os:''Fm{rr>?~]ii~?yD_ެp  Є4:"LMP CN4|6ꚰ+:~N~2"Y&9hV&2ֱ:xMajM2 *bCD-TKhzSCË45LgS$m{.vmdDkvU) e?y!WD(3qaj*DGn`fiԚ^@1A>or[HmvwQ%r61`t||Ӧe?%JK5OOc'zU_=te&`x,"ys:]Hh>.%Qn2qxasR4Fϊ672xϢtƯRŷQ^Ј04\VJu[[ƚciVkko2PቢA^eg;֓IhK"2ӭ4G3ݓK i!yU.n$!b!P'3-6X7{Bz%DF飍ͻrK=% ZXSS=eJc{gy\X\Z^h:jܛ<۝ݻ= |g|}_ 7͡ =pȂ90wx7 ok_([e=h_(a|Ak䧐.AY:{s BW=zEmC |XӃo)@8 \̠{[x˳~~Dn}c;Tbةf:#8LrISJS1h; n 7O\S ]yjM%*>o;❽0Y`88$%rt Gf%f%e'geV[Վjg˯4Θfip /@,AFOpMu> C1b† 1hAΞh&k+WKwzG2l(ʦ|\[I  hM^"7?戕sO@ߧ}i DmP_)nB q?<~qfe8§NI9xO*9KEsRaqCNRyXSg!Nq&&4e6f2<&dy'V`Iφ<*E/^]kQ^vq=L , `s{n}sRs[} >lopFvOogWzt{&N)PNOKvm7;j Aubb@ yT7B[vy(J:[wa:1!d> E ֽ$FaFUV@zWRj T%# k{-R~!ψ/|X~<vw &CY3eBY F*`kLGOBiWlmQvK@ YyPA 썇@efzP!3fHv)K;)t2'O.Oc\&'L44Y}G|74=@g덇g-:Ik]zVvǜ*2''v߂J:㡜dS(3&6]M>[Ũ-A KJ<[NQGb>D#Qmv쬸G◐%K$;|hV}Hg]#t{Y?{?1+rOk׮9tm7 SW|ӱzf$olH(_CYD^*'YoI(Wx"(gɲDїPq1Mf9bS9X'L-btVU[}DPsވѐpFe|3+aZ_OkO{D _Ծ?5SRTT܏m#b?: :V9?gu\w״$ԓ jCEE熊iH,jˁ逰x~:sw¼@jm[im4(`2+z2d=JzTUElZ"9u@T21MhԜdL35!}jSwPhDv ijUЖ# 'm v-8c׭1U'bJ0EƓdbWo(:טRr=U4r)SMq Mq7fZW>BWiW4VɪX5[ֲP721Q9@, HQ6O6 I!92(2| /[ Ĩ t*L̘MPY|mYFW BTkun`Iؠk [qTz}%me#aϥz}P]S0Iaȣ|13tL9!rJj?`o C#dG#[A*–afʧp--m>C|E63m3GIaח<.^k\A.1|p)1Br[]{'w6M{1#)f1FՒwu\t֮e|F8(AZHq .;d=;T "6BeBzV!Yų #vNc`roe47Do+ϺL[!bUf)] "Պ #=0E9 ILnYN⎅ 1N;d-YO6R4+ݑNvd`f,r R }`6Z^l9S=0a,w+d'2L/3r1ͅ91O1fsU*w5hVK{6y>\z;.WHw8/yՐx.k7bb*=\Wjq9|x31"Kip!qzn*{:!7A_Ү)kaN wy܊A+ú_gwc Q:??b=ΗXVAZc/sVoh\E4cِ!d ޺Zm:J\]si)^M \g\]DÔut)yPG}f51AjFuddV'$&j$&&$'DaEE!:@d鋈EE-;LЈYAFfO[arMt'B/fH: ~*תMP.Ƽv NE ~ܧ0簮"DzUݧ;D73;$N ?q)cQcJ&'V&m0j낵6L2}#әG3F&$gLmGtdsEGn =4k:GK#M?s,6[G!?VccsM~}~C~1i;&} 4L1t][fQWw:QᲒ(:Q]7auu^4ܨ t̘'b;~(myRB~nENpw^7}Lz#0jً,4E?vmT}%vaVm*L8>Yy[uϬDN Ed"h-g|{ƪDF}yAtÛҿWi єK)LikgG]g?[~Y/t% OѾRΓt펎FэA8l/{v%B12kiba$A"&I<%vJ=SDO#B)ޗn!SS::٧~V9׮]/k[9yRWhǟkVZ* 9c[/Hny?^\D"Q 9a YƐhpXm0|Ają/SobJ9ʹޗršppB;QE5;mtEt*<~ J%$*ruGC 0RJ91G̽r5Vt>,4ɨ,'OO vzZvNzk {._e/)9>/GHd1# "!r#)̯m g6{>ƞô`=o 1YCZ`8WQS!r$q"EȘ wF~'},~Yb"xΓH#=Cf5!>8x ZjT\t:N9"M[8t)9IΆ-$BAHVNU*pGpx&2 ZDbޮf`'@Oq~] Uxd֨TzjH='|Y8&uVA1_jt6]k^OU=;Q r͋2 `T@#x.^# QjBC!*^:G(j89F*y5xUG/o1&Ҕ=~5٫'7׼˗K8Q  h驟?㖒1 Cw:l05?o؍Cۿ6t7!yǼ;ϰ=sW{$+={O6GWtB\}I;݄Z!QJfj+hm"@jH% 36Tҗ&~rPX$WqCzN.b^k4dZ66udGb5~Ml>gp([ם98%ڭx'PONI:_?)tRc$Ҁmv=YnzT+( '؉8$9I8~ ^KlcHH7? ICHF6o_\@HVl8F_Ayz{''flk F"NAԓu #odB/Ih ?|ᆿK(;7._QU:Z6O _ᜄ/ዳw/,x.\y| J3s'?q!z p$cZ|8*e>^< ;xGޒ7$.ᐄ$ASuhkQ«ƉW_WNƅ.Áu:J /I[/atv/_hCs~.mnl>ls3PV [v-vbrxjW<т'%ls \Pun> ֹ6X5VšĚ`"Wb8XJ%ZKv#X+5QSըtX_JX'JXI /$,\ ʡrdPT| $u'^(t@D(pAu/::D rЫ)zy =!{)~=.ntHw ; MBnHA9S\Im"$C Q bKrBMEIċ"c (! !BOK𡬾b.O9%%g;#!) zrd^ 1z Dm9?%/o{ endstream endobj 8 0 obj 10980 endobj 9 0 obj << /Length 10 0 R /Filter /FlateDecode >> stream x]ˊ0@ -Bl胦[3mgsB HqtcǷ4f)xoG8ڨ0U(K|_x9N\-^tWO_/RBLtVO^Ot-GiUUq8-ݷn]*s1lz}_25-9}=P)4RޮU!ԐԶd*T;,';_ȩ$;;z$gmH"4@W5¯3-~TƯk-~I}jI_-9sҵ1S@iď^ ~NT7Ys0dOd~ҋakd~/NZ! 'aT!,՜ů?&mR?AHTp?NY̏tǤ[xwo)mC)~]˼> endobj 12 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /ZCZCXK+DejaVuSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 11 0 R /W [0 [ 600 748 615 817 317 610 634 634 612 549 579 392 277 634 611 633 629 277 603 591 500 633 520 411 294 770 530 698 684 694 557 634 575 731 610 631 636 636 655 862 634 974 352 787 633 684 591 400 837 360 837 988 591 636 636 336 500 688 274 390 390 779 751 774 686 317 636 ]] >> endobj 5 0 obj << /Type /Font /Subtype /Type0 /BaseFont /ZCZCXK+DejaVuSans /Encoding /Identity-H /DescendantFonts [ 12 0 R] /ToUnicode 9 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 6 0 R ] /Count 1 >> endobj 13 0 obj << /Creator (cairo 1.10.0 (http://cairographics.org)) /Producer (cairo 1.10.0 (http://cairographics.org)) >> endobj 14 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 15 0000000000 65535 f 0000019003 00000 n 0000006057 00000 n 0000000015 00000 n 0000006034 00000 n 0000018844 00000 n 0000006166 00000 n 0000006380 00000 n 0000017455 00000 n 0000017479 00000 n 0000018056 00000 n 0000018079 00000 n 0000018349 00000 n 0000019068 00000 n 0000019196 00000 n trailer << /Size 15 /Root 14 0 R /Info 13 0 R >> startxref 19249 %%EOF mumudvb-1.7.1/doc/diagrams/TS_packet_repartition.pdf000066400000000000000000010713251177353207000225410ustar00rootroot00000000000000%PDF-1.5 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream x|ˮf=6b߀+Kg 0 qGP5o?9PҮn֫%E 󕾞o_|ӟ_ׯ_~RC5׿ׯ??~=-?"SΎjhmԯ?R~ھʿ_+_3O||+読_e՟/#rZ_N_rYz<F<񫽃;O`JRǿ@NwO} =:Q# x_ɋxߤfӯY; h غظ] ۖ57%8ǯ>( >]C}ugPUuP ",MIuM&ƝIj꿔IWAX/ui`_\R6KcsY G j2Ŋ>gp?'rM&HeY#KlXM2%r$iTп@ q&$?2[+Ohm>CuV4V;j6x`HA\X.+t+)+7V~ӼT苸u5bO`ouwigBNߖ6ɅX?zlxTtWɌ$vĆDÖ*G|Cnf;2^v`i/o mi\/wzD{#8c/8 '=P4,fߏ-eB8h9~xv#{MW@}t# ' zmoN/U?!dCcy8b\,a"6g2T@ueP1_kZh+]4k T,z^2<:{,XV>[a^XapT/sQoq08j"f;+앩c5SE[[&Wt]=BOFR|eTCa)RK7g04x/ع_?e׿}lxr ^ )Oc!Ns!fגy%?ך9ΚY"$ǵd #Evo Gd8RT`A q=-АtݟL|9g1s/-M۵zf?]\qڊu!6pn|Ax5/ Kk}ǙV"16s`l(^:?n9[V ow>Cxl7_=6}\ mf q`@:f ׾ mCX/t3c>/&6ȯM &3f yv ~:oɹ20`p,=1q6Kfs߆(֬ɿp }5X 2cwKY{cec9I@b-M[{X—`oY%wV20y! >>U :6#v1 -Ȭ Y!;՗0޴+6u0wgz0*a<"f<̖boL(6 BݳmOWF"IqWxs !z?fS"QZI'g3<6D .v v?>Bb_?_7F`:= `{@p A/0"ho -P&piW 9z&}E7/ʝ]l4$ޢw)t8e$|3c4 1>3sk.ʯNBc`D8F`Ejl˙O"XE?]Xc[_p;W*c :bӢ_#Rt֚=^0~`A InXRqSI,l&k*3<-?oݘN"T;m^5yFVokn盘+u[tF' NL1dc&ao}},SïUvA)>G_ R_w0$TJv &]PiqC!R7k쮏<:[Ǐ15JFsyTp$< mٮ 7C lG|ZhӰG)J h{OeEm{ywD>b8KyWuZS]ۡzjkP $>x$lzQ?a$F%=BܳڏN 4;w{J^Lo}CF#VAhCtv7>:OtP9S[hA.~;ɔX{oif7?&j xی|̝n]@MK"k)b3Iq2"< E?X9?rM@xQS.8Ə&ԕ- 1>Kb5 JVܵmژW|mykN`N[Gf>? ؤ(鱧{s>w <"Ahߧɡˎ9#J#&CZg9xL;LI!~߈;~N+֒]zut|.>R: ;j,/\SߠA&<̃fVhNz3{E]eG>@8i0 {"CP#VIvf{_K@|T޷86R:/r` \.G sC/>jL~,n;q[߾nq8 {"6) 06=5m5qiQ@.׭ֲ3l&T$vg /Z2Dz>:#זk}xO &;/).G|^Kmp4XBѳ@=<Ŀ-ٹSTJڶ@:P Au?#%Dyß NNYĞM.҉) ~N1uv%F| !s||1C?E׍P6wG kR{ܙ.x29d%km:SF'7NB|05Cn#EF1sƩ퉄wz=%rcO^`dv"zO,j/Pza~n2م-%29'M|_]Wl:[+|X|KD2;6+px*> ;.Mpa /FJ. @a;ÁzO:Em(3]@tx  Use`b&`f;GCZeu[q&[) ^]DϡGD H _H:c(lV|6ZWuWL=CoS5ILB&rbS9abyKv(0^Y6f) ci,,xEkJj E7[`Gě0GCbЌ<1"db6D1XVc(j`php½9^ũ=⽂Y c]--oa*08bWbql^PZ;r)vjAi\Գ) y)>|e9(׵_?{i/~1]moօ;0jxsư3ϘsTQb Ϊ(e!^eW2'ENsI\-Ⱒ H;2p69b`4T #7Pxy"قSyd]G ُE0~]~F Λ i jd̷J0: 8~=H /0  #zyk=<d) b"4%+7jKr/$7T_] B$jKr}IrW@ҀC}5$y %ȨI?ylі mjH%$a=u Ԟ=8P< Mb <5ZOKy_q ^]i#>#gqdƙ&rƘ1EzLơ7G)瑧<Go#ۋϑ'>;wăyx0yt<|>+FI@ȳ3AV<\g'lֱslYB>`TO>iP0}i_{@ α}{g.`zgt".O1DZ|rӎ=]O-Gp5Iӏ4v%:|QN8V]HD8'V}kgJ#i3uLUg2aէ߁@uoL"DߪjrDdXHk4 B-pnϻ4TAM#R_JP̗_L>Iq>[3Zs$=V>Bv.piTтq{fk$r0X@>NNJCTjb=|/Һw5on⣾;L&ç,Ԥ?7*t.ZRIXUR7 b"cFW{0pϢŃ^9`\bE[3$ v&b2&UiJ"g=XR 'ૅ4 z4WWI=4Rcr\)_ T/E#93etU/M_\33luZHfQBK2 ! YG*wL 酐V,k#NEmf3Ne8A5]a M¡hSӪFKEC?oͨS _Y]Kp y4){RAl~4_(~|)DuoŞnl`Ls6ߒ"|9-V,楁{CL) +0&N/@HQirc.2dR 4Be&O|kJ 129VОD[I[*SRE e\e7 ŋ*sN"\TͪT}./^x}Z$1J력DGRJ%h^ D49_(}ztcÓJ.Ʊ<<[|pHFټ|81/5{WcT[- woO Fen動t; $\R?uP1L\зyC܇=ll%8V&;JY[>'f޸Ad9]~)̄D- @i8M!fbiS8 |{֋ϭ2=jfKڣ _`t`A0P*8yF=${k7Be~8*^EO^ȇn7x}0KES ) y::1CX PJX&c Z8}t2|Xu@{(,tWfW5.I#V |ME)29λ Z=cq8 ؠQ ppO%N>tR$?6p:|933Ӓt鬋Ac[=hRWh~I3yS@6 FP.ҹCa0E 찼@ -qAԟa+\#uЏ\+Vp; '`=O'$tRۊ'dKж;$BV"]V^[b?NN(Tnz9X8 bI/ Əٰ\eruh(^Ȁ!  Gi-" 7e> /yɏTuɏT{ q`sF2NV23@X0#mC6H:+(8>E$<#UF9]/fK||27e %5z4^1sFP͙4wOŊh-B4ݜ e  C;lβneW9^&ݭ uv"XI̓2]y@Ne7)ȏΫܺ&a]кPUE0be-G]V~+c$/K VLPjql,x#a6:wkxL_ZL.t4,+{!`ex3dglY E,Z;ˠ$8\䒶:RmIqӥ*>n'"{9vGt7$CYZSE/lpR/5eƜymqO š!J aNaeݖ8-T;fuxVuqZܲ+ Ěv,n>,PpQJ ޏ0<iBPTߛ ^Qˇ$k6(S`Xe,!ܻ<{cBNM41h,qQ8AᚒCz6S:/i"NJW&X̦X \7S`dOAn)貔Ou dN)J tR(xͩ c L(Vhp1cOCnpi4j쵧z"yrW.a#hlF@♲.FЬyQ 8hAs b nx E\{c/M&߹ ,{chIZ0PESrɿC2.uRe] 0x6%!Hnũ rYEO_?#Jz 8Cq6o;dZ|2hz,@d`GbM>ÉőR%k̉0UxeQha- he1RL*:r[W?gc̽-vѕʾEpje6I1VʜBiI{ t;ԇZp]2E~S7 5wNdL/'񰄧 v7OYD aiAOZ:M|uRSdiNwF 7[[) Z чczMtM 2?ED02yuZp|pzsigH[NJx1ZE)۔MBMbą2` ܢVYEBY%:NɞOSާ3Th 3e@ J"n?9)4ij*ZM}D?[2uPYQg>yZ?Vӝ1ˌ%%^3-Z_^¹X# B&<qqgW:p}Qxinyj5]q=ɶg_ iGH \n"LZ61^>_cEa(j`6mh6!|O{G|Qlh[a<5M5/)XL(t\!bh_^ Y%CuP%:R轇e{2ךÄԹp7r1ARs!q ʐ:V9ażA"_f~Ay6 8v8lA΋mS.s%dw}^ѩ01q05/Ri<%%^ǩM0,a*/[mԘ/#5R(+|t9objc(Y Y]Y 1դ6W|F"faZ%F/0*[!-]0YE^khMr@g$5˶ U~$ &(g|PR/*i{9`;X$"{Ow)[U5Y.cg?8 }@> yT;goBph(] Vl.dYM]h~ py[^DhthP+j.;d]cUg{Y =3mZw{k0{ݕ`@`UvWU=\c6s׺K;ld#vc|3%&z5YbJػdwٓ͢ͲTζܙ& F|BNEIo X"\2g*rWEȌM:5 *ɪ;]?W)YK;d,J7[(l];DYR4!0և<}%Kf0m]zN[9k9j_F  t=ts{Z,/-"};-ꫨdHxRE U+( aȮ-1TMڲ^$)T?#EYfT+TUs\@̢'X40_Xe\.\Q4 2i}11BSKO>#]ԇON!ڍO~6J}D~[ WSQ7w~W|wkRq̀SveC^eSӟ*BBp K:SUgQ7L);uܮӟQ kϧ*]?Uo*;~D/) E〸*W)wh):eՉ2}v^k]njw޽&GNIA(HG)G7bE{X{E;馹٠kyzy>-=cOqx!:fB|UB%yy=]m_pUAnp{2a]0UvCUJtGF?vٿ(vs=+AˮeMzs7hi(B~_q@GvSzsz}I dRMN`Lc v?N[rP&g"8_bΡzXL<3BY-6+zPz]+T O@oyzێm`]-<=9^Sh&6Z˵?7V&Nߧ"ղUE]&5/J2׆2oU*'e;G,#x$DC}ɃdBQ\+\/ǹU)Ep Pj;eJR8" @:`}ݠ^3c r3I\ H/oo)H*7|[U]W.~b|tY]xUܝ:;l)S3 Jא,_9KNrc,^;s}DE)8|r}ɘcQVb3#ܿ4mOŻb*W~zR|A-.QGMGse +B1Tg;*;c-7p`wo;0y:t%yLd-n(wVFʖq3a׵o x+P_ љ{9(=+:ܕ3~J b`+Cze F.r_m&2? p@ji1]Z|Y{4#׸lQׁ;X=#N[V@~ V/Og)/Iy.t^wF%u"b: b+iEaE>"~+_UbI- F%hd}wm׭j^.Yƞzd=~'Rw,F%]I>6G zA|=+_FY20bG4GBUjwMá[=Bp#%s&"2#0 `xY{1f@sr=u5K{S]lY98"^Q'r0 fMGvU F54!Ue]Oow_5SF87XsYta.jN)F++M>)BC~Onvp`G3Dc{O6,8QE<s 0e Hc_JGN|$%orfV.4"PѮHŃ0 f C=}fۓ@s8?h*Q,MW~*&N.'뺲%حjԍAţXq2]#dX\]t}w kD3~BA/.Y|w^ c řyq8L-9|t?IUVtRY`M=b<-B,uG(69޲}6qv~63/n4AkX皢QbJ ͹(ofpMsZb8Qլw](Q?̄j+(m:⯧r Л!:zTp|tƢ rQevjl%5sY%JC7eׯ:3%,+y>+)&NƠ `Y]w1zz+ U Ò^r(sw7=BF6k%Ȑp |ԸF<ÎW FzC|=0`~pw_?/K%"i g4X>,i~o~X%E_?}ޞw[_v# sW(?U\7w?_,L97B9š1F]! 3GW814 xxZ)^gx=Ef<)\>U?RYQs3/I+ef@) XɲNi*@?wC}\K7+/>S@W9XN13.WXIdo ߅ңjgd7pٽ5@?zb^) v5`MQ|:[lXÙ]P+\ŗ}S&Cb:5'K_2.&b^^z5E1GGc1!}fY2`ۋ]\(X:,3x`bHo_*oڧ0r+L 6E~F^QM٘¬\:cg"N'FuMw6}9"j m#!F[aQ#ImhMBm`ia4`P+ {Y1^zapV}@Z BϷ_?@Ps H* SiG}s4ɴcWqf yIǣ|g{<6T/DfQ/л\DdT׺̇!Ԃ?&VW8WTw}m*T?Č%շX 7>cf Pm0jSu['6TpA77҆؜Kp(# Q0^0֠teNǹ`F 59@9yJm*xN~)U`ių9ݓ]zL!H]B]EURײJaEM0t-+L9Uޡ^q6*5Qry yh@x%yq$Kj ڝ xjѐut^>02K.Rj/`7V>MLla*߇#7) [/O8] \?Klgu 350Ql! r ]Z}>O ~.e*;RljKfh?ƥG3l8T'a,Zs %$O }Ds"^#y٘ R]e!e9mv/b8a)f[x}F8 U'wԂ݀{_?y]j|Eze~ml67t]mvv?"׶pxD|9gE7(%!6/+3w<2-;LG0BRχ/??Xcۺ?Cs rX_۝ v .mbۼ~c'M.O|k]6p&pK?:,r,CRn=6ps|+) 8n̽ Www^ߓ>'=5>\KAKNJuE'Ю7FyhMOuKx! X~`-kˬ-vLy z $?Ͳm7m>Xu7}}bx^77s JZnl#R/8er˅#0+nNu5@kuzMLٟSzqx**i֑]a90?YwU3xxq0B}ݬ$) 7t`f?80btpNLI 9=#~0;k?߶px`)uЦQ_^Tйx:ܕ9%1} MX=Gi m& +v)SFd&5bU? UG8f8U'8)A0`_wB@nx cdY{#3tgb[WNp_Z#+'GGL ?e `F2!SU }" oX1OJV>ðoc`̤G%"siw|s1`L`A(~dj\[VEtdf&TPt.D`HTW`vv9^أ¥t8JkjNβ&UώA0l=)K?]lZ+Z{wL-+TU`JL}$MbtP Ɋ/gk +Sa>G=d4|>n^wPhX}6f7)" A%f DMc\Y!j[U`a!` ̙sbaFg/=QWӞ} S3<GL]r5)RKIOprM|:Μc 81De(\v:g7`chHx\f.L{YCUP05Rgu]+D q; "=Z<1DUΕެwo^ܵl. d Weӌ}Ʒ7!Zsk[ _M6\ljD'h}E4[1_dj.}l1gl 1&|\r7AޟpmI@ð$A'"FɯFmnKna5z1Z.;)*(t(nQ:ֽ =baL~05#jaZGv F)4A'2xl}gPDmP~O#v3wSY[#lE%jhٝ]w/A#jJC[nZHlfNXlt66ڥ(vޒ?E%,[:@'°=^PPdNn#ɂ?&D`A9\/> }1%J7%ÒyT c8U_NT7sOL4F :F_¶ A/&+/D5h.[P@֠jAYTC2ҠozhPTJK!Ktk :G B0ҠQI~DA]ǻEeAYSKzԠhP~^?4h.xD Ѡ:b5hW &SKz ݢf 0JTn 1֠GIeMΥAri\77$ ?b{4(A;ZY4Ҡ39S0L|JZFpSOu#^*pZJk"9;B@*L|Ʉ$٣ ʧj$LenG]@H87I2ǥQDqp VNVMdK!\cQ)ۂ$FQ2OnUɺ# jAcXon_e$h'}a+8w*pS5Nk[xa)e^K>G5q@WϪ[Ꮗ2(i'J7l1o |cd >H }lB0D.D][Gmj0?قfK/Q L'/] 3_B;av $ Z!Y>'")nT<C|܆R !ҽƉb+$p*P)|UvR3i;sm$b'J^}N p$щfC0Ps|C{ kz0=8I' }ќz5n^= ~,KV͡vO0R>''SR(F]!^?b\->\Y0%໋PL"à 1 ] ?+¨hJ9K1&-AE2h^{ iQ ;@<'\?acw$0\.H[)s";R.=脶a8/D#xg,)cy2.~R2‰&?wGnHW֍õZlmƼ/wW뽻^ɾ*0f' wh 2ܦVh[Bu9|uwB>NƸ2U='9d\=8K$>2"S$F1)ށXq;Suv6yqr%G͟~I0+ǿ#ƹNjO6͌ EReSNpAm -ΓU۸@nȇz!8A~TUWd~)GH;s;[Z!Pr dj6<1}>ܲ03\C5{5QSbQ8圀SH:A߲ɦGqئsfyP_zs@$1'eEN]{8^%|d>'߃V9У9b3}tmȜ,'AqS4? P>Rӷ?Rp|ٻ.u\^w也MtjcpHE>e?K3u爚2K;|lg]͏QlKS'AZ/d$U'% w$n9E=4꣍|Q釯HwW8L5FuN15C{ꏏӏ#$(J:kdF'g@/>jC3QOE2`B 4?ЋFɔo_O{:v ⁺sScYp@y*ycũ7bNʳm\9`#hI>(,|$Zًk=Ӑ[[A3SN1ҕ(R||/SVN[}Y).: p0ſM`dy9 BY*p8SCg{ޘfY0]Mtc|ѭxb) V6[-NUh`idXjJU|g,fuZK*Gѭ=w*j]_5&ci3 /]֛8}F5Erљy3X+d.CEOE,ZV\Uf.t`h֡7l!pk|> ݽ3ގ)Vpmo\dLԾo5?VK!vrP +4߳Bd>ly"hWZ5qprt:1&J rnLkw|"bGh%8#ݷeCnxdK27,:z? O^ֺz}&/joׅ`1 >l =J@8r?g{F߁h>r|?0ctVaJ&,.r.ҮϦ4]9˛/6_x D<]QeM(2$C1Đ+utXX6{=sҜBSKmѕ/yMεKAm>!6*{xƥ*79w% lݼ=t.ݮQaf`gfzh8K/}̔Yaҏ /skB0G;gp2z=9 HU^MZrXV"L/Yz4mW/+ZCekd \J}:|@#BgVKD5$`@bV>UK῵φN0[+' fssdb@4_b}ZY`zs"}q2 "إ^@B=O,I'7 P8efe[,4~0{#z0ԼnEfqpI>=>8Wl.b4/^}|̫2h9^KO>vx,9[ُç$t&'>]5n A%k3d0P6@$HV8Qـ7R)Of꼆"{Nc$z5n61mW}P@߱?4V6{vsZgd`⑸#AHLXx!g`܉/ ܣoEޥAʌ븛u؅,5:s.D`&=Bxs?.7‚TkU4Facݠo$,"ZEyJcT[4X"1b  ">bBetm#p] x8ъF_4z h}ՙ@Tޡ>WFG{LO&RO'Nf9 SH)MYcِo3do8\ tBA߫}iN빁K9 N:bVB<Z3;ݵ / ޟhqƠFhvx#Nd 4 фCك^{Cpp7~'qL-EARt!Sg2>??yz tImjf,ƿ0hQԇp#"oh ̋F, ? ZCAyӳzXU,o1SҶ;% dWM=SшЫ8hɲ|G![e;*|})U5^)|b|l*ދg P?srq㚞 rH5=YfǮ{'&`d l^CZҳV0>%Cê*m|wZͻNs_O+$Fذ%ȳZ`bQg}dАLvkYu+3zNn{df_Js% l{exGlxi_2 8jd e^ 5/:mpr`w !k~DCgp8f]ssxʜ] P(q%5^ t[}wO.s>S=A¤eWCqLs+t`4 1g%A3*s?ZzI);q?+CD]a}vY.=ΩXN4j!`E\Ocn!HU M/#t4xڽ]\rT)LyʞC 4nq'Ǥۏǣ)ujQA?;A|6U^R~ AKP}z}rjpi4jszzx~sR {A5LG^}x˶!uqʛп <J >r#~mUZ.GSK}#lȳQF0Dc#wu;/=G84a:ͤ4'nY֦VH Y +t1a5d1cunnR>aͯ;+AO!ag-z7E?=Gį֯PS],fc͈ p28*i()Dնxg1DQ0ѧŧMOkGVYTݒ r5':\c3-)|)7_čkҔGC&r\ekWի$N8!${>kLO #t2p)uL W4Ҕcl~ja6w7,;W8G7ywȌSD0sruEĤY6q_!zR}.+Shُ̺s49ܒ\/YnfTs~g'o&(}nQ"GOD֣Q1K?w|9:Nx"$T{|u?.AT6*Y( ̤å&eYv&)QVkx_ .>Y1PӚ/ (`/89aCgHAp_ O@ tӕ<6Ãͫ8dls7|ֳ9_t_3I'?0#G@~Ш~Y:\"lZ=Ykz!3lM6GgIҎG ٬$-(* Rqz9t_'е/=tZCY )M>_K/ xOEB}߱r)Q4:>(*ku~'KRZL sB8w9Xj]hUMX!:>823gKC=`{qnj&PJnwM0^.:{e@ϘtO獃fNRsRD&0rn [/'׵ 4t_uyLp'4[0?zK\}-['UaF f`[p2A]'a#k|s5Cl޼󦯳 &$#Y* B<ڒI;!~DS9 1tz%& -<*z ΆۜSA/6>|0#Hmfz˳Ĉ`FJxmDy[^; zLJ%b𬝻O=I_ur^H՞tY!,ٵ:]Ŭ<ÓA?߱ޅ54uα(i_OjSpO?/]M#ygh7n '"HWb^F۟ gI|=­eoQUlHݳnIg/$wL9w@G[|^JwΣ y9|?zՉj\m+dO:n|3m/*,%@zNg"݃a:SN1bJJ㷐ߕ}Ҡ'myqv2g.[0TCt6^u Jܚg-r8fcwlfA C{Uxmcɩ}$Eilp]и*<y%$オ V~UJ/BћP C_; \٘;n{4=GCcK2R.zܭg[wT(E+OvЈƗ- 6 B/* kmͮ78U.㭨U=H16=,Ѻ;SH=`5<'&,:))@dR4Du~Z,8Z%p0hJ <7(sX01PK-Uj8-YND6;e?EN("^w,Kw#:]+]LqW+hsU]fU ρl@( .i܌[XAt%H!aͨxD,%k.Tz 倅QeE1L" I^&~~L:J)lSmvt9w\C&:i# 9Њ @!496U"o¼,G7sԨJ OƻQTx~kuDPSl8,S٪19AN_e"`c$%:PbLô xח$J$ 3]N΃'§_=ƚBhOfspt b7-4K^^Ykz#g +U`[ qdtt ^ Y&9=_/Xb/^fEhQ^w4p+ ^-q$ΜR0AN~#n!HI?6wUw-+x~SĉίL:Kg)ñ`AayqNZڃDiZ3z?ԺXor%~J:7 F6#bD:MNM#ݜ~wqƙvTY  Fr6sW έ_׹Ȑy&r4.NDUFWz>,ǐ/bn$|*J<+m$S'Y`SѴaw$j{塥u'80 ]ɢЏ<[̵Ӎ!jۓەnxdӧt!x -#pN&'qy=)x` S7بZОaq.RC'K)j) 'Q6e0.k`k: ؘe{ݪ}?nMua!O}Ќ|za}:lu @!Ͽ!F{-U.,MY Jyg}ņbQf kuЅ ۬1../e"%UĐQ/ rSgp|;6^8p S]TdY}l%FW; |'j!3ٛ.һBy0TkE}Q PpG_<^%=֋Fk MgV^qU\"<Ӗeboaz\a\ܘ_?XzGߖ7DxZ[=} KWtrh٧fnq/?5.o=ˈM*C E[6NZ.\a?-ވЉ5m ঢ়LhG[X]*L(Ӎwƕ8Wa0yro+i.!_G *yP1v=؍u "ٶc;i>Md&5n"Es2t3€PylaK_ѧ{ꐇ#gVmfQuNzTa;],*|^37s5tqw]Cя1`YFzܜWz@,#<_vN%>JN[3jݗy!銸pvみIz$9491f8m& Χwp$bg%(^vpcr|6Fo<)zG}㵃U=#zxۊ\z/!K] $䢳`{!vw,SeP̯"%Nyr̬1C pi!7!|uf.`e/}OX\9ޟ7_Diib}db(vBJеTp DÛc45 'ös||Řy=,]5wmե4L&ɻlKKxEvU_{,\g&BalWAĸChh_ރ!YpA y_ϡ-jmm} wXE*-IJ7«2Fx+UFPX(>>Ϥj|h`~n]5Мղr([ca)LMkւpyckՐHW_߀1 Tؽ1jVr%V.\*SsŦa )\MA0&xE"ކn/~8,hIyz`)~H2|F#3(t7ea:.EBÙo 6`̦&" ڿBU URn=TF2F ۪3f8 a B:AU6WYty _ed`XT3J:ˉ.#wѣC}Vx*{|J*D$$à,{:TIS3kV=.h-5-^WNٯ{-w VVOCha,K"++N b089:CYC鶈CNca&FmdRFzl홿܏,ܷ9fNFxk>{w CWQ7[ͫCʣ܏K驧~$XzܺTk3H93ÒM`  O8_x" w!ן''y݅l; _=8j\Uus+(9ut~8͸e 7F=ςE-g$K%?ؿP]~W M2a.`*JșKm@(zqfEκp=ʿTf#ά[6PF%˜&)Z*V ru{SeYE#Sw(8o`^AʀcY3.&{[Hʷ#738d%U-ĭ3qlᾹT7 Lp~gsu0 8b ?kӳcT禐2(VkQx.I-Qqz,(eylޯIsW _[ '3PXOd~eUs3$jL}MBD\ʮ&%IN^i冥8QhO#Nϰ `5"Zea#!ETGl1B%+i5mbF#6{*񹞀fY!BXʭaC=0rVJŭ[U)SF(#~W7RԪ$ϩ5?)SwmӦL'J伶]Y, Y[V )բǘ2(sPK v$ޱ"3H,aI|r9M @[!ȓ'sd铠n_ԬPԤ1CXJJ5͚A{N!w?A`fT/ cuO_'fR] M`z\FʮLC֧T؟YVArYCL3ChU.YJ-x$W\whu !{ťXXEi sݎ{GWBUs%|st1\9,9 bgwEЪRy\xїڪt, {V3ۻ=&Vj~ȗCQ:E̩B1 n|駡_+Gz85] rAwme[E bvflwCܶ Xtvbm#{k?mwd*eo>mD'h`mheM*r oe$M&tGyk[|Btl_{2)5щ&a[si>?-!#P2.}9}oRZ9zs<9k`{]`}O,:b4F:u6 it0$rǰ2uxEĞH@^ͮy*eL'bEhX୸oW/rgj)pt:4 \E9(3xYrt[ Du{!r]|=XZXn'3N#vu$ 9|zMcɱ4`6-͙G|ho{0q9I— +N ($hy$9XcrTW(W! L_!{SJy'&)T㒻=4akf9vl&-]xɳ ؔu};xvCu-q-kgJ5Ц$\G36 5c-oGG)*Yv&^([s᧶V\i[!o xQieO%ԍLa0"%/bf«&|޽ih)o6/Uyt#Wl;>% Qk ZU022/e,ֻj sY߅:Y>\r®9j1n.bIk"C##cm?229bz( yۿ"]/iSPٳdYS ~/nQ0J@q"`6s}Sdz7boԺW4Ş|(oj㨂\SSH MJg8,@`(MAIIv!9/ȲL*bEj|wu$WGvqeX><(@]O_Uvb0u6pfPi'le/HaIEgGQkSZ~=-%gsW #j! KGi([# SiG sUDyЎ(a q(HʞR El(ڎ_g9LAwؾ](?(eWoªtbKT#(C}.7PS<ArFJqÃUuRͼU>~"la6nyN/^:}FuTSy eص7B]v5p٦n׎}ރk6_?\7oqS.[==57c/j?GTc㎰Su%u((khI.>{<`Q6^yx Bp  QЋ9w z:OټgxyܛHQmca9u|K swӽ|QEak]xzmdu n zrM"v)3ֈuC'j ]ɍHxȥݏ]_8KG!hmcKGҵ`[SڄKGJ Kґ21ZqݹC59KG4#hf, iพN Bk-7q.{ <.͊kjfl~as9"wR! 16Lx KLߝ ΘUm]ںD;[{[moiq!۝5p#0G6C̿$ 7+q) MAFja& 6haRDe9a,CK^b$Q9NnO/5Bs4O,&-~Aø+㑱UH⺩ 4jjm6+]nH<">*V <ɰsۣ!7EΠDAJf1;QKa]'z%2ȴRHDl gn0++ʟ̇fEs+ʥDpcQ뜁l2AYqUMҿP`' $ΠS!n(Ո%uĿ"J . 2A߼rUfuH\a`nϤbz{4TvW 1H TWh#?"']e-g%Э-{Cj[ZתxSpO g)b(tO)Q=ߍnmt=9rLiZ\p_5tiS}7 Khm<͗l8Ia oxU}*̏9ytlh"%GLgt~CMATj;grӊŕ .?ӅcԬ|yoʴ^cJq'E)G9%1=RĨLE 3ΰ> D2xA} /\z:A NwWɤQM`[W +,fnEFYhS6$!tzU03VFKwء~p5(+ hX_%RVrN#F78h{-.+&^3X\i\dw+'jhJh544+ #F^An [zXIW_pveitGh`@[0XڒK믳'OքWQmAM).q[Wѕ!ϻbQvo~aS#ҕlf֠2+뫌Dot4uT~ xG,f`Qw9]*%C5(Iߍm'1V](sʳǐ倨 +by#o]Qx>V_ <}OiZVwCGU7]񐞫 ިm!fz$U.n#췲8=>$Ĉe18<IRyFWy-̨sDGqExC=EŹ(bQ݋k{69m]#>䰼gKmZAll(hN۹s^_Ўb36uS'K`hG}{=I9Mmsar" %d@|Ę#-yEʇz1 7!EHf iAIst @5}xC*W0n鑞+MƑsF=e S{ܸyӅפG ZL#ܰV:ꉗ ^VPp@Ţ(SɣTAWYnGQxtJw"LRZ%#ؾSF+A21hس6`xExK!DbUƨ WCl ̾pzDUH7piXh 0^ҡxOze]+n96^/_a) +PY#C@|4S(\ؔJu"|XPVE!(S-tCO0Lеaqpz}$T=+`"茸SiG(W^`5<pM4GXeTL*.Iߢ˱, ͐06߹y'# !7D.7UA#X^|J}Zyw7QGꓒp!1;HW ®$T%OY M٢iYM*2JΆZ=*cY1OUbmf5QAׇ4ɶ.urB*b+rfmRf6y|`mC W8F-U{F616m-*i C[L ^'G\M: Y~<#gP5IjBa.9t9{]r|o (ddẒkUR;G25 jTՒӪWr|wU 4B *bE{)zcL}W7>+uƢhlHZiB@=}$[- Z#:CܒR=#Đ9s gҞ'R5ŽyXuW ᱺ<۩V 4c^iiʫSSVyɢjƭe-5 d+Tqj}yXyB]e {%-aΘtW]aLJAk&bW2!ef(r'm%yWyu:BQO({gb#Ҭ&EyNn>*Oe|jTawD54wH$$l5 xWYIGr DAGDC:RӠ*ҕ74`&}VBrCD. b BHu(X-"@aTEa95+Ur72Wy I1>7nZjDU`u.gӕUm]63Ot־*sK?~^ !L>wlqgĵw&!áJ3Uop D%pV.'nkAjr+>uGv2G坷>q"6?{؃]~x.7P*<Û JmZP#5l *1C Be11-$D5,iԏ:*TC3?ew Xgf&{F͓@̢*B i)ov)FQƇU)MNFk4`:fjm{?jE z4xNmcu]nr](?S^W*1AU}8E|ȱ&hR_t>74Z%t<}5-x,N-pP]1m_Z9r\FcȎr ?T׶(Ve#ѽ lJ跮X.AaJaF6P ώd 8AWx8!{qZ*9]cT +!l'm:ʨaDEe75 J57h_uj2x6 bLg"[cؘ@9w'Vx ^ NܣKPR5Q)V}dbYcXI&/r ⹕;r4ŷPX+Vx~S%CAr+(AMuXΈ#VsGuoCQ񙽝Z mlO.znR',aXt]K͂JcUy-XYIYPՉieNw[Z\Ә"7cp):%CxqOv ~tWEE;*ݵ"< `\O Z:miy6&QiO)URZޝBԲNOL_NjE*Qp|̯Kjsmhڑ #J`L ח9f0,$[t8-Y#:Itf_2<nYUΫyGԆZX0(OZ݈C'L5,m5"O ɿ2fuJP:(6A1Ptf G =%lzE8BS3[#= ةةvK ڗ(G(8h3T*V&uTe[R-8z!g=le߿ 9z!=l6oo'^1;/(c{6@nwIՔB=Ҟ=~ 99AUbLj*k:FxB[AiY>s0F<<(W`i0ݙ\R=h0B @૨lqCqu;mǗAsnN6M۳<1#a0s/-ky7i{`nԈb[cP =`wz V $jQ(EjuAsrPtKLJ-*>4g-ꊄW/(1K憐SuUdHdZl0~\恧?u푔ONm9;_E'/ý5FX\*}P'iI,H?n0oE1XS ðF+N<A"߽ \l뛀U~܇#AiTv`;viuWdldAv4T5l2PQyP;Viqy}ԑ`ӄ Q?] ($uS `#yELL()jFtKkۈD%Ha[tr hstnpgh|@~OvF0_9u (JDOLl]Zn*ZuҍS/x9mmq{"|1A4?Kz`4j߱zWz%HWV׃loRʊ땠D_jz-]ڳ)V]C"F7Kt xϺk} uIlݥH;n8PP:@xZLoRX-x#W~`Ed8 x,t6^y2@w=vT] z߾YܺEH{JYf{`u\Ug|꺉W Dmw%'7I, 3 U ^'ʹ1;~ã/#C. 曵Kj,pCNuQI6 wW/؋W{-C ·@t`P0~/xF+Dp=bM7X,h 5p%saB.L/ _+ {p>=֎ȏ0t9w prSA8'2#|DP'8 ~ " ?OAk`Sw|3kŁeN0͈̬hdhqLCG6hjկ{UˀC[Sj`\/O )0I.'Z>RJB%җBN>}%54 CƻNS0 JX "Qik.E4¼8J(V=- ̈opR< ijSB{ 1lhҏr٠'{z. z^ %Fh$OA>/a{j1$2-f΁XJH8uTD}ME$|d/h]9L#R4&,~Q}p0˗F'Cyv8ao`&g( kDc$1q _\ ]B 9;_'׻?X4fcTB/XRXklH7͘C[4pQ<}M%G%!YӀF{c$'!,.\Y֨R۞(RP*݊5>/#tVsP.iT`W$ *2S-@3hF#Ns@y?Ft!`@ptP1t); Fk>U6ɄoRT^b1? x}&[E&/TQyH\q_+ ?- 4ݎ˃חޔNdb馉J\Et(Qv>uj=sTC[A6Idy;+rU4}x@"wr4qxVzج}…[l6(;ke9 L-nV"r1`*HtBǴJe7bUQ f2ctZZILY\l23-CuOc;8xF֮*Jslp,ﲅNVS%&ߡoyIKAk \9:*m)!~ݪGꩤX_?'CS>p^0.J)]g־6Ә?r*r?j(:ɳ_rzۺVKb>o^B(7\잪Sm _Y _'tMQOUn-x}S+b)|Rt`KSҥ{To`+h:˯惘G*+<(Rk?Jďx2N^FqG曦iщ'tUN$'ǫÖn(r%mb$+UCڼԔ uWmo_5[mPkSxݯpK%({zH>gI_ѳLNPxpBذjU/8$ղ_?rݔƭ?;T@ 4n:yr|.N=Uܷ{&6]H<ݤC n{ u([]M5I0Gk9x%wfxfyx"s?piO#aIciiHMR[v'{6n[pp; srLj?Ϥn =m3 .'UvjeeI,ųK۽!u/}(NTnFoW?+j|gT&Hb(T/{7޸Z*1kH+5 O)O7i|r(3\&5ھ;@~Lk=̑i$3<̏G +v뺛AY]Z%/UeU nw-}A1$'jW?^d۶:;E}U_ Q?Qh_j_k l>DOPx#lfR6+=Qki~n0Ay)RY҂҆`\M`{/uAw9viiL,^]V!k.GC-G]/zBA-'C~ Xt8divj) fc83P'pr=D<2ET!GȿlҘ4#R\X+-Tzv(Πpw f}TOlDEK(XuwH> mi#R?H5ס UvlbZA}~c |s_NgB=P,@(Pe[sԽtrqb(f\}tSxujɣlM| v$N[Hf0>\0/N@#9*'5,_?r`3kTAaV GBN 0OI_{H1 ]TAy VɿSz׼ M:oFy$y{X^}nn!xuM3j?^E3,660$x4j$}t9԰M`7"^?khwC^?[b⽱y{l杖H{W7-QPݳ*Qڋ>.>없[spDzʞv sz}H6֊flIs31ȇraǁ+ b;P^c7.'a26jp Rدӌ̽6!p J,;J%"D9{!w)j->rLhF,"L+q q0rR ȷ(Iqc#4.[a+j^G5ki5&#e90N:d朞n9/W[^lf!= ,ۂ hϼGŦ}H U،Q^9!=\J"nwPx̀ lZ s,"bWX0ͥ͡߃iՀYp*ovAFݔk9t4!]r @g}V)KhZ8HLbĦWh3#L tKgB-U,4-8m#$$'5χ|X'*꫘)gFDEQkF5^Y8#Vڧ<ͭ׌`+ጀ ++o FU=xm*6ָq qHO<ĻE#ym]ưeR(v?GL?[۟L;U *LU}bko9Y U%8NME*ge/[pa{; AZ "g'LIL$XzE0aЁF(OwŤz*x)D+V@{6L^i@+ӹf׾*.k͊sT7 Ԇi3-)UM(B,ڇ/G|o}^W9Q.D{adcﻔw|veu5t"4 èw+)Hkl4N<H1m)œXrj*=0lW8Xe-a?`P)&C{vdWBѝZzJPM56Coq`vgtT} vHk`)׏7ĠwWJ8k MRÖ4M3 {i0nWe Piz@vxgSaȭG Ā(n)q^'taXBPv q/)B#h.~O*a{V( qWDo_N~Ha+4lj֌Pxlu7Pt h WǧX;^+ G1(4>Х)ԍGXk`$*bNrqr I5]L08Ɲ8 lSS7!ah]1#B<9ڍky-4iHT HצKu(QiִrUR"헪n{P' k%0HN'PM|*>TfS x;@u8ܟދs3Z`Ռ~X^W]Ak%8b`Xs@6O" ^#TOψDǚ)o0KVk687hQP&A;63X0jj@45Rp+j2r $Ƭt|D!.cQvM-3"r`Wh'Q&,!iJksOā)Z;* qCjQT~C u_.b}CE*]-/sje 8]!O'$C+T3ٖX k%A([53A@82%g5bƕBH_VjuNxKgtSy$PV$j| kAeƁ۰||J;8u,Zר&VxF ۷hfuҦQs]2yPa/,Fhok MKԇgSs & ˴EYήl,AxzQ2 m/ĬsI%+C픆 cll6f!Z(L&ZMɥ(%@(.ҡQrNjo./aYdh@QMTCSWn+4#TcV#LMRv֥tq?1Ha/A]қ%Ԕ NJ)][HN}LF vMV) ?\j=_(Y2~'yhwUҨa%`uUWnfdu.ݥoDpB簾.tWll F,+nӔ)7msLykb;VRHLm r&Dڰg_Wm7r4HC/2 ~[ZLJUUF;r dUEgUeK'P1Ί-t!m8->M#j#nݿBc|z`S|wMz RQ.}4N˃B205%}$QՋ&w^9Lqck /Zi ´.'AsqBH\.Ѭ?2zM_} &4#2n!80ʂtpo 9A}Kkz\a * $(7naWI1[XɯB(ղzdv7 Z'y Ş{xWMiRnDU^s!Cn7F iSFDՕ]fVmJ5bRLSKkts[޸6#3Th׵eHpCPyB/.]Ψ[5tnU.F|%T(CMյJZZ\{8͍VD,}L^K\`CCu=qOKOj+CLɥY,R)K=#ʰp7 aˣH́Q×QPf%M: P n{(Ug@c(CUBRGi+4!k8:-25CiAԓ;&/f]g$$M8JAiCiTU[|r\c9{Ɨ~"g( 3e3nLL[|; `[[Q0LK:t%]L}>1Sȸhshg2TIM$+S\L|CWv[V=o3S HnwDje%U<+F>'LkOS`S'viQ [a+EmLf[EkEe" :dYUP|$bzN~΂^@? Dhucd; LP/ц)TT0G/r mozK5,H'D~ks=0bЏWv̢_2C.ی\[A,].SGtcť:I.^vGΏ bmVI% \jd_GH΅4rS,hqrt]*j% i\fh?>vlc렽tW[EưaWPX/:7ez7A#v nmU>b37k]c/.f{i )5ǁ[lYQrAmzpH {z@pPżޔ4E[CK)$Ұ n$>5 2^)t2]8RxSqQ5^["o bhq;vQ!!A x:hi DD ED2GpPBJT})u&3zջA?wȗ|DUx%MGCވntAJ W>2&zГ7P@HuL:w tb*SX+VԎR܍bDQG2y#95N,GP?Z y!48hֳ~{9lT> Vl8ݺA:v;Bg==8)KDjb{OGcL@OWCOdP)hNzt/<u&xMQ/-o) .J SX&$nc7N2&\cͣ4AO<36!Ŝ뒮d,NL^:E^`9i-1cͳަb'E,UX'>͠7]1Bq3Cu(OAJuO;,"IsEl (Tɕ ⱙ(Pq'`Z_ʒ‹bs8CY,i1Oڜl62EPS~lȅ'#,aL#~*7K sf GC3(VzcLA>A0痉 spa:4K//[ SW?x-}]~0 nA8]!#T4W$$pIHşMWsfhʓjI8&oC,-H0L=^x3rn\BMWNAK'%G$B^Og_@Dު'EqZ<:)IR3U{Hߌlì 6lIR6l;i5ʣ3ڝAj 2!N);"PZ |l+4u7ڑ%EDH-@2,/\;Cٖev>Q833=ҁ8Rβ9b%*aDPZB~'ӈ 8huSAݻ"QaWZ`K(vmrOHlvi:Q -D5~E)9I`9{pr"ɜ&+n"dV?vd4{hg~:EfD)h^(bt+Yu)tL+ͮUR*r!Ġ|vɩU QKS Q揎JR:{"TJmXA-R-hΙ5gf1w~!ԝ",hI2!yHl)&,7񅓺au~ߐՕhJk d>=³msp`@L!$k@Lߣb6!E/g;˰jюihYEt,@F; rCu6{n6T+]] :RF3gD ~}tH|朗R6?ZD[_Ɉy{,T l1vk*y|@2-&:`Ɉ̔gf-INR^' ԏX"O}@jzGul甂žV1AɌ ]h` ^]Fi<zBY 8]}7 57'R`y*HkW2!8!G&YJ9sM'nOQoOGG3o>>:9*  i%lZ 6Un)%0O)5r9' /tv ݀Wؐ嬿m5mWR]l@A'a,$=vTZ3jf_DTaeN/ $,"Q$: -Y%XGKLx%L|h$λ%[sC#4&]^lHYqEXT7&x=I_'Ovi3!^,(r`YvH4W&.Y{@g#$>V"*Em-D̓CU\&Ж0]T /%JDI 3D"'?]X6`j &Ny3^8 \20SA8RAO9K(m-"lf,"2c!g. Nv Z/d%aZ?4 U'3TLO^]tG \U/W }W>U@㰻P+G9%d{앤{b'FFOkލPW"ⱌIC,&ȿ^% 2nm)K{Y~qf,}l!ho4n`.m[OZÀWCX x{ʐ٣x.w8l[)x rtC5u4ÿ^'1ƻ[ܐ[EXcXYw@7>JvpEHEY5v#)g@jUf@V]/#Lʬ%i x mbxڈQmbyMCL آ6#c"yNo;ևPq<{*R7*u=:Ao%!~?oNXC7,P+arیY2qf;cO s=3сYihHiqhoϫ>ʵǞVgCx 5;NHݑ>oK t#Jec( vO !/aHS!! YdwgGsRZsNٝWaW*j=ugO`^^c(#"2/dS]~~]JLoAkiqlCrmMv=:jK8NH ]ܛ4X_ gG9:NWqF[$O"K H|s;@ le&RP\k؁+Bo̷݀!V?3#'?2E/JRa@Wѓhog`=!xETA'8j}o_(9 qJuPșz_B3icɛ hu(g+Sz ȼLܯ zcQorcUeB)V4-WpoFJ<2eG'9$؆-Q.|&CZ@72>[ v%h L eC8WLZLFp+@hYm؊d/RjPÅTj|d,4>"O+ eY b]̰ ~7DA. Q*vA偈^%SI֐7 kS>vEH"LfG[OaL̖cSQ Kƥ_bkAs k@xezD|_o\=F HerThg-UYNWϬƳ-Mr)a xd秹0 G7{p243*x0'IDmgq^AĂs(y/vFu[֕U] B@A-p=e.?֫m/dj{CH$+ G!:َݱ}?!aY=2'aa3c1뗟,"RѮs; 'Ril""{% h/WImb5+upH 1G{TPEKK- o[b"kt"06o.nh.K!舟_wGف,$Y4UBfb:d)nIU Bە_'OfΛ* A&|$R_݂䙿z,klnu9 $K;w=rvv!ft==A3O?a!aGѻ!$qxs0JMOXyGkj>Y7xas]{_ gke4cJJwb϶Dfn!5 [ H1tӓC~]xGYH'%mbf""W'ռ")q]R(nx<>߮Ԡ8<]9P|+]g8!ʢ4n =(;2?6oy"ܬ!\ʈz*h]!<(tsmCx> L'6F(,Z'5pi"mʂdmPE熁`aS%H/[. dk4BNm4vrEw}]NC; CKxu5q H;vA5QV$yX(qym?qQy6v>G[kA|R$Qǐ$"l!.zC 2Xmsڊ]66' 5†,f> Qg٣4dG>u9F&v0H?8~bC y6Ą|}#N)&?{t eo8 2x*wU4(55Hjٷon>)--3O hK = k/~}@(ņ!0\O"{y {T?whcf0x;j AѾ圎8lܟol x c7ThZʗi轱 A\UKx.~0\=Ԩ14JA ћW~bӷ6/R=fz`NwzM/u UC# svL7ЪIylKmFK[ܢ84YjJ8aZs7=!cSu@#ީpҏ @\䎠wŰ^;I>roAȫf-^cC U9v-Gŧ=y6$00)*(#g~*َ Z=Kk@R#e\+|4BhYdS?6(_ gO 6 pOO֍&vlUNkD"9w"1=J4,"t! 9 19KD3"Mac>Y i̜ HGdDtD!yɈ~9VUj_%?'?[|YLR|l%~ Ox[sFTJRnrOJl=D#'p4'~()Ts$ <22oCl4;-FN 勪v=,=AidjVNO]gNz 'xkw {=}zb݂^g<}h/k7- 8߁|xM ?A\ElCa  ;/LwanCEUQ;ɐfų!,후lF Yor,'+=ҲJvTj!Cz,C/tkfy Behei,uA%}ⳑS)!7ޠ'N]܎4n=[iױgKg9Ⱥ+fAd=Dv#Oo]B`ྵyaLDL8侕czcw0ѳl{H\ߒHL4Ei^SBr?+l~gW^mu~SJsؤ"Wgg سC{zשqm!ʗ={%^z;άn\[Yf5?~G}w1kazjH@k;>q`<.=>0 W\Ôv6e=5XҎv/P@5^/B 닐1?~kУC;[PM;;&z C E!̜.7XF\hbD:02sٚ'9D; @ 6"zش21qΦZfp@2)m\c(uF^jxɓs&"s=?~qE$$yWFmc_mȂ]xrC{){%Xlb1 W" xJTc=3S*w3|͋>XUڱvҲj۱sEwBr\WȾ{(يM[`KxTzlߐu37s)?n4~}>^E/ҭ4l}Dm.׼ǘ`ؕ]+ Vdh36.Qq^1їo^} 8Y=s2p'4qNKJtޜIۜXv"b|fY5,UTrΪi5笚#9G;8'A{ekß99Ȝj#`w!j Y56sOypNKs9=S|'}nqlIFc I]$̮RW$\2y4'$mosыΏ(o?VHp/G~bfHת7Ow۷\CN+ Lvy~;Ҷ.( /Oا8:bu?#ɛɞo/9Q+Tslld;DN$Js_T8mg;{ ԋ KL Y3C ϞM~lǀ}9?Me߶Ip\}8Gy᪮z}iKOtb9>\O'>`q9!!#TO#>F<‹QC{{GCkGlvSWx1̫!Dq1R,|YZB'zou Q267Dt$o>'D>qk}nkT&P:!2s@`gky=+Rn6]7.ɂ_zh4A'~thK{Oy ]& C`!7eV#`?$ak:%d']ZXJ @CüOX+`4Bl*$,nnΦY=&Jwq#o!N}pZU&Uż.$vfAa,0qV#Q.(AAͬ[ظH6cYERBȲG?xN/t Fqu(FMs'I$+h*X7pFY`hVKоXUe_D7UP |×^Ue SCɛeVC%nM%¯~JvŶ r9Ԑ*Iy%EA"@{Tu [T!<*mKQ 轝ph,5Ux! !xWie{X\ OY)l;p5fYy{_(Ŝo|c=EEIQMm<׺U^&jEkGa;'2E + (ӿⴛRB".$jcpϽ 7ю7~F%PRnMԬ^rT$l'.&6|2LU S)s[Ls-ܾYZkdR6z$ "u.DFf& S  }"/^yn\{Mեs!iNyb%7|+C0Q-VJz8(0SR}=~,(P,yÁs;!1CO'ޘKGD-TceX KAo5p>M_ܬ:'ncm^$ӂA([3"n8q ݩ T 87/r/E2ݗ, =dG=%"қi+7Y/2 ^*^_'M@>[" V"FDVAj3Ȯ2w,ĆJ\IumOa+3?'EMH˶ycH DMmz$#G]/=Bܺ;]y  0DLkΘ^aRz13IE8f<2jM7a7yxݺUHhf*s OQ[Pc(\tr^&bw3|#ҫWGxC+0w=-)ρKj=ɈneӗΦrK/!1E"s ,P !ѻ}!V.ֈU@Jq|4  P+k!%꒿aG NR%b)0cYm !jM%Kn b^):ʲ̓- jI &cZREOk"W5\-N vbWD% -I;d09ڐ>A9#r<۝iHAx}CYg_\,5kl)ca2B}|TMfᗱ>Cz-z^QGW}T0 8E'!|KrP7)_s aaYr  ?c5W+'e⬙t->@8@kWL*M4=}^Ar1R ܫӆ)գJxiSә;Mbe6etCvB84OE#8OK`F%I6cXtR)@͔Er"=Jsk:naϥrcWB(aV7RIT`B DM u Ѭfس4.2,VJfϵ73ɥgƅsۥI\p:҄< H[33q!nr:ڗ~!(<DTK} X1q2nVܙ. مpY&蛛|Ӧi 6X%r[9|E%Kě7"U5"9 ik|?fNY-~ mYfaHE{(1KS\bh8ځQ$q32[~ VM.6B'!fU tei}|-V7>!X᷏ 2cbV=a |~ڃ88uѸ:?O H}+d.Vb6'P-dx$/$zϦN|TonPWs_Dbr^|E zu$[^rt%Oc#j^ZuVp7dB(p(=!L1X҃DZ'dYg\DK֒l|-yɱHՔd%F dK ,e>@+ahk_ԥ`mALO]W4?#T84uW4_\U y8)\w/-wˤ <»մ>Yd6ʈ#SI1 5a0JH!&Zg!TqSp\h'|^GȠbfS.MDYs4lMbꍧEw mӜܪa^ i@|]u hy-).ݶ*?j Rms{ m4q.!x)`n{RAg^Q9ΓܞxVs+.S32ye:8>%6Tjʘdf/ڝP^=/)'OgVK@(6 +m`VYkϐrO( ;-HKұHϿZiFAHXh g3ZL_y&O`ݚHdv 9}R7-,m#B?J5li:{"*4,!͓AinD,z@!\Vrb%pu6E հUQ`빼',wEE AdfE%3FfޟPHsA ^4c'Y%26)m,/C$Mjz9=T&=JK^6T@s'%7j@/Z\u6vB?" k;'ˬaTT;,)/0эbJ8Du:ً^.\WZoq7wȦ-_\5/l>.LoŠ}HF'J>QVPR0̣A ]컘OlҺ1l *ޫ۸\ mA HnLc?kN~A {ܝ^Qڲ\Uf$In h憃ACqT-7j7OЮPy~C8>]˦qŀh##C0ZZFTI w Wm nݽ^ èw &-*JNoPE 6zޟXLqMI~ Z*7.رֹh|Е{/+Y!>{STXT=Fjц}ˬTjj}iSO(+ F7J6NB=!mzU+ QƂBp gZ |X.J1p.?,mBӘ7RwUyPUs`)q &f=A6D:# |= _꣋"=of|)(}e ^)`/G-8bF("AZAL9jN-W}dSTZk̓k Z:CIch6:/zOit@֖Z51~ibnۃEM,U@>בn mIl *&6r=8C K([OF4?5 l1j =bYA$=-nvo$1@ nj 1^&=h?t`дBӱBJ;)A *ջ?/_ftq] ],Ch@/k}DL+:C!Al^G\B>WUu`4bb)QŢnBA D7 # 1ƘՅ>{$Q!zK__{-_3z{"Vs}b9mjT: UYl{p9?`,j_ Pݎo#fA3G$ƐL=]m>ap EZAm]pN:t5uPca n9xm ge~E'3+ϱySx )f@ĝt=d_.Ies1oZHfAyp72>;1& MB_t3Mo~ nF9~TxaQ}#ڷ ="z|[+XD<GqxA/q\L'T6: [qY>f>G 3Ea0ZMOJ|)WNU?qN> e>+IE/,{y-+4&)˶g #(3q+oIqq|YMyf|vpf\|njuVQA׈dKsYO^-h;%W pk4le) !fAM2k^zGt rB+*L"ZcH-Jrb,tL\?r ;s/|S1{x9ȥё~?1SsN(0L(0Ssد9i#Gn;rs<25wf@̱t3wfR4DcYgfPq3RLͱ25Rb9ŝ!>pjHζv C( 3#h#'Gnze ;37]GnzrPNt&x9THH,QcIZO G9g9Av(ELG Gv4N'NJ~_F[c,G蛥@l=O)6`fOtY^N! o_ț#`u@>Np:Y$TH%v׎D )7ȍd.廐n^j²f5 B\i9nH׀(Y=r<)%m_m'@rF W";3Kl6ܑ1cN6/'X N<72 -A0V/G|_%x_;NpRjW}$Σ S] ~hlNd{YHKDR^"-Fx"=BȆ/αVy 5L"BĬܧcQ]t.$FPDqb"F)N%sO7"N;ɧCcvɋ -*LISt3UD2sIrFwؽoʈu4J.i>!ʽ2#=܇|]OQ,KR &R^e;)r7V4ȝN6VIZ2@O !q:{ Hwy( M$e!p 4Ӄ{߉`0҇ ^L׷C@p{ ~"y>¤1`^dB~je"Y (Ri=itYn6d tSLy}"w dp|ҕͱ2IwS1宅@ 7%sv"tZ&Kמg%cE UY|9/^[`kj x'+(m<ً"S胰zvE^ҞėabVl^\iUꀫ;cQݠl[e23môᕤ`+bxb=ag e/ k2)s9a|.WSbmǽ`b 2X܎gt(X2ᯬc%~BwptzB52M/"D(#zVPN^Hi9o!!ޫ§4.'h\ud8`$*P|:C\f {τ^Z8}9F2֟%&_ tw~њ71bȚn>teboŮ ++01EZ*ɼ0Q .>12_sVEoiĴtITZHk'1R-A= l&FZ͊%ȿSU~~15k>]jvNL.9>f)7wQ 3 :Bh%m'|[O_ 8қK4xZuۮݴ\ෲg[Q};-_Zaʥ]Q n (4|%ڒ+r^/f"5!/;AIA-aۧq>F(AA~8Rr: 7'G֬5KBY>V"~A+[WMQ80ƻaFM,DoGȝ\> )fiBF~1Ϫ3{ͫ盠Mލ0U9R hJ&(j/ C # Xa7qGgPN0ՅKIH}r 3 Oa 4bq}gZ jgkr%2z#_LulQuAO8<9 xޗvZɽ!bIǂ]#''#C'2H:1rәiwia/t/Zt3\ױD mEy̪wl;HjFa7gOa\w*HY"@r&Pޗs^nDe /Gsߠ}D'8̦tP7q䂝6UAXTyѐivVG34&E+;mvA}ɰg9o"M&fv^LKw Q޿)SJMNbXSyB*jEkQ;dvLESrāwnp¢^cٮ_}vjZH݊"IUN[kcc<QӜè{OA ~̈AAq ˼8S2~Xe7%o]be'euEE+b[yZ#V SĈ(D.ULx@;LSY_( &1C:#w@.y[;XӉJ΂E=K+Qm^#jrQuM[U!! O>7+oq%x#DKyNMyTv{;/acJzjLv3eJ}li\/ΦwN \mJXazSu NIN, P#Z2Ig+:aU@}*]5V>@p{dg Շ m:'L OW D̪"֢0/QO,QB< r-ǐ f=O*>N qx$6m~c, 4wO!%!(awų1=^; yP|bWÒYCS=ע(9m^d^Q6ekE٪CؗuO_co;W0 %hP]y_j _r3)(E_}muF5ЅvkL78MSUh>'UC bJuEZ3F^G"rh9uP3E)3ezuEXbH}_\”\d1?%'eqع=8G.y]KzCSv_t #tcחKbxjthÙP0 @B;$B.P}ߵfA#`*@$2РȔ]0# JZ܉P|PCVq(<48jYt\0Q)0XBVG"B?mge|3V~#61+XG5dDz4 = 5?/]%ER$NBCoId`u[".6c7O@kII1>bJβ>n8IۼdI^o*+- N(NU: *>t1LRȪIQ: qNwwd~^3KmY">qYHkDH J}KR)fC5vؾ=hOp{M񷳒4`l:ѼX7/"6"`2;A<;w"ZqN#s3 Ե*IJx ju%OPFڣ_=ֶ+4>^cDuvR^m`9JJN2qX𜱸hjyIO1G.0~a^ hR9vTWq!1EwIY㫳GU)R']vU<&kY5M>"K)p׿r?/q8KS_6ׯ~%U3[OןWSʺ 2V&buw\9z]e@%}߿ #OS|oCA<ͮv'1nՕ=#KeE^ߔ}USnW"x[c2nװdo6՝`3F T$MXlnJ;~=X(hi+q!hQ~SYԠ9Fgٞ]19+%kt-Z$ n}`Yj4⎻3p~lB貚$ =(̅lZA6I¨=a ifei{d{ZR^ oXv S>N<Ws'+;+ޓhr&/JD&+Фb+! PRh8@+gވm-CYr㾐!iNo =x )USR?ǥ1dXWtqO!bjܦ^|55f1vsα}^\܁x7zTiuk̤(R:4q8w 7IN;#[ʡ?cXhLJ/"ՙC1zi[z8a,!㮈C qlo xl j&!߫4+4Z[hB1'}Bbv߻7 W{AbV9[3~pjs5x.v,tnq7(@qL1a҉0.M9>nD]ܤlDK3ɏ_ #^}_HDO~x}^Rc&5@R<`AP+e40m H\ڶr}LF-j qVߟn"cc޽;89s;$ۺB;y5ztSKoѡdل!Gh!LO[>R{v|ִ<  m5xЗZ(% 5J+B 1[ o B F 5_|-u (="HRD[u/|GI^:R`5xvP($QۦQC1;%a Y Iv /Ykf?D~oExzPЃTu[ Lrz9KV9S4:|fZXY mTBd6#.@Vrp)IZ\ۚJ&j#h[RM_ L;|*J=[!>I xcH˗iʼnosbǒhi QJNhǮM4a<줤uțHW qU ᭜-W1HɟehZ+J5@c7IPw!Okɝt)ڇ#{dj$,7IĠW)$ p>"7L|uC*Ov}5ȯs"7-ÁmքK2KU8YCSAD=qC:uOȣS/0*>K<^Fp`^ض)! @(Cǣb+昺0O~4ڴuVt9M+4^2rn nmǺ}JimM#DܚH_`∐M{~Fu {C=FT=oOS Pȑ?;\ª Ѱ/J^1}Wn:A h^tAK{7ql]1 Du;f}h˘JkwQ}8%wBmO!~%R iya: [aU,JKP5Ò5VKi+.TctRݗRJבbS߿m [}2怄)kCkےuA-YͲda0Tai6,[1Ia)k0š'&UK)գC:LKFu U$*6^}}b+KQ1[aJ~%G?$K]7v f,i qidĽҩAtAD38XAKH!`ɲ9G U +ԸN%c|{!pF}/[׶2d2.@C!t%g!;T cGwOB7^G0j1QNY6 QwgpO%ԕ(qe?8^=.7ڐr9#|z"لu}Ŝ8f7q@lZxR6ߺ1jG]5WL?ccG3Ra;|9 g.j>7 +_ rw3YJ 2 rTҤ-o*#`MZ!V'4ᓆ5؀.6 846NpG=X]J䣆:=6{,m7XF|_sȤcf /1OhsvudHm pJIgD'Mrl/":=_eI:NcDa1W>0;P:|f0X=ǒǻփev<16Jo&/ϑ"ЍQp猌9fB=,6cOg+ MM2XHt>6(; ?X{,-EOD%>0Jl3s(T`)׼63l3^3ǵf"y ӹf0Ԋk&kLf `gG]=N8a %ƙ) `l6E>oֱ!93zjpT4 L ΙEn9Dp*8'9K95B\%ݡфl5CF;!!xpuNɎrNr8yK9'EC'p"@< ?8q9G.9=Yn9g=Tr>a&!w >a$#7gpo85s|[q[KZrV g t"ǩc8 zgh³e$9W3tƙj<`$#'GÝ^G:~9Eg舳R 1∃n~Kf8pi_8p A| fG)g 58|Vcpĉ&3n|^q)q!4Ki.[]ru!5Nnαsa$3_?Kj/raĀŪ4 !#1 Bp2@oEU-|WnOf+>Yz!@Va0Bgng O(e_ݛ 6pZOs+d;[UvE|by؈+Y1`SQVB'YEiiPu0L0eT(e53%ilae[HT3vfA2m`gU^ 4BF+sFUI΋ [89$lGph oR;NymZڮͅoH6AtmsA3+`4Zk2fcE|@lnJe'1PMP#N7ԫQnT*I-*p.l SrWrQ,B:3_\\@f46;OΈ0LFS߽`ŚY':b}ldܙ`xYϿ2Ø_-V(8U"N)0DIzGo*cG6wЌ)PXV Wb$3;i6 S 44VC; ?h:R`tC65>h>,"ȔCKW:U֊93}b]y' KBF?>\0q&t{d{}iHɷ ߩbS]HID0؈āIP ,0 dQDؽ k{9 4n % #0XnPۙ;Sf/X8n=;`&w :8ޢ}S (ܓ3BIF.Kvo38LiZ}lYW 6۬xe,mc)T8+Ŧ*+22C)@;Mm UgLN H:=;N-4Q/C4M-u`Efpa8˻3/ޟ,^0@~J-u:ąO}PWU|-w#3+q)ޔsFqEebH%2? (2 _=.z 됎J}`\D뼦aXEWh$ ew NxIއb&/L)v%s%OC$,(i+I ~ξϰT]Ln7566cU ~->IRy2i{J{;'Ң7U<>kDqZLzC8UFU@WvЮNT\!ShlYY*$tJ^kе 4aD6+v^% :N`UTX2_/¤:c5+A-H)35afȮKc˩ !u٭Z-*Ks7&Hl5Y3 :fWoKs_Z&a`qǺ(; uVK'4oZfz*5dR]ElH7J3zC9*p;|gZMP~ Uzq D+lCp.@\4:$![j9t5:x:^`} E<LB9:ܫk{}(OUqrRϠ#ku ;~xXf0 j@L Ҙjsߋ ɔ=f1=ËyΊMd^U|\L4rRj~cR2,oN0._؈}U)yb,%i)IDbvAZevn$Wx][5pQHX%#$f$53 Nei&&ƊӬVѵPSV$u[z5 '˥`8D0zz/"[Dat[4UWV4P ܶ_m!tά7'|ψ~sBPhLkZ+ v:GZzщ!Ȧk9xf ' Z͢ ; w9Ɇ(N'Zyo#&x|?GI~45GS *J OƖex h?fK4RnSwY5q"D+Id!!xnl] Tۭ3ԏv%!| 簗]m7{:`˕gv%JdKÀ`{tQ5SS Oz?(,9Wx+xޒ ,1kC¦xVWN d0H0s<-e=n = ̽Q~Eݻi;z id@"H9!}B F/t#,ؘfY;C@,f_NBH6[07=,w*^c vfEȩ>p%oo̸?_1k63 ћn81%IO4n^!FR1pܴ|<f?%(•ŭ1zP:Qa9ΫZ" n6W-j)~SיIƤК=lN$߿.jV8}Q` Иb]{yA@shBTm?  FeEf+݆Yc@x0 .$v0E²-S}qbyW\ XgHoYYrONbF &S x\찊@,Vol,HF3!Xm`F z3U_fp5/ߢi03 ;P ZF1bd-Ɋxq }[/H8>70c@]gQ3;ǚSeLK[` :>_y jZR6mw4D;TJdžUyC1<`[,FPQȰs`?]4T" cm\sl; W֫^@DD@] Hqɧa F$YA 4ͯ5(>֛MLV쌢jr'7pfo!䒻ٚ5&pߠ_MK&MM~֗gCh/n4p|JH9f(* c3︃ywZB?Ewx po|%1LQsp..chݻ8Z!v~t >9P?s)"ab^NrP>b@uK/ 7'm^ qaT %EKiC@,`(罤Qc4e=Êr,5|Xa?'_!Ǜ%Ǟpzˆf_=3[mZv-"(c^~7[I{Bq^|$  ֵ 9 /xh9o8Wf8bukl>`ܡبm8[Ֆ I:=!=r!{8z\Z]}`v k9/_n*)AV,-@ ¿=|o y7Kvw*ЖKp+3L ֢jǧI8``̳v9u&bSb%W?gI}\؁ÄxhŕakOJmĴg:kH {rAm0CyS gK)IZ"m<0|JBFB`lDi[W & If7G; FAg.h1SZuzJtq%| v*9(LwjyA ;;z,{O~zPzR!XLT{x;_Yw2SŭKcINT*?@;Uondb5H ;8Lp1(06j<$azW0U>abr;2Dj̷k>|3P+F\U h/,Mzz<6U=6Gl%_|9)xd>\_) u?,5Ϩ|;I".ĽΥAbV; ׯH75 U/W<ۤL|*.âۭ2rUzmy+dwwZ'^ٟuϝvΪZBgܗBcyD`B{܏BޯbC @o=>!oH9>(ɀoKfWk][4tJ?tőQኂow';F:|kϸK Ӯ])g,yeyFVpR.n<Oxc%u1M&y)x93lx'MδۺT\Mws6&4;g߈tmmZ趷T݋{GXs 6n\OO1f4e2V#ǡ/>pW.՜E/*Z>U 3J:z[p(wsGSY~ *(H, @Wv7:!Uvit_^?BS]Qס 5D gI ENX'b:iCL750KlnFf5*7MMt^l L&,.h^npW& oCcӗv8[x!?ᚗ~ݽGaqc'h󸷃9\ w#C8a-c_XsD ͅ_OYn~1)iq%kR97$뜆-gA房g;CqW0qA(+  .ܮh-/_k~f!@Q OoPB_G 3ipb_xT ty CӯuGHxW̎p.[5u{πE7W8Q.-㺅u/,t7)ۥؐA5ƠA>lK10egHBb36)r1V.w3NDc 5iօadBPǺſ :1F\FEx!±/D&x'U+Y2<&!h/Cl,|! x Wxwmzmz^Lohk^B| إ)gԍ7 }‘n Ktg$>Ϥ]JGJ8Te-r[ȊTu< 3&h_EVa/M }qruGjf]$hC̸DUȟ!FaU/MiRb*gM Cfp6<[SWՖ:b+?Q,QQɼf;+f5O' }t-'wʿxBTZY2>$v˳2C ҡPخU޶(wC0)E -a+@l%E/)ԐQ4jP֌0[u;ߴ'}ٿ_y+/on)yE jsQx_X gOVkQr 6(?Ja"_~ 0+`& jm;Ր>oSLKOI1s3)vkbzE/<5YoW.1]`/Ǥh?̍^5J e/^@4=\0 7Ɣ.q=kCJ`apIUkB$7ZhmГ#1-GSS=j[L `U96/zc GT <UL0?16!JU7f>KD"qSՆߵ邼6̣@Ogp=y!XܯXE#Q7Y Kh(J>& ն'FۇG̒X?0F G4RUĝz Z迡IR_-VLq(5 M3 p9'e3]ү4okZ9SM#8ƥZ+<]O>uP&UE2Ė1f}޿.Q5er5 ~q^Y_0;?4>Q1+3%vޅYҲz;: X5{ȗp|a Ҷf|3X"gJ jM[Ҋ`ՍQƮ%Q0<~$qU\,#E9.icA}qeGA={AVj39 @_ȭ7W(*)}` >'Xi-LL)d4` lpf'ObY*AU>*?N;Zv&iJ`HP}%`?+E N]!ml,$jԘ 9S8obq s`n1F6IAH1\pkDjᢪ@7>\hՈX`c^>7<[Y2SZmFԃ@+ l]=Ƣˆ\ς7'ɲ/ݨɾ# |H$w2Ts*KgVe ]ulbVhg z, *85|cqʀg\,\[T,U:BQy 0zڮ@XL wrEb Jx30=:AhPSta#n m'CkT7s|,=W %RW#d S;Sk@A++1W%TȘK`/6FpVz$Jԃh]q)j J F_`k~v\E09Cr~58~dUb1IwnR;ɻ M@ZJ 낹4}ᑆ(C;]֛]X -7O\I ™Wɪqԏ$ڽP~ˏލkgH=δz V|$yuC: ȭ QU^SERM}yV<>>iIf O0S䥺3M˭O];O:\uGƦO\*}䥹ϰQsqNi>K}?hV ]\~w_R}~-$VY>M@OcD?~`.2k\nYSy=F*ߐuk1*Pþ_ '\-м9y&Zh+e@It-1DV]f 5tяc=ۀ*|$^2QP7č f^;BbCD%@ڥa``"'Gc W8O+T~'ˏڣV/'zv˃^26;>vqJpa3S<,s6Q#_O0F.:fƃ~Bqas^;f3):qaLW50ĚO_-mҿI[PnW1[NldKބP$)zQQ\_Z8m1qXى%/sKCҙz/[% wf0["V4Aud|(KVq].n`6)6 Q6|?F*Q1Ɨ/p>%׼brmmVT!r3waEQSލ`KRbә ):]b~hp\$Ԣ_sk]ځ,?m1Tmy;tyJRcvPk~{dHݎcǶͅcʾ0KK]&]:Z1Ngk#Bgٓ@@+xku+wa*ea7yeckR:j&\4xZY= 3U]iV-jQPv-n%Z \&KBr;u0 E[_Y~X;Ƒg.+y 쪍uС׃/ӲdMTQSq4ev--G 6dωf/c~}qL"Mup5xS']2rGϪ) >@|`7 A:m;xą B'>\FJsl>J_3Pg{'# UB`HkȖ[IE ЄXWR+E?iD?)Hߴʭ[G){ {!#ƽhc z4{rG쥨 IAɧMa5{& '1Yݨ`Jgݵ؝_xjøVu1U/ټʞtOrnȟh&~ 1=K 4􉡚Z>m㾣 L{oK'T.ե,?n/6 3?!Ӱ"j SD#<{Ť 5Gc`>o.P辄Cz f~,]x~%.Lbb5ڿrĹwGl9'*3 8_xa\] >@`ax'|>Z_sAp1~8׎1,MX1,Bv ;7;11 i-,0ׯ ;wc ɀ`cDAk.+_$gr;pj,lG} Y֭ l|oMuM s5ޛa&2LFU5X!ge*`$/꽲` {NUާkaϸ}^`>6tE-^ ;@D V'baN鷙 |VfuA|]3YN=\ s ~k}Z󸲍~Z#9zu=G\κ>,Vցa u>wF_Du=>@r| $mi~3LoJMI&KxWwHh*X4Bx?[q4-CwՇsC􁹔 UIօ!2tx̩{]Fb2oOtz7z0KRawqA)Dܺ|I˼wcR4x]5qk*C}l 5KRRKʐf(eĚ=xpE֟k ?X5i!ѣbE+//8Ee*/5~w++ZXt歋 ~|GW2DNGVtSfGb{ |iݸhn F)M{("bR.l FeS̗%l) He{uTץ {YVNMb|n7JRdԱ~O>sYauıUqaq#\DշLp3'GX[?u5ՍjQ '{U?gp;fa[^YW%kG:|4i!fTw嘅ބKګRx?C\2p#"PƥbPu,,B+PAMeEe]8;[z9O\cQ*:2O ^8ώHIx)' /H 3*> 7rLx 49LkB%䥷+|2op,J[ݟimrҗt NWLGZ+5/\睛t)e?1cOJ B^ FH.F=FgAnM|c7Ӷ3O P^4TpD8zsbt&bv^>R[_]_ I{>qNw^| f2\=鸻%e6J\i ̚-bdi+tBLz]-]LeLZU:XM`S[+xǖ9PV8zdkE>pe|ܘ41'N2[ZK%SCb(r=x :^NQ288V1 2'賆"76} h_2?|#YP`GO<2DʹMrHzr XH-ʀiO~x`ZԷ(de@ݺ3GWd^t͠s4'tn"`03gn /,vi3*T#!Fp{[0ɩ7݃]dzGGɃX$J-T3[AV"AHn!&V •=x7#/>Qɪkƨ'Ivn͛/Mlss^HNcдV5sd%4ΎH:QY91%7y+P鱵_7MA\6}oo f(wJ,;PA*opN .)72tRb"G"o$bCYls ,K*]ovN֪RE³Dd:dbY"3s}c!+c^^ ̤uO=4ay?{jiH x, . h{54LS4a2Ѡ|٬vVD%&#TB Ա'?Z3T^n]^7dEdZcN>=Az>Hk Wyo׸ m `4nM5צ5n07ihJ2[VKPF2xv{e6d!2E W?f~H9-z iBG23,_GC/rgr2  3-oc⩑)a/ϳoJ"]UwvuW^lV#=0Kh333KOy/ ^ tDSVRqS L߬%T7au I3<' k O>OpN#a0U:2/ۦI:2[zQ bX[׾T@MYSu[`a(ehbW+GlpR`'D5y"Ru4f3af )a9€r.T |%2@wmj *뜢gy(a`ȈQ6jӉ#_:Os8/dU~[piI5t'ueG Q"2P 7AT$fYa.K" \Z=ݪ2"ֈN*.bxO ( Bֽ|I ]h(&pT d3bZ*3Ƚ5w&⶛2cb2o8DlE1~M.fr<墡th!Je%uWG4Q4&y(Fu pͳqBe .ŦW#G+[+>kјޘr9O(m˴֕YѩɈHRr FRBT;3ɪʼUf+gmvy( =ȎX?؞IadXE0'-OmAQ;*% &yEr_>XיkkS.XLmIhh^TVR#J&1DF"O3[|UO/Ϗ*G/;Ga{UM -V`ed52G, $7َ&`d;Xg p0W{Z(x4v5Y8_1D!4ge`ʻhRlP)$:ҲހЮ9ԟ9p`7]# }y/ S6a-rN tn)d"gcu}gfruGjZMgN^v <1fl *5X&wlv86a'0$GRĕ=WX}krP!_wC24ߕJ8-3D U E{ rZ zʻ*^y$% Y*!)8[W~l*'lc0R+nr5ce# H;s$ſI* dٸ˲"KibZ( Ą|e džAӇg wz;Me+\U=/Nl]R(4QOD}% V(+Z*2d?a5xCjUE  1EPo<<.:XCCJwj*WƫWKw6RkD֡7:sSYZ0E`;b# 5 5i<+CC7A\ …C11e^:D O:wGDG1avB͐= LJdR6߹ wwֽ@3NZKcM W" `}jPt[kR-aך2'%6(hT8pCvI\1ޝmp5  ~F(;ang;iu+^@vINo(\U3כo5Hy C0BĈ+Vs/Ҧ&Li>G'ia?]>ύ uRJk4].!#g~ֵD.D}CV&Id@Z/V#/o=dʹr:\A/׾eă:f+ :!Km`dTAf,i&rdhZoC7;w[į4y6^pyksijPnYvnXx] <9ۢ ^ ^%ņ8rX.%C!teba b]WxZ{Dgm Ol(`޷)-y>TD}~&M"K&j FoP?m$. ix yG}E N]0|I<.=EdBO 2 ~B>68]{DCka-փˌu lҡ5dձo&ݓnB)TJ"9s|D>`lУl8PMitj='(:N衭 6*{QK^I *WSJwZtc~ 뼨(BbemysqѴHųzeM'6iKYkd|1tZ\m]1^)eooqp"c!xb<0\jd*nv5I{Fw*B(<^B]>3+E6'<5muс77BqTWoaDxͷ=c-l[!kvkLSLWɢaEy0X5xv4īr|a ?SG4XeJ~+g9$^ 'Kb ҕ"`U%0Gj MShCNĸ)m0A tBt3`kl5^L bSs0 ^-SH*ќ2P3Ze1ؓ20vY3e&&1>X0YNMz~zv oGpE2k!whffPf'KJèKJ)`'_P'IΛ-Ȝ̓$1Ee4˕.R1@8spIv7w}qVP@1gA/Y$Z:J`78?و|Oe#zѯyEg'AG {yKc $>b!ĬET9Y XHk-0MRjp2ڧ3Qk84:O* )s RxJR˹`kfi]!iH8#I&y0وr܏ '#Ci-i|8'9 OaԀ'ẶQ5V@Mx!V*Œ_~(!Xz4Qa`{MYvd4=L>Dp|73q!,tVtԝ+D=p)hS?h[錬-'Ǭ:5R^v #kvyV$:4fþk7d3䌪a[Q~B}K.b3 *@0Q˚Ne;M/Js /Syb/1mM~\KaƷea xU) hlO]ۊYJ஦l}jgoɔƶ&f~ђ0GFVob zޝt AmUo1hRG5^Iw=iiJiN鐜IʽDFR*emF:mř.j+2h[_M:eɸoPQՋă]oW@vݱH>+Opa1JU^mUB,mm|)dC± 3b-&ڹ!lnH7ŵ$Nwn+<)r+O>E ? ۀ)&tE7 QSc7R#K7z)"!R'ޤS[LJvqrc&Fm!1G,H e>*j*Q# uJ56 łZ'Krdp*y)4u[SUBBy0o;(HOvfD m}kLҕQBi:GXfw̄q/h\4Nǧ 1eOYb{[ѭV|^CߕC$8d C)8s9].3/7%nIq~PNiː#];/U%ܪΡvN8,$ĢD`6Mv 8k]J| kM6OR<'7mk#`[[r œ-S>B GdѪ]LNP&ЉT8i(1P^q$kh5ڌ (* sXc*ykGu ȧݳT4O23+z@,Y-$}8]ECa0ɚ[ L:jPz|fS?jH&`ZY9Nڽ4ɐ8Tf)N/k6Rt;lT%Ce*J쇅 u,wpTA~UN9M[>kyKx bH9Tl`fh5W9}k7YCToSJ;2bw* c?_la^9ghⰧċW9\+pS ƌ8S  o`T1IjxIL7@yG|D+PbJ`0u1=LJ^H/JP5-j/}fg.b+gIuZ.pRjUhj]yި[9e)ۥ 8)_?ʍ%*$/]+MYMs*߅`kxYFї]oi+r9f;╫S)^<˾?5N!|z"[xz{$ߗ5.翾/o vyC*g`lh_X~Vh~hͽZQ_/$7;$Ґ$5/s_H9~y_`0^hz& T1f<9.ЄS ׃! P sa&طI &_@r}455ңhل/:L avcDa tEop)~='*$Nt&#s!Y^A1̨qF1>bas:9Vi!|^QݿEm7#덁/"0"-.{[f@O'IXIy J JI!@%G 0ZZ+7 [Q,5C8M5R!SGhmz^"[1 I}!( mP.H,ڪr/[IVD<[V^jvУpݚn,9N)rCyeM @42$L.h\0Yg+_5N5VX#&/G &}1Y([֙⯘KG׮ev0:EᬲW\ˬ!/3WPj\dOLs?R{hݢB~__7S~ҵh XxVQ/40~I z _tr Mu#4ll`+(H-s NG{׌M8e|c?k*# i'v$C9 a\G<:ÙTo81:9 n`\?*fD 5 ʭUh ;h^9+hͳ6yv}r`Tf~JiJ+Fhn授νUi]SeJCiό6rMK؈] Y 6nW7JJ;YR'$. %M;+NGieso360*3Ӥ3Mc+иRҮJK҇ξr+@7H6mzL>rL8p-{?mx8 ^F%K-ˇJGn!x ߲W?0PnӟGj?MgAHߙ8ys{a^&I֕qij7zEvs>c/5=uo &PI # -  !  A{ECdI0-: 0A`/Zz%aʰ.@5L S/.^7[]# Wx <BʘlC{qm֩u0_LhQ t80-ev)&v&ƛ_:Gg@ ^hH!ya %3Єyp=/8 5*,=Yo_SR0.! Hg1D Ӈ]:w?KI ma:s %#5u 4QEw%tTۦ(DY?wu9{T&;Lt;hXnX*u^bk'#lVG7xüU0C&|J֡ڛaIXqBOduXwa\"{(c+|O @WV )9*p]G;X/t; f0LcN-WC'ORunҀ b &]6nޑA-B:woH4@hhojc9IҜkPCzC]L I̪Be7|{Nt;1\C6:-[ʤRʦ(oo+n&rtEUp܌;/]Wm|dҥHxcݘކ)ӍC0PB W7|{(M͎5i};涰$|7`בu5>]j-&dmpὭVQ/ic'q|ws:}rRkl㳱֍a%ޫQژ+Dlb1q#OP_sbM" Z1-،xnBبrF<-/Pp.yry9kAU)dӵQUO_1<π@z lg:݃YB[\nsB]=5dwZfrc]&Vi#EL#ѿo| 3kQ3A6p^}Oaݎ%ߘ-atT "; X&9mx47(D]:67sPŋe^>Jb$ =xv}aYCLI>Y{+1oӏʼn5y:H ߄nr:BVcKb]M_YBgL+j r|᷉C;G29| `8PqBG{/dPaI)lvK;I`.s؅``\o/a6Y}ǎC<.Pir%b;~EيxWlIPgt3YD傍 `o7py"zt-wšri:! UR͛c/]>\71G92/ҙ m7['^~^a!0hkL UO{y(}d]|Bc:Ji]G@$5;d*[[]rI4Lo0̥y0gs*9aA( sGa̭0*\  9a@ɐ90gHڑ9q?wa2AnQQ"i U ,^b/Wk \hLZ^[7~PzKNdڻVBuYxhJa_f~ BpgEFO6> |Nz_!y6u e9.'8̤B,ĕgJJq8!WJz֡ a~Κh+:Crl?.PACmMS"s|=uD9Ts;I/edT?ofŽvS/O&[y3 A~鎡ky,g\| y9땍} UDZJ@iɉ+RA̖? QauqʤB%dh+o/lnAUb!J<#@d4Ez[79 1DW&"!j#r25(G"( D4Nsf9yhVb晟yݔxY'R'u $+n'}j5s [.F$g ܁xN`/;(s'U)7d_R P݌DF%,Pr_ f=)T Yxb @=s,:҆JjwKtQOj1dI/TV*U}˧8,exDwVfMUO!׋W:ヹhdw;B8Y5zkF"<#l_rT:>'=7^1򥺇0ܻQDBBQld։Pr2RQqRɆLuRh>LO[޾]w7{>Qd}qE‘=M+ׅTbE uR-NEגˠWzk޹!ȇk;HA}췟0w[7dU+ɒܽb;Sfy1i}CcɑIq$ })$TE ̢7l!H)Fů vW@)PeL'YYe)WcG1A!_9~ M5V*Sz-kLچhMP2K ,laf< }Kc0c-Ԙ1_Q\`~kDWF_-sq{r\1=9s&6L’2ev44Z|Ѱno} *thPva4ّI"CS^ڝ ĺE 4Y*2{]B,)C=2[ BocQ"Z>iԏ,H!q=؟']&cL3!;سR]LoWsw:"On*[b*ym(ryNg[QyBYŅJh#lߢsM!D6TZf$81B3I)~Yn~r,yG'iiyWkJ{T5i3ŴXT"QZw'yltwXy{0'mOfv5΂fB&csX"EIeЬҺt2A&Y.yϝ8[;gҏs&229pE=t1pv&&n~ yPPL.I]'Qv+k>, g}8O nB8 ,whEV  $&"(b)Sj= >`n>"3Ӏe%D,jUb"Oal:SnqܷhY<旕-sIX%֞m Pд^kԵIT%;bAadxf8̃tvGL2iA!J xNJj))Th\ [[ E=)qοڈh>v!,#z_dOxڬP9l_.ɓe3oaeށ¼ H\ʣMk1-2>BO2ʕ_m\#4aHRHʍG$_՝>`կ6RVi[eŤ'PvDHM[/K@ ,0lY8TΠ&ufQG𡝶1=gՒ3Ap &ilw}aI6x'T>.Gh{V1LT ܠPuRc5-JY-<\Zc,V3 Ype0H_x&ٿB!DygH\ ̚QHA /j*3% D{rPEC7Qq^ e}}d:S"@]Gj A"y6zy}[O4oB#IPpdL&" !Qx Cؼ!a*6줅DGi tretņd/*{ 62I5%]*{٣2.]DXx(CUwaL<&$Jǜب*##S h'F!6^kS%s}hvwMp&mVeJ. .2ra`?Ac50HPUdQ t+`B~bw4!סWUQGUW8V6@gNfF[>GM~]QTiy}TG X YY2>NV+!21&3)7(3,FJ~ihE:>n,IؚܶeEjХ08AJgTm])$''/mcݝEf9f|OXD9 C8͵-ި= -'EB9u }WX '̮W<ːRJl"Y.oD>K̺ YZ$ 1 "ok_xB:.IYZQf̝G4 M\cm?GvXoBdWNWMڠTA+:ElUͷEmUW_1Xҏpt@ v弲C8ڤ-?^ ϳ*U'[9 {4e<,joV_Z9R]!;^=ç3Nླྀ0(8nOnZ ښ'KTyOj3TW'0HʺX;DÙ|@qwjFIdҮfɡl)'V:Nƽ;bO(H. (B2Dawttl?DP&D[Oڔb=;%A уAn#ofZ"j5vVhc,*Xd- *~ADUju4D1aM&$A.?5,lBiΰ9 FdG!ZÃ)g8O2ٗU3A*o}MaH/7֘0)c0BUu[f Z{K81Dmt[|:}2rd:6t(ɇ $ACx:C׳XCP gikߠ%S۾ui."Sܯu/gar3!xH v0+>[d\4Q//U'I$ asLDB7/F8o`tJ'vo`ZMOQ8ڐ.q)x C#*/D-1@ :ff:ȱ{3p%F>%a8V(ڔݷ'k34ErEWZ[\Ȥv;wBf%H# ܟ5Q3lxk+Ea;- {%tp%@-O=^W6/&g7 xVd!OR|¼Ix]%}nJỽd1֤+{a}k:\zbr QVuc( L7+S?,4Szvs+@s>m7ma~崄9SXp{JnU7ۃT]8[{8Hv@~X'i:o~&XXb-17un'^@RK(7 MKB4h_JM,vqu+иio #_xE\F5QjI,جk /c@ak$cVO2ljI&!]eI֣\ ox"G UeЁ11 3:9ЁA/eSB@&VNY٧-c%imHmYQ t%1 tY$nGS`_t(-b5E؇<~ QVH@2§,Ó4KL#4/NfLXp95ц=kGj骩LU5X0Lc/f\{fґ$LS:7$HL=X91Z84L^R~ ` ?\kLJI auf\o֩BwQRScP ]+$ZC}g&KyugɢP6C#/OoރYB)dɉĝDC!Z< ȑ1ثHi ?,L-.8p¿'&JVrE~0ըSagWbum0.N$Bv*Xmi]l3çJ gY`+z$<Z5ג(~#5ӥSHۦٷ X)o]6(m̓qU}0Mry҇Ї *bgOk{?A f|mx{{j۬rC&]tuQCU_d/Yrd"<+~Nƫ)Նjw1;n}bG5SlaalSѨk&pMmmԯ{ASktU6[,ayمAar O]m̫mFG#$ PuL $f}JXhѝ*0޾*?1_ʊV1M7IʱKIӾtb+_=x=i>՟1uJ{-%}AV ͕4O@G]Nck\ԏ3%oȔ7TyӚ۝<̤aU=/ƌAse[ZAEm^Q#MZdQ#3GNϸܨ0}c1xJ]jSv_b@A;>׵[S%0h h`bSFљ%7Ga14R>UaHVRex10J aBfEm3@fH}!,!kV*1j^?_ƪ֎yy9]u7ʏ}l1 1MRR'MVX G8 In@򢓫m[ ^orx9`XH"`M,竇|Qhi+9]67ZG6z|弑C9rp{bgLY2@: 0m+UcKD햻w]7N9md d[Ӝ/@=KtɵF~dݩY1厙=cmDe_* mcRvfmOdv[k{G`_ nURc_B;"]q`ɓΧ]gic 5Dl1Smbf*m~#,Q׬Ch~ [#iQ_-_shhlꆒN$$/Bvo .ӓڼ9ڥ).xr߹Ȏlw&ę~kjvM_e%"-м6\5BgMu|9%V;\^̌^UPf쵻m2Shh͂tMBҋE>֦Y H Nwpx@Yz.(m\mm?\*%B+'-bAi5^t'~QnM^P;LY ȷ 4XVTyfuN{mRx-202:l`>lub#񁮾auc559d?}1eM[jMe%|nDBSS{Hv)VTS@ɤ9Էq.n]2X Y I~,3ug +pGqYW*HR@e`TnS O>>Wz pɫ I_WʵER`:L\r[A'MS {Fث;c eQ]|=bxjÏNvtX;f[:%0B-? RS7 k/Qr\ Qd;5<{gF<@b +#SOyWC/TcSY~A Ih E&}&C`Ì Nֶv,O.:쯻:BO5au4 'dQp}BZ'O`{7aR LqC̓3MCRR U\.u#/$v^ve0yP~z u<=lV1.`6ϭ25s#޼w%:1g[pF!Umsr/2_S L HCF Cnܾ1 xDcDb|n]='I0"2jwa]S#@TǗ}~"Kw;D B(m2B1U@+V7D[WCK:I9#8BjVg]S=P>c,/n&$}v@G#ɦ:9@p.6ΞPժ>Q5j2&~#Ci\zr*oծڽ/MHƺpG9m?'YIl9\.1vgv5>}Al@F9#i d(C"Ar=r^] \{X[%u[Edc bm7Y 7 |>X C2sЬ|uNG<{T [aChVAx\nyp;xExkIV9l-}ap: .`&yKfrKI7 r~Cqqs;[< ENI:%[7K>oo@/9FO[Q4j$'O|m׬W: *c[]uYK׮ܼҶvt:N|q4cu{'bm|$2|ھt'F9w&IiY9%!K ֳr^oW s}q]Qֳ[Oɷ%mm=#ط!xp.>Q>g<L%dYa :ȤfUGӕ"eZWWZ:=#s)"[!rP >mg|㖶7NU=8$3Ð~2of8ir>m_ǁHgzR5%ߚG=8Ԟ6(ߓNS[%K.K/C.ߧ:o#[ v"|*Hs#]WXNGkB.#]O|jGIB2_ԡqE0&9^H3y3vdo Ϛo2v a[GؤVfk) rV(*tYt삔ܿ:'=#4FƽC98~@.7~{QC$=~t7fܛ=;.~`.qe r"\ƽM]ƽfƽ-ƽy8˸7f1] ɸ7Wf+Pߍq?]"1 y9po9ue>DF{Mh~w ka|Eoz(}f`nG Ce9M%شX+[47sor-/ZFt3%z0RB>ȵb. ڔ8Wݒ܃9T,hTy̢ sr|K Pj씓?&d#ʴ㙠׳%ԛL BMyVJ|EHƚXR4pR[ߪ6A"(JR(=1\f0m$]6rk;/4RLO/EbN#S5N*V3[[Q\RNu7&lU^'z4ۺ"ζeD.Vt[dN$Iu[X⺱ݞsx?H.<'5a%UQ~ӇK:͒;q,OTJ훀0PwDVĕ˚.,nar8-\ 3O!kHI|)w "pbnh PB%1DŽ7e_Ί8E_T2jTT(Q;7+[SOr'ϭl,.z$T趲; Du Et@')eVX\𑷟cHgxgvA8iٿBM atڙgΊ|ɼMv`reSVCMTĨaNBy?81<QG͓`ϳm#X}0P\oԪW ޑuu:2@KU URp>BrP] BgG7`KBVm<0oGŞorlp*!XQ`Qr+UZhQnrBjaMRY3Ncu];N`FYO\s@uja,`&_|䫅o>FE }3}Wsƒ8b³KEpdpa\P.CvcDxAxLm.zlmGs"v,[G)=Yh|/X6 c@Maj]2զTF X}@R5ENZנd˘.F|iV#"pAP"=0⩻l]-/m9֍/b~Au_#wHx~ey01˗\"Ŧ^myԢ+xZ:&tr1[]ԯX|gEL{s1h)@4^2ctH h1}FGEڢPv Sdp1&%oUO0R:BWHVd+0lD]wCFä[J_>pcEՒb#0ҨO1:vQTYc33!&!)J bI1>5cWI_*s?vT*3Q Ⱥ^PXeGz $(3^\kN6FÚxź(CMBs_YzO4ǚb?&27~O fMsYmPVDVV=F Dc I>3?znsZ#\PJV<5MOͺX50xQ_*E Eih[tMbB,K&m-K7m֦fRK|G^Of΂ʕ p6֪U=m?6LdISil6bgZ.7<G{ 2"?뾡W[ u+j.Jf,ƇrtIʞ{bj;컑C޸Wy}RT' >L~Tof/I4j^E3d .l -I\ }_"tڼ?n tGQ[RABI6ufDnD:b:LS+Ñ/7gcȪ[o{S[s&YK|Nv|!<+Ӕsqh`-CmԽŭ܉(8KUT[gk۩<3r[Zǁf#ֶË:Z!M6&q%}?Khr˸8k,x+H)10wÈVs0|Kci cèDH6}*^IykħnŞnvkyvn!؛nvcυкUɦU#Җ\6C뤜:<0yeD,nݙ8Ѭ6W!訇I5Bl>t\m\Vť˦qskOCc 暈=/3.bm1$K#=wn^;։{'j鏆9}NhguH^Xh\&ԣmž#`]euý^{%}˯u+ AGT]gxWI ܳ-6nnTҒs|☘elV $VSA]9B՛YΚ7ߢDA-F"a"u]z'pk-H.dX Zn媟|Li-yi=vv*kcAp E r -4JN՛' 5y Q\Eym$A[V&`oS-1p>Ol;'ԶP۳£WG OOm 3_ >,ljmZQpL5'b^dAeK_pRLx_rŸ5%'xZL^6+ti~ oJu6b֞j/}ce%S~j[ٶV#MSDzUp:WJEd# $˙/[K*P r`+ ktaMC;`R;Ў-b!&B/l}Bo0s&;Xav;w iaZ=N'6_ C;gC;* cOaE椫xͬ'd8Wܝ>A.ҾFiT5=H j ߄9mWFsZnh BM&%ĭ$ .]|\]5}c*u("֩i=dy?+:G*Ȇ)e"`^VsB[GO0*tA bt#2>zc6ҽ+\W =^BEF)FybɊzALXARDUOUA'wfuw>,}n͙[Z1mLa!-n71SjԾ|b-n}CG*vkβ B0ppM{b06EM} ͕c"NД7dm)>x3"z{3=$Xu )W,QQ釳Dt}!MZJ*Z:YI EsOOyY Y/z;HbP81RQ*(YEFsw@;+`{Dv 4[ DU %C⡜~$=ב<я%AwxǮ+q {Hf uDV̠T&Wa : (,>'m%9SCfJʛ~Of3C\0e VdDf͚ 5vyL|zke;נ*0wh2 !#a  &\f֔xkR[q ؖԮk&&d%iO TF* -b}іSSx.AKWks}zc .6 b c&`]0|,]&> |5hKp*G&9օݷ Rl+U%blكWf $3ypTki'88mCR"^_/,73&/[&iw_meIs6zl.ORMy;@-plW$ZxG2A+>Knp9j\)SO,POt3AUE*sl.qZj!pM_0qhC,=6]-i8(ni$=p c ocнqr]t3;4rNgݪoΝ=q݉{YP4Rn NE;\W ZmP%i6 )Na<±!1Gܯ=39dT|LxYJgi-۸:v={4WĆBbD8o*(.W]wqCΚaLC %1Xȷ Z#L-;aI0+ěӀX搻]|z &$јt*$^؈|-Dp0ɒ&cX==0 )~2  Crv{(z*C.6D٘ PҪY9.2),|tF|#\Nx`/ܢݕ9lM"vLtboOh&kY}T"p9HT&Ju\ۦ_4h< Π.!/(7nZ 0 x^"c R?:YO+ĤO4MnoWC+ A< $luvY슶IWRz k/*^zM})q+_F֍V,1۬D )ko=0" ]!awN-d%5Vթ+ зn%o([&2TOH-b OtŠ%VD M,KJ,FyU\E~֮ŅK -m/0bJ0A%)9LOGZQM&ߩ J^q-dbjhd&)z4:<{L:A|Cpӆ-D竉6}mg@phFnT4vpV(lJi{ik7dzB9vhz=En,t6Ubv>Xv(yP ;B6{ҥtlޅ2d+r~aN׈T3NX;4eآ= vGQ\ [ $zFfSoT14Bl^kwҹC?] -D+k$9ˠЛu+Zu}_CQv'ZZ]en#Y,Iڒۀ5VlR9or1;MeN"}eO欝Q b�`W'7IwgqHcMJћ43vh4,{20EARIψ98Jl"-2)rkEdm g0`Ļ1a_R72T`b5U YCSE{:+ugɠp-,HR P*8Y3df(\or:kY{qL'hL/kH۹%6%z˼E.QV %)Dg\N3 E0k9F&50rڇ7y}g>U߰_07_rI_}Wamq0DɈc 1뿫_VjTk /t0t ͨЭb̑0-ZΕȋ굕]qU(PSգiEXG n_uQT)'0xbwby9lMٸCIfF`%mÒ&rfrxz@'}T,| d' .GM DTMŸkt\<{H}q%)KO b;gs Mdw)l zjFXh6Rʗ<\F`δ,BU RyEDoS`M6)dKTxcK=)2qJ{{TgJ(g,, 6#8([|f bTz1҃򗭹QoWy$`MZ$B6X 4$,tz{B5Gݙ(J@fhHK0\:AK,}tw:yoR禯f#7MHi_?12mu)RWttX:*C}1\b)~9zO`0Ӈ0tIlsnrESgm6n|׎)uD1ԩg*iR/,@FηzgKGmT_|.w.6f'r6$( JH W.ԙ0 pjk #v<B9y/9p.E@Q äVqgv:oR'NfDMLx[(b{kQs9-*Nޓ0lxbveME=^%8y` ; Hά 1RVgA+4w-jכ5Z[Xl^ZY_Tdח` FKL%] ȥܨ4ֺ=م~२ž#bLC !u{mAs!$& ɚglf]`˘yl'V1x~ߐ47e!8qXQܜteعUWBPW8qPvv 8ꣁNM1vߥzV붟]}1ŋ|-GխuK]w5!dWD{F s]WO?8v.:EEWM=W?m{. W^T1RsigwaFM*z.:`T9HyJZv *nT]EӗsږB_MDn415TX qUuup棯Hs~>Z:p4@;A!9E4ou\\uUؿz,貛X+f;յŚ;+2N̏Wg5\!z hM?yY^? Gc]}0V隫;.i;>[d}H '!vpq1_Xyq˂h'D.xs`kPlro@ű|]Hx_}t᱊q.z!w_Y.ܩqս>^N\JLfR=u6f}͐#&{LabG=\ŚXԐh hpDedCFl=Dd͹5f9=u"Laߍlټ  SD>8D$[ [%mß!`5@Qv dml)I$7cOZήe:ϦNA{ۯJDSs̒i\7;<=ډhzmmDYgl`Ʊڙd49CM ibXҋ?u҄>L9I!:5oLOk\)_Nٙ~_=VT,[ѳ?/H@lfε0\NQ~ D8(·ŭ+T_D.fj/&d+]Ы-Ɔm5~_. hP0t+c!MC_p[ KG[kW-/-HQ6@V6e+$&^ K -_tXcZ}!vGFۃʽxN`^I3DiSCCIr^D8Y#QhɨN>Wfa>2-$ I$EBц+Avgb|1PgxzI$D#/yN8cj\:'ui0Ma1 ~}"Ob.#iyGS6G*][0Xo= 1f )v>R\ >TniUKB`q8<-pDB6'uDLQ8&Q sW·'17Q09镺o0^ٮ-^ e= $+*={;#ڑN!U؞BZşIWz]D*ߢ"8,MTb 6!SrV h(v|?M[HKY#=cGg1n* :wz<Â5F{k#0*,HsF/A35 W".c{1jv@FT% .*'`f1'1DE Xi!MeU(f}d/{{{IeNe;IWOЋ?3A˄7xH3E$"w2 L"D CWz{+,j.uim˻ͩI]x`j5, 35@d 餦̪! 7dBTubԣհ1hC'"VH|Ȧ*Y;Rj#6=yU&-uAL.stvm C]f.dd\qn+|ymp>{r\Xl7¶YKtXAl;Dt%`Zi{c7]CAIcfHg TWo"ma0"8!/W^g Bz&줻W?0b3钡_a(&W LBORTpnn jTAf 5dA _SE`9AТ9<{4\P(.@T o0BͪHkH +*+&vN9?ډf1Vd_VoAQXs^e 4;,Ū*iL="0 sl3,^hwxm Ќ"yF\QYZy~Bl_ 6#!FhSb^2W?{HdLWh$疇 AΌTSV"CHkVh<؅&‡5)k%&@Tz(5R>.g.]=.ZP@P+4#AǮq/E"7 %< vW-, [嶣pe֥% n"Ќo(n< =wj6/j#D< lKq("f<1wV~⃴"Y@x^H}f|1tFfa`t" (»n'/G,._v h5-o$iHIv8+1Mz38 EkShߊ[qT2]jNAǚ(myˮSBhϘDb&yfO;NyM>`}g [r^#}ChB:mp?܎3b#+cGi;Ym>1"χ@ ̴[<~cWF?b9k3'Y`Hc ͟ TM0 +4HWI-k#%N? 29d%:^"0,b0hN)]b@&@'yWBunlAl2d2?ZeP&fUA资rJ, ʒCNGMF0=V4QkTKVo}^Y]m>q̊ǨKU,Ilk6?R$ W63) զOC5.MbRԏa>piѹ1pI Oj.i wRp*K&z{~17&m%,.̴h#0-IrXEm@eVP;M}% 33Y`  >LqS낳bR*w˹||k$cݠ$(Bm {CTsº;wS=HkIb_éqt;[\%~52%pQ QEuȷ3p+C|;_bažcyxytnE C)`P3U>71'r̐/b6J9jOyܭ뒛E3Vyd~JytSXbmvb8FI¢T=8rcZH.r&u20n ?UK<00kuuah $ ӕz%A4fp ζڎ;Ը2W$b&8Hki}ɕ 6D<"84Ӛ51P`v̯O Ͼd"fRp-/;~ .0ױ0ecfWtAiȲ!Ҷ[~dʠ8AK8U缄h3c8uSu\0O4$\ 8–DD FXB, pb ɉTҵ"u@X(ƃܡ/sh5d mMp[K՚褽~q6Z?_7+iIzzÅAZڵ3WEqj:,K"B3S`҃wk_5|5ј+V~G)\,Zm#6qDK4@Xx DQ'+j*CdҸƶrϧ 8#rŚύHnf"{,”:1qz}1/GJE5C(;9 6{9>EiP.GK9ۼXGv tsL5Caq:J1)+&?v0&?◃"Li/3ί/,{Љ6Qܓ_. A~QR,:/=Oo1 ca2e.(/aaCJKٹOL]9DGu=pȐ&JG Yi:S6HC8tS>'c^Hӏ > v=QeԉzX2147c<@ M%gb N#PEH?]$EL`dƁ毕G(c(_KJVHY2-S$Gy]&jeAk f 5+DL/f-%a9ԕeFrͳGD1׋9?_B " uݐhb6+y?1,f-&njGS0zcbI:]L'+WDBdsR,-fem>pfBߦmu\HxR|Nz̑ua;)c逼|.H1ۈuetQ,Anl&e98|-×x|ϢNWAM{=-՘QXipB_j緰}\CaK^eM#/>0H y]x!̊o``wH w6D-DlĊ2cEt ֊=IE%"/X dOYqO,,u`nl|os_.lZ6תjSi  :K 萂qQ0\1jT]%4&߰j<cJ_~ ~d' 8aKM8خ̩KR[GBt_b,gS? FWz,8îrVV8fzYj6`Vo7(n$s>=CNNM^;'Gq.l@kr([5 tĎ4brL'$uG<\1ߗf"ġ-J=UPƼ:ȇ S BattIT=Y! o`53QF q`,<$W$8/ČR3>59ŒZ&g 3v R.2 @#p9͍Yʰ>\4}ńB0+0bAoךb-7tKoP{1ZO&8˜Ơ> nL|<b3p1/CCA$Ҹ lS?Ͱ/dOH$h%ALx^z8~A|lԀLNlK&eArԩW k|}-<'en S6@_?  wV-Y DŽcz-ӄ'I?A[%1B*N׻ͣ(V39Y\lRs=D N[^n5N"_ӄ̥a獕˜X)'ֶ!,_J[ז76+oHt X y[ܺ|vL1α 罏}bmm\ )떓vj6&vpW $w(gvJzԁ xKbb~3Zs7X߮(Ěy}‘ M7ʅ':Ccܸ|^4]םMxֻGP{3z hk#S͕2M]{[mZYS9T)w~9` g%LԖVad2a=7,+cW2Y+h,Uz!H 0YWYYdA^xx!c˖H[X_/(\l6myV)%x29PɺSCJ?0t+m9t+ 3NZeմ: UqgV> <(HmT XHJ-rh٪)u0n) ]-s#`6vH4!0 -ɜ4XZM \i2దȎm&. Q(U`R7rߢlu ?JgăavWxh/PK,\ME&-Id0 ZI @i ]#' 9 1*+=XeӴgbdR|L==%WI6hɕdi:*;&r!|P2AOda5z-|4ӻ!'%mr9zOtxeKlnsB8gxG:s,{(14ecbVhpfF|t2cR1W*$IҵV]a.1O C ~eTbݝK`: <[ӀZԚFsiux~D} vJ`C?ZI{axY.`{&r?#M&5VMĻBaƶO8)|[~>"5Ghx=x .ao2r{D@~, Sznaѷ'Vtly>r{4o>һāYXYWnNIdr=A:,g6C|+;37\ת0 ,scBp !^sLe1|UA ߙ8 V72Zv'|iʢg芛 ~@}oA+ 5cq V;<1OlƆ&sѝݖȢI?|JԖ C}~ I>C%sPڣ7>"Ikb_xg>k &›pN:rB:f\Wɬ5ewϝ]pPa:#.WI w6%~μD|` eʺ02\}<3Fw<ž~SyP, me)E4dF5aٲ,pu!Ƭ$̅q[y(6aʲn*,w,U62Y^H[i[Dr =s$5vҒ#K5m,:!cքK 4xTjqLOc5y JL?d ˔&S?Bތ$?0eF,LY#, {CT|1GRU6z&.['XYlh% K֨_9y0 GwSD0Mm-<[{)桠,(&J4[Qt~{ qpޟ @#ҚW/uq?#=O4wfNӻqnbu;ޅN;b ׼F 6Vz&9%|P ;&9A6j?Lb ; pj&4ɼ$E0SX4Ezoゝ=Y!V'&]N0'&mh /I_6F柑.X(وc8*uRl 7YУ'd´#9G@rۋ/xeyppf9;M舩1{ D׌yGmc29 /Yw g(vB6=~}ͽ݂ߏݳwXf1"'f" L3S ffP؀XeyTՃk2L8\Bf%"N51\So"M!K9>viXv9׹x˷(oŎr.H!\<,}qжqx(bџ^G.flw9G{biXt f>1o<LqBĸ{Ǜ3t'j~mj[da{gw/M`th0X3:s6s dn7A!;]WlX3VE[y">9,3<3sDT.S3ܻmjfJ Ӂfh:XW5WlhB>ܓt{ĉf.y H33O# BSsN5WcGq 46kI'菭3t8Ӏ|q4=~9g 3a$sp(bݐs o8̭7X8k辔L3]S=<`{P3 ƙϪ*Նy7C-v24%޽t0JBrQSH'&R\`[Ϸ"Rf4DZM{2[J2e%e٣(¢"IɵXq0SEl.y`m eKQ"2mlb|ye!oH2&U`&©2кGboT=Od@0d3,\$ծXT9X2Y8ͤkaHsoY:ʐ2l:,6j[C<}U+1yR([R ĸNJFxˣhy ;;3_haJD7=NNAXuBIk!\, A&}[/-89N54^_1$Y#kIO$EKKj9ه@D. bɶyI)C|d$;e7mmn=S3 vD#'bN`yn5' 1'4f| MRk936lJfgd GO%19uRə{ka1;kmL䌙0JJ#xe"o \Iq/;cF~@t&.b0:H|@$¼7x. L~YW e13+Cf\0Ud d.*cbbmgAlM_33TcTe\y7 &D+ٜ.K) |H%6Q{)LVܺ+8vn;+pOP+zU#%}EXsg6 _tmK͍ڤ,bl`AV x)<@3|d»'P5&mSϣHVYf0OLF|apWP tR0ٿ\Tv`A6 765PJ&{UU% Nlj֞41xqmOj-"Ir` )5-ŎYwX>ʚΞ7HYl|U6:gy~$Ĺ+εgujmЦKnb{ 3{(-PaBAuVQF DzGDWY#Lfq%uFi,[`0'@%Clj6]`HC)y@PDSq>f{Ȳ Ue_s$bCj&eY1XB6cjY.6@G9sc]&>o0iuTZzoz/hi,ƹ!adI[Q4$g q.+'$& S7x*wQ j#O{WF14&p7VHh;+`moOh' "hp3?T޸-<3h'9)5x2 B5)f>`|i/SSyMTw i- 5(twcl4SQ&31.O/y*=r3wqfEiy^ɴbF-BfN}y%V,ZX3KZX$3*xiAȄ`3٘X!RL?7Bi)3ͺ DQgK+8ac3P%oX@u`: zoxW'Fԙk:]iT!͖Y,nف2gvAٛT N'Y<-2Ն &y9Sƙ. T1X&ԛ*lNjJ3ϪbhxOu ZU,z?kw ]Bgy$re(ð1G!7Lks_챓P qB"߳ &'Ey'|o-'j{`uc~&}WtFFϾmW7ضp^6\vF5\W!1@yC EGz S{ߔ86 5. ZԷM<|Wcmzr%3Є6q\<F:쮭l%[i_җ7([γ&SڗfC2?PC,HS`t0X$QWc#gn)kk+!U/jTɤ22eNt!d"d{copq;7t3ޮ[np;|὾S*hxkc2ŷwj6@0 Ƽyqm)^7a ,=̅lY jKmm'H<\ 3?(N۴Rt2xms/?Ƭ[Y,E&S8XE  es4 "8Ѷ Kq8KcX:Gr?o>njtP%-t:B.ey, {G*~+{4A[0亞aaڵ܅KBwwOwxG\U h3U標S3CV9*" Kg>ar $ozC0*jhYXeL 39Fޤ1p \S,.zKvX.H $|Cձ|C3 ehF2 ªk#HIȸ)rB)6ӹ]5W!:%5G#Q/~{njȂZ"[y HWY!tUqbZXxGm ޅBA&*+phԦ4VN ^2F )7mgtM7neQ kL:ɄݿG;b!xVm"HqRAتkLYލ`xmC+ >R`En^r<^,*ϙ[6*wUhҟx~}siЂmh1\t8~CÈ~cf{A3Ze_.+[8BK9Kon]0k٪QyȭI *z ix.p '!؜*lyΟ7%@7 eHMc5oVŻ:$|ZާS3[Pqj40l n C@ݷmuz{Ch&msĚ[,΍#ұy#fNiy$({k |>OX5cn\dVZݩ=鳰sFN5cYunr$- 3Z!/ଖ]\[Q `^@ȂDCnM^b!`s2n|Zovr%X;#} }ݶۖ?7&X-b&ZᑫV%p| 5QKK)-Zd[74L AƧ :cbL y a ;7su`;\۶͓rxv3zb]`zu`U nFD}֔ #$23]j@9\dBWɆfJؕط3nw*|e6r4wt"F= Zl}%ۉpeycMؒ:21%K[W@{g"uԾyDr&*gypf:~m2j-fn=0 AndžEyV5V h 6- ^(ҐA>쏍?'m/Z):Vͤa2tJANر%*,CLluϸ]& HHq3jh uz3 eG 6 iVw@l]ᕱK3n.$LUcۉ BCdnAD<^ZBR= Ө*c(pu ^Y%U'Pޞg9XAo9*/\< 14r0PY}bl0l㡁A岓B`hȓɰ1{%.wXԱX^*Մ<25q<7->s5AQ)BoZ]&u.?A,Zzb+j,ՊS|eG=^agQ?a7g'oC D>SrE>_G`)^.vJQRN><[wOD~NJc&D(砼9uZw6zf:a}^O}0EȾNȾ|v Iu?hp=[x~oΆLd1m0mhUCpD7\33(A5l]4$[zgMS@o%wKZ3~}@1f/-iI1Z |5m/Pt]3U+L"CUm0y& +v j~ф Ȍ~䟸͓m:=C 5j{FE '߳&t``|[BC;XWI Vvd|dr \d\nN魰bbVz)QE>dp <Û e3;*@H󻝼5ULփF_ yAޒ`!@} $H]7 C6Osfd\6YBvq,5ƶpw_p47/.Q2Vg:Ð[8F3enm#)z =_9"+,/;į$x>+.-hQ8iL"Ep`vMM_د43H-b5o\n;!MZ6-&j@o30FVF1Ș"T\r(+I\20{KvR[RG_ 1|_Wf}6E'C(TUq6WD3z[~>FښנuːB`"fEܸPX)i~ s' `^5~c¸[[Nʃ.Su=< jl6m5}xu[&BG23hG40jxnLDs}Zbk\V#~VNSKS3%onH=>bs*9D>7jU'L |UC36$ݳ2*.ݴ*Txן%ʵU~!j.qSy90\.ΤJHձdX+p-3JFtvT S_IƄ+o߿wB\Ǟ@i{i:-!Υ#3B+w17`U%sSfs` ={ fU.c (nVid` 7~~ۄ<_垄n5a&U[#E9.c"!H(;go0}bs6ⶵGolIQ?I[iQ2k&[Hįૢuj_܈Wy`TS@pHWY򱍘J`H<i*q1eQlUs8*Ncl Zlk17ߍ@ ݰIU@Ǩmmm}3JT-:0_рÄ^ǜxnxG& -x9Ks(WC!/.j{.:K!})Bs9P`B=OAr5/ XᆕF;kK{vaRŮ*3'fv`w a W1XIG. Xo :kYND^G/c_H_F#7ΐ/_^^ߐ|[Ju3[pvsΑ7&DL;BΪ W EQW@#NxuLYbW4mu(Tl ҽ6xŅFOz$jЃ[teV~ E,r 8< [ S?#F7_aS#`#SGŔmA Tsr҇+4sE?\H B̈}o% `WtO/NG]PXCYljnh,àW&}CTQt*/EVMU}-V*>>'iNG;3=UUu&{:>_$Uuz~0GG]Uaߐ>BQD x![ڟH M`Phz<׵5"&KU^@l!W)2Tu`U PQUFg2ԺsZ/&y~.#_OLݺ xg!3Zv0R_1TYWy֌#yT~/ɣ Ĺ \&A6Yr(!$ *7FE Зki3[0/kr0E~'KoP/u6{_S- w-&%/ 63҃ˢ-ٖL 0~6!vbGԦ?E\m"b[ Ɔ ,9q.'LD֢ x?:NNohIH2 : v[j=a7`M4 _r.Bv[&LUQn-΋HY6ͥ56pnz?Yylϓցj3%mnL1/y648$h4}]C-f:HgvXC삟䍡;a_* CpY/\QeF=}5 :JAr]Ƥx ;үVMw>:& nywqH ~%;v=f9M'씿 oZ L 7#ǘ‚r>c!9orB=:Ga-Vfݮ)bvV+Gzw>l@0QEp}^:, &ㄼ/=<]AMGt 47ˇy= 3s yn<A?KNvpp g 2aO j\v6ng؍iѲEcMm.(& g MRq1@nGCek):坤dᢢtn_]s& vK?ɺxG7/vw';X>0b^}<^4F>Em{-# y` biږI =7\;qz=wK^ai 3qN~ 8#.IaSTSNhSښjO| ܀u0 f)Z Xi6km( <^{j*:&(U@|74kSr3 :9v|#\;cN4Tlb!WZ{-$qxN 2yA sfM\*7K~Yt5alo&L݂?Q5103Ho9j(;Nqo0[n|N&- s{ -nX`8MHLG\nHG7]vaQ.Pn"px 4va=y>@`gOvv}<ԶQm$iVaq|_Er;ۅ3뀅¢]\`Fl mKn|η'\Ʋa6v-?rS;ozmqL[!QN _)}*`|=Kzd̻fw;vr_#q4 8T=z aFڛ_#T.Idag\rU8cPU=㾕ݘ~U#\|ZZGR3E>ZכW\Ī^U§>_gUZ㚜!6Ϊa-oF(:s#)nooxыPM@twJE 575Չ5#A1C֤Q ·;;Քy[e:)T}7;R B8 s祡iU/nR!礱 s8IK?NIT}sOw^D׳3cX0,ГF۷y^R@;tYȉ:c/X'V%w<4HmꮎϺ)_-YnЁtpG\R:!r~%cFkF?Vci\t,L̥KGu%Ӆw6]w=tᴍ|O01𙝑P^m~)uYa,GN]Vn+WR]4ʤJnuQ[EȔռ1ЂgxJz~]H WȮ GAR^DӉS{zW`BIvh[ewY`R9G"m2T$ŰSܺKog D]PZ -,2.0μ8v<w1[5232Z*<|mdERAwrH x}N"W7+_s)Ǵn Nh=\%\ qeU`zTwpEjt<LΣH}FiL &J百z|N^k꩛a.vx{q_𬜰qQ4mQH1! Ǖ5eʫjZVp'WRN#9JHws9l~e]nofTҩ 2wFEQӨL*^ʷ\\ b"1C3"z"C&/؃#4yGi6AK$w;(1fG>[zh`Ŏ{Y ||* k1!A>EoB@|V01)2<&+Ng`\$7HZ_Gmr,n,\HgɕwqLUCfOy+mR.skRwmj)ѷ % 3s13E#czRÞ-efR>$DҎJRF 0#Կ >"fv䍶@dbz?G@>smU})wHl9k;W2rk}]-c8e]5i}`Bݨ]|2|b&VY͕Y"aU&n$~toVdVC:#++XW%Q1{,wꙴ("lV3j,wfrr"K|ΪҨCVUxUfnACRKGSY&A_d$.xmvK(e]J[=:E"3YY%0A#KDeMET4x)wNY[|!9_a.Ϫ*3gStlYuɅsbIK0,FX;;iJΡՊ {rr@jڎ] pߔDx;10E7{5dd;Ra{gމtg˜,L}"H\fl#!1h%ق/]Ԡ&w5W⛯)<#N frCK1=rAIRRcTNuF)+N\ZLܨvG .? sEY?ia"v:GVq_*S&Œ-tpr@Z*!&4[1o2s ?ff<~XB'/϶TGKnNMJ>g߭L!Fcy&odm ;3 ]2R})lMZTpL͚O'ٰ{x://x})^4.=t; 4ړF*?ecC,M>[ uTƩ7P`?&am1i F%ZȈMqٕb)\BClZMO6 >Gʓ#}M &1ߔg4)RzZ#*ύy-D [rsޕMzeˬGv<v]\\KWI:a䥪P ռv<:ʵEت F|EFTX4J ebR'-Kvl} G*;Ե *Z @WzAw704N;yͳ H=EδĕHNny@u-ӹKV\NC[&С`d@wL#(#`#DH#h"OwBٺax=yjTnb_7% :,82-a`|umsw9nV<a8V|q-+>8}bӋWNűhn*mrCJ&TºFP@~b?*ַ4of>`1 `=m40)[놰NC1Ϩd~")S@!Dei-ʗFK$enE+!k+o{R s '2\w9Ѫ72,ƪotކC EH:мPlEs'`>3}F,[gKeΦI٤KGrY"D El֦&2dhy[:k?֫68Ļ6)K??pÙt ČaboiyT;M8 hF1"5fJ+E(#7W76/ͽT_XbeA4Fk3xg#Qz΅X" sfZ+bxeƇ 5Jb㮼kA{.T90A MP'b=P~Gun^=-I0P+tFh-U*i}ck@,*Db>^DI~8$KS$iST`*??]3Qn 0YQSI|]*PSW|gDl|">ƴA%K⇞h@|E/@nesxSy}N%fl,紐{E!vHK-EdWpQuf>/"l] 7f꼄`;.._ّ}<"- xU/7zp@hؘuK<_ &aD&_uNM6By #*^0߯7<}e“ 4\WSwcy0JJd\2@_qmX>cӵfJ]TN*:#5$[Y2hޕiQ qYXmhh4-5uF[SPEER(6X=^0nY+AȭkMq +ˋ4a8:|Yȴ2Mi=ܔZ.)S$S0q ζ 3sMtdsjh޹dLxhH)VE".zvQ#*e4*5еV|#N/lzRo3%Ⲭ zv)~],J \:zleĺeQCk| x3,"`s\Si68-F}oMdٯ#Y'N?jwZ(2 ƒ/vR:վ&-\،ΫF7ҿ!@lJMJrt"FsJKuo]^}ɟ5vkOřWFS ]lu߶h,Ilf(lcrf,P LlotI__Z&i\Nڪoi( }.e!ՄZwIm:mgec>l5mlCAq*Uޭ& ko/L7)dueE66 0ޘ;K(Ox=X"o N׻dKj}ř@ڼaΪ!UýQ/x]@6I~.U#73h~?ˮHZYZK_EJeDuJ`Fa3T6OSfcXJ*S,ofR)D2)r Agk{޳}}7 8kD!CptJFHz/֕]Ӡqi{00}Guw"4C#٭AwD8x)ebԉ brh7]AA~IWQj+ ܮ[:6(T9:!ceF;+"Ie&ii IM;ʃOUiƯ0==%-k*]oK~/tӢ-b^{M5kx%]5ӷF}4vD}??SkeX؃&^b٫(-ퟠ̧-P(6Ѭ0]dǒ({-xwars@F K_9RPB) 4;vMTtEy"w1J___oDWӏn"tfw<@n E?<`Yd[ohLS!=u9xQˀ+I" ,!ɣ;'Q)bCAhݟѠ.(ދ$>`GH h{\H @0n@ڸ#(3 A)F.B5 B p9 O|,uFj{J4tX5X^]>Q*ߪ 9˹1tıg Hp7;*ͫ]  t^Q" P/b[/{h[F2lb7!!Ar #!k:P/l!&]HIjZFA o#E˞TGv8IɑhS\~LBwij> E3V qJϤ)m9{E$U}n̓ %H#}7 )GXa)ZRp"va@!yRb`”/lY[taiKD=,tD!zЏ/AJ*aX::6R}c@8ÈG=Ru{ "T~6vKm4󍯍dBTTDgČ8GOo/Pk0J⟦ASU/&O`Apx"}*d(VAKZOU8rQr v<' Y'fNIvLH:ή{\R\Ӳ[ ^`ZuRRL@@őEH/dFDiʄ7q_%x67bh@EئzJ:xAp BМW؋gHRZjжO #RڕZY*) 塑e,5nDW36I0̲ o44Fà_,կ6ZI9GDZ M)_0fF&aح{;3EeJJ4EEJ*e4p Ml-`x prz򵩵;ܣjkOS(f ӊhD9V1!<~* BrgZ 2<_' KUAųknϛxH?Ip_X\DtHBRÝˡzB&ox1# qʍ狢!=*ie| kc3?&Fβa}(8T=wvRAB{ztOj5)@uiX7R8$P*[d>"q@'jj$ΗoIi"=#PvbCܱ18 j/xTaj^^NAaJxVDw`HcJ5TV(AZ 4?I_ddC_>䥩V=+ H2c P7n WcOMpn P'ʒ. Y6>Ng#]bԵ?K*Vk_ `AR@کʢ% enQbW굝v V/M.qPL?,N?_QL4OݷY~ª"4McM^lC*Z5$۰:-8VxYRYVwӀ! 0췕T .Ecyz DvR!!}'@rMGExq1z XD1e_/xI] ZɇW&P#.GQm-̃UtۣԿItC*,wo#y1))_tCq FZ}f21(;Ca%VG[r}M X0:q$I)dHkv߰"=b1xUO_=U8]vYF+̼P#7<<8WXيȽ ^xTˌ(+TǞKRM%)tlP6˓Lv􀚽+r{9Agd] ax#~rcƩDH!վ=Ғ=|$E,;]fZi=μ^Q2TjBQ$45!%9*żt^xN5wd 1(/ <|!>UXލ"̍}= Ymyc3ssFPlcFCYVOyHFHkxrjzbS_WX˯3(e4s Ay$`2NmSDFlN&zr,ٰ4MlOTQG<r,nfn:r=1 67DNj16J{v| !2G&}IJ~<ǒH6&ZںstZ_p!,|1j[xAžS"%iLi][Nl}x>8+:M.]%MSFf r$S|oA2r?r_$h7{EB4hBd\C ?lXS_~eIw|!n{[۫n2uE<+[>G}9(?(: AHyӸ(y䂋#(؋&%;+& J'փʸ"-=ӋbYET6D*Ewq\n#~Aiut'3İ]!o2:{*= <3Ur܍:q00wy0領p|RI6Yv`w'18ќ7~QU2.igce0;]T嬞JsSU[NWe8xmu'Lr[`7C#_/k?vzF8qz'kNy6'IpV`D)%sfRL8rbbb>4` P=tJZko>;1xzCDa%8cf䌳|@}O[Q^ <\`򎀦bM[HB[`pZoZBĺM0ֿ/0|ae^tQ^t>['=ʶӞsOʮ&ה^pjX@o)dY~P tS,e١̣JΤ܉8w28*}5X93V`$[=Ez"dHv*2"7e(%?0s}|9ñxp3[.sϥ*Γv,h\b()2Em* tʚb7e;$=AG" vvf/%3K,fʑ,ƙ_}s [wb lXEx)Fߔܯ{9+lt#%_{bЬn{2k`VQ~ZWpf ס2RwŚoqc9E(FfR8N~pPpGksЛY1߽5: q5ja?:<$#]zC۟E k}_A\tE$]/ ǕB!E:S n},æ<|EPG7J~ '}|tR\>bt%oZScA=N,'=NUnqYEǾ0!z}LHI/_<|+IW哓8Ŀ[㤏_^>κX]{HCGJLǗt+Pqxr1~ʪr-7:4哋@Ld'׺r;*I=VO;M1pD%0cMx/RĿ^~j!&맖^r 6cX&pof$%.X6wfnc;bA<{w_yK::A?AHp烢:pϵere) .efA.É0|D%@{ IA#ws?!ݬHeAcr ̟hVf(bQXUow9_!;q2oPʌPCK_醿˸"˂8G h[Acc[ʌzÑЈ n:rg#WY$G_6QEC T:9et9&Hx6a\=0ݿ;j(&&`ʠLcuHgŪSS:`=\%b(g% qY>t!@ܓ #EBeХxr_%"$oRMLA{.MvaԬsQ)}18' q%M`~?Ruku*A P]K52 b`jQ rJA DOx2rpQnC 0l)=tZ+:oJ]:UH۳S=ٯֶ]` F#˲_Dh)]P9VY ,Lф^ER_ҲV GdopOLRơNCa\k\DӐmkQļ ,>#WJB_bE0(j͌`"ng7YnQs^Qc0+. ?k^f|X^q fuv=(AXm1Ѿ+iG+=Wlb0( x14աpq=D\tt0a^dh'Wͫl^/mGf<HWqKH7d~z8HA.|Qc iV)J ]״:UfJ!vUCIzsSY/@l bxx5l/c١]y e/%O.=o8+/A8JpP-G'_j۔=UP^wUχըwwmWU)GLJTۇΫ'dyw%Ia@f]ޓ"iV~Hv7#6O*eUC>5x$^]p#B駕̣J{ lZ"  iMciӋ> .߃ 6]5qmlnelM/1y1jx1 \]R}F-:z•kWfF4E3z8^g=Nmp&44)Y!(zhj^\+Q1L輇ּe=MXCߍVpw.b)lUؿv'pݼM O0׵n$1T,8?se-K"S8@kcwV^j|ƿj?:0qwb8UE}>(x^Eƕ[u ((WE{eabX8\%\al̀M68|X(i^<% q!_jev?qf_tWpy-֮C46MWl}sƚ| 7o=O / 7aLVq-UwG\L8+ LGGd:l~9b^'7nvB؇ZNߺo|JdqPoQbë#l]%CQvz ;b&61bʏEWQlnMؓm'4"2M?鱷an~P$Iv#G۾ee7z~j& n5 J_㡩 hsٻYL2;NIn|8޷uR"vRwǸ ^Խ"[PF:8E8C8B: ૉ@rzHZ1TQ.^Dmܽdu/Wg.P3vJi4|8Ne9bQ=w(q ) ߦ7xnpgMx4J!N[&oc8e O:ـxfHɦĘ5 B5> qm/Q!iE{<&W@5.-UT7-)|UbѶXxE .Bޮ7k ]e,?znrcTąLj)nV<EM'T=8R]|d8\ b5E: ͩ) NvB[:Fry4^! ! zT,Cl)鎽=,f0r< cDEkkPTI*2jU.ʆM R)C*13BjaU#9w+HOਡ@q})' GFVxK@5m7 ;SX6>r )Dk7򧾐k'lQOL:LB#, SJN[*GN  8dt tpЩb3 ȣ5ՖˣL\֬KԜn/,U]{(T >mtFz!Li7BMqfy|@PXN#Y*N>Q 5z9L&g\}~5]dFFIsm!SvɚnǃnO? اхs6OV/HKwR>+gOUNcV>{ EJ j['kv@ЖMI}vcQGWcƏit>-A$ ᥸>AuF/*8И%aX>)f%Hb,k(?>1ˮԹ ,LxM(ՠﱳ~TTQ wȬ/Im"r/FԬa͇QoǮބj0Iuf>!v _[uxWfRx0S,FBA_+x,\S/&| @$H" u9 ";_ئ9"0? ZuzD3V'4@V 𣄔`:^ ۔Uv s)Jh~R9td`J# %e!eĺNufjHO-$`Tvbǰ&Y;XFz9pw1ّI̙{"fꘞn| sB4?N 0ug \ )tީ% jjf2:0b~@`ǖJ1:0OdvI7TC{-*R23,>c iZ}lx:xIFE抈rfǎ*QE%(aRH#bH<;D/% C<L@/@!LKFq; ր2eA2x#@HPPBJ$Ur G#F6Q@K[bN)P8)@_c);-U9Yr`rREmgLc` ØxmTŲdʝ.,ڀ5syeRɬ% xOda3Kq9UF9%@ݐq8F2aKrvc^EiKsr,cܱ>TJdkbbE^)A;HD<}$b<1 QMוtwT.^H=CP4@()vYRv-ּ;ߪ%$?0mFx!B`֭X 9) 4~f`Ğa*7'&H#ɿ9K⑍Ec%{js Ujtr/}V7twl#fvK}p6ӡDe(E x&CAX꟎R~%baqHW*xB+ya]\v0Ӎ:|WWX~*'E"W9TE{=jD7PfY F68kش}!@z[0h1eFR>~m lTE (?Ǎ,yՃE:Hmک}("ѯOX "QuȱE?ZI7>Z[n5j_azLe }I68~^+dy:Ic%%LxXmcC%{%/X*+ ,xB]cO")\Ņ/ B;#qn7A',9e_Hg4u&wd^Iu-DR#kSk/fŞ<1eG2sd-#e__#H\,evie(Zb{\oE3Ecn%NmGoLLGA[\ 9(epO ڐU C>M%aէeJS!kT\,nYg9=M/?aAِ}XEX/91OJSOd̦צ btȮrB6Zf%^r6*bV"<8Łem}o_%^%^!=MqȂQ,&]fӫ+hׄ|.E5eZ>Z1!ڮWUbh4/İ 1; nA GEYxoEAs03R~& , *E:P됦j >麯E!_Wdq7mIF< Ggw(z*xUx:JD R0ڡw=1*^ǪpΛ~бO2FR/J&b"32W_tB(V@ {2DhBTbQHYfLGB_ݢ6C<҄73^{(>Mlp踚 Jjuy)lB W)rIRe M_ac3Z"?[1⯼:0"Mq-K4QOCO[i98sۧN`}}<5~Olf>WJ_Z*ndoaU6BceuN[ 'JY15:UQ?C*8n{R͑0jIK !$-cxZqu6u8sjL,\[8[$_>L*tnr)5Rw@QO߭UB׎<\:4hK5񄭎g~0.MA2!0:~մRU3:/υ=D, iEKĄn AȏY7hK(MSWw]{+ekkWz^߇ׇ҃¼]VR޻}29lJW>ЍWiMO&?5@My7)R3Tb Ż>d%.cy K+S.UnR! W^FW.f,~ Bu耟(OqyڤmFgd DL.ѕ͌P]},3Ov)7!/`1 T>Q$yyUbeoqpP_ qfv޻a [8`C{wc~` +# +wjtrymyu@_9M]_J]LϘ5(4M~> {u9ؔ }Ħ64oUQ4+BIxiq)WjSXrc욠C5A}K%BMTʣ3Svs1.]%II &qŨ.9;7/e=C f)C*gL^/sһ\=F|`r㸥u,IhkpA }/|5i #5x-Iխ@1X8G{(î]?i[-G2~[;np%fR߰\ iGzV#vٺOM19Cƻⷻ ~q/`YMvv(rUaL3aVpDhcYfHhA2A↌ !T#yJ./)I3(H|Jo!?(G&ÀOxE(lXF:0FMO#ΞnHaN7%3 D`|V܇9QKϯrkhbysqyY8g`xdZ¡tp4CQ.tCCFSn3oni~c0tT %[QF7K_gQQpyՉCLVYGળ^IpQ^eB*{i 9-IDʢB-;]uwY6*s\)}PU넫~7+WUgǟ.shqōw'_:;ՎS}G99~&䭫x} +"`"b>H7< e1suu*n+i}PP&:[<ŭP,ukPbZI{h} )v7}YIi w1>cs5!eKoQ"^XC̾ؿtEu 92 :8fk.֝t.Sa+>q:U/d~A1wDԚG(u(_GEpi757CN#DQYV3o˧X Tׁw3(gsh# hl'G|!(<->& \h,۳NxzAC Nx}KmOt7){(kKo1Cir\3+X?JI9Fh){$)nm85}(qͥ]XxXW9r EUsn+ҶtT)rg~1O!1傗:ƻߟ JڙRΜfӋGq[D(d TܳD?zpn,ؤ=%fdzR;PrS %@B3ۃrs{]Y>:<Cye=@ M/qE)/_$5pѭC yй4W}z02mj>jH6zksTu{P7Ex7W fc\V)a]6"c1wNQl<D β.Ʈ GFAkǫI4rl l{9ewv, ]?  ޭҼ, fl=YÏٕE $@&Ė) hdo 5tGF;xN>y/qg"}&0TcXprz=) |X8_iOJ (7EX|/0 VwY{\ج,*]rڅRw(/TսuDUm//xӱ= SVW}yD T&I=xt:Y0^ܱ'#hNtCyqO7O9r(*avZJƔ>F'ٟmE qw lqn=0Y{W2|teˇ^hr PW|ڞncvZ4N/mo!y ń&F<çp'}bVo&Ĉica- i<>[H3yD_\eaӗ s+<71E8\ߺ|&au{#6I.3q|;~R%a_gLW'>c4_^+V[jY\syWt0uC x*B6y B5aln~h(T]ޔS+Q`G$qÌw<ˇ&MY0BFWMڊ~"b vL̇8V{DZ. sm . #OmzY±=dgPS@U^HzxkU ֞ =~h݌m|v$' r*½[b̼u6*E=uDnc 8z\9v/x3#XD~knM!JXzn^%p,>mw/'\!v7%&蚔Wç?{3z~}N&&w6WZ{1O9tPɓg=΁3>&ec)&)Pœ;`œS&?hHۆ#FC-5 crO>ݡc1ǎ[ۀ&kc6';UPՏOG)q(ɽ8bg2) iZgk ]`ܷν)pڣ"ûc?B~z m|l׳'} D_;0|t}L)iճjRwةߔ݁w?۩_N=b~ԯveԯ^.;~QEg0ԯ5N=rwy;\N1'HTIնBݭSѬ㭷St9NNVlǩGv?kDKeovЩ'Ma؁zSk9k*> ъsm}ď].J_"s^K_wuB%S{}D 9F rqTqzld|BnSIF64&)ϻ]u1 4p3'u};xNq;zy:ըݔn9k3ߎ(pzV~-4UܗfkS}G<vSDua솗xv~Y;ZX7s+جN񜧝1\C@V2R#Sp#bpNG-Н.L}Q; u+)ļĠ.2 BT9&e6,PRs$27 ͤDGv"1DvߊEB(w}/XhݟiI s=k4\Y0 %P 4EJ%Ь9 gXOFONTlE SaT[(?r;*$/ŝO o4wPw!R3niMQ]u v=DJV3\XN2Z:U"t9B=h|0~\ ~1G)\-ٰd)1L~PImiM)łB\(k9X)m}H(jv xTl zq4e h%ل,V3A$>"h<]VKree##cg@?fh}}&]? &F M?VOFdeE@g9*&QEU?U_y;<!H+0hǒ TuL=4iS3 `$414|V *.Z,-#{(/ ByjLf&( yc̱X|ū Pz/UÜJɨ?#mx9X--PJ3|mu] 5tv}Rj+zJ,XQ(ߤ){ G @Ωu$΋R.#IYݯϨ[BLJ~ߤх>*SC `'H~rBߔ/=xjewXS/U *&'V$P4JPAsyɱ [%p_%\2=u [jYNM{1iht1kTL' ( : ,OEԘ5BS݂Ʋ xEH䄏.a1 Jv*7Kkn! 3g$nWHfUU0PHIja\uE!R <2{a4^e4ez,gq)ZNVn8s 8*.W3[QY&՘6)45"+Q~Rֻ/)f7)ojw䲨e269_b xcBv2e"r{ mBf8ڈNi1{V̻̋|ů|X" RK8ttx57"ӉRہ3%30KU& 顼܏ΙR󉊬 =#~.@QsRҮ u>󗤳mp&rki6 E/xHϢiʣT }&ze˰DRT{#*MGjPxy%gXiKa``{9u4Z˘7ǷkzCڡ#>ͪ'P%`lO ֶ{8&0(Q j+gdG 1XttLA~hQp,G~|!S+Yj;$i阾&[IdFZ8Hԕ, ! dҞ7 */{bgHzjJRP 񄛘G}}SGPN*h+o(?%5_II)V\!t\5\&eNkn0f?K&-Sn0I)~rkL _MȜRݘۘ ] 73lN>o>&qʅI=œk0U R0bha@}ۘ)}T龽xl5UϩFJ$)(խܓ.?jVK468VE]m(|@8!=V̗=ARShJv52N 彽v&*Y!"esZIKl,·22e%gUMϡ› Qda_[#iڮqzVeI6#+::Ka:VGpdenDvWGZYZ0_U(ڋir deJV3nn(QTEwA$Hh}\Hq+JCcg 7Yx(,y2Z{wvs꤀ȆO}lP"\P)S &YEYwysuKtX&+Uk'M-iiӝ_^L}-c"*jt7kK)$H5U99Q >U. q5& d9, &G3~"Vk̰d>W(.!a4bIRpxfk{:aChcL-oIڪSS׭[uI9&ƒeC.ox#m'o :Mort _W~$vҤd<CX<)_e55]kkOL ]u 4J<>EC6H\N49·l,]|ĺ;_qw *g^+y_=%yES| >/x01cFZ&-TH1OqvB[%4Y~ޔbb.ﳜ|IlYtV ( }kM;s",ɓl: JNR"C]]Qd] {S|)XcnI7Z #\:>jҊYMOʀ,@}E@^$KS,q,\](qdj9o !5@‡,Wwr&F0`JuEz!%#(7[1Ns eN._P=W`^[l_Ȑ-]FLi9uEttT^c+Se ^5t>pcSe\/i:W K mOt%Kב9 6+"lՏrO>1^քmiP,)}K\08(@\Q/%uK437q2Y&7%FZ gяoE@ {G:E9Y򎄶$̔DJ]]fbsUg:6UY;n$R`"(8`(f!'gS>POqt9Ǔ@?+b8+Qڠ1MeX2 C!nLmc֪~6QbTae {`:W@$%(5 ʆ ƒ,Q_8QzLy_uQX9--RRI{C"b0\ZFĞKx-' EZ; eqsSAk^M2K(Uʋ24)nA8~D!$ hGS? ,<<(:R΀"|wbUh>ܫpwa'7L ,`3_*AP>h=8TQ C5T婁"mE媁ф8t]TDHՃ T2c`kq#NJNyR0@T۬/Od뵜~^F@i1V`P%ePcO)E %e<b qRGhiݳD7;jJG ¶@c :y A~21MuB f@bC\!wUpR%&oZˎhp(vk1c YFƀ^ɾd;LӲy]>DHpuYj; EX)B_90OEl:!%6$ے>V6hJfyHpUAmv8gD2&d/Or1`|p9=Epd(nYx0Ul-}"#Dh&8HPQһi+"Y> XC ?sǒqP/_a}5yW݅bj2*~k|{SZq5gĀyCQ :RQkl/\~_c:dLʞ~)PN*ysՠxF֑{w0Xw(OxP%?EGa?cM~ D|PQe oBA1b 3 GZK~}X[&=`dOz*X!g[~ŨG*βJaP;/bWO|ꊽLCv{2;O#3%*PS۵]nhH~>#9} R\zΒ}`Nj]ygwUzR i$C 9Lb۵z8BDU\A |x]ʚ-BZ+yRHYRZwMB[_ j"ŨI.yNA%Ng _TW6 'dt )zGWdFK3E️&q#}˱7/ q9~~+:xѶO֧Qaax:ˌIjگsZͤ:Jx\N?df؄VJ `Xڮ} Y[E=΅KN` 5]'I_0ͮ{pCYwϢ@~=[HٴATPQJ G-u+<%eSzT*} ̗̓-PF':+ &ŋ$H]"PNHY* nџxN*Z @z$!&S'KYQN7($R&G13B:[AfNiI <TkaR^a} ViH Q4rcS,mN8O +aYƅA7¤n2TwiB<,#7ܔ(S8c:P 0Y'=Haz6VjT4?Aj=c̞E4S<Yo/&P->'2ehU ^^8،pǖޝْ^8T7ߝ*ql;t) f)^gF*UfAX|/}O-f9ZSiGӍK?ihʄAnx.Qm_u)x( u)tκ\1HT@Mx v?ydgl^ k?i$ Rr09U 6.?a#`MRKh=\? R ^ypc.bCeh;h#6TӮXmWG rynpeUonZVw :`::V=?ւuV-t 9ӊ3DΌe0RSg #@v$`7|W![8e &0$ >ZE^/^5aTLkMrӘK ^YF=xDwi,FUYMU[zX˜SPNAR9R (ˀ[zIZMH3*;;ܗ+  Jg:i G]瀅ayin͑]#[`p(d#XN\+ [7߂>\-4c 5A yX6V>NH6:Egխh^m Rf I PL)U;bQ(:Î!XD<BhTrً1&A2 dTQqW QAIp7prS!M +(9*HB4хcD\H,FNBW{ʔFu]2E}}pp"[N#.0K"&K(0.Z:')-LG_çмZE-[eVHbDQIh##£".Y yPإB䒽Z?!er@ςtƲF.`7MR]UTY1Y aHCAwab֒kMb#HQcFJ30-] dc $EFU[QOm2EѡҐ]cE繉?)8g}Y V ,I*siigI:e%ۡEI=nxIi% a ив 0;LbfUOWX5lќP؆`55UOY3 ~QȤM~Cp QѨ~"BCdWnMfnC<` [NIQKB[9Š@ګhn?P=Gbӯcp?\5:: tUUc+m\n5V֌F5\j|r'rn#KTPی~㋩aVd5ML(lzlj(/cE]^Rv2lHaӵ\r4vTmNzLb7E/0hD=oΖf0%6[yOgv^ HC꒥ZvmzK>7CQz.1EٌwiL^m݌,SrİIiMrіMlL]RbE"ʾrH_܎5f&^J}_Cs&Tڣ!|Jⅲ_ Òdi%汲vq^CYOnBK'`"nxgHTdgnof}W޷c']8WtE[gAIL="D|<~q/ ؎WTQ4e|Qtce!D=#{ny NZ]~o2MЂ,!,o2cg4oAEO0Vzѐ_ eT΅ʣӆ\|>¦ҝůki^NYbSs]^Y (yk0ͅQ@)"EJN@8Oa(P[򈒆zpqE+O}h@ =&h\\MƇnAw8Aͫui4%W]UV4AP௥C׼0)tBQ(߬eBLÿӤ9kvˎko$N!P,.r/-4=>KOY4c6LWv}eC?ˌT{r ϓRp`=AޢΎsι;C/ΚMk쑇1[]y5OpS <׸r+>qEB sMo(}}[\!Sb!AU33MR/ Eo3&,, m@a[ۀ.=TʎoLB6yP<09ߗΕeX^OEN،u% >]%~'EB=X=PBu3׺k?վn eku%@ubSe1VA_S!,7K.igcPW` Z3ʋEEbT]{eŊ&%9oIsƞ|yLuo|7MX&U*֞ґSgJj,x6\|dO̝K~2s1l1?tb LJ |r,<&JfưRo~r1%NW h5xoXI?5l78.=2|cC(:}1M`/ Ŝ6~vYS0w,z+2^cqM(D$!<NBx?p}t|bPOYu&Ÿoez? A~ϳ#IB~#rg5Ls(Q,ȣw=r< c |{[.X \yrL8ȷ} B$ '% AX4DA4@(ERlTl8?@A r{KJpEC9y[G=p1/v$<' BVe<9cD2"lJڜmNK$1yh`LwQ[bG#u-΢,Cp_ߓgKƪCYIĝO(#AOrSP0f 3U<-YQ?fN ʅ|g1X.ފsߌD ʑMe%>í+ 5%E'Wr5%o`]9ͽi"Wߓ`uk,Fbo$'";/'19 ^e2a;O'O}`w{2bz? N'#rb9ҋ׽yq'5D+wd6d׮2A?ߣF=8[eĶ"!{mB4ZEU|d(9jNE-ZbpzWu+vz(ec2P.lۙ4-5w龦u[)Bu $WiT&%2Q1X54H ~GϰFœR!H4Tđ? VR#?ige|G"F./LVR7Eڬsǿ8JWO$2D{ۚXio}C$Fu<|cyՊ%%Q`s'*x^`p&ijxȫyn q0;PI*u6<`eFOOውmFyX-.CC?j:W ;AU`u[9 [vfa*l-aTKԗDtcJJd)mklZgbSɅµpФ+2c=d&޺nDaࠢhH+Znf sio&07AQQꋪY4 #ׅZtP|lLErZ `@ePV/UB*Q3DzSxuRVt5tzq~/Lv uu;|PVwMe}7yع2Bt2gXYLX]m8lN3< 'ʽIvJ,աZO+S\hdY@[r׋ro_gc@53Ue-s** 15ԙ[ݒ2*ڭ;%vBH%t/M8p6]jO^e&- .Te` U(܉̽?^ MI{%sR܋z  ť:ngKyx6e"S= Lן'\zqbڊa?Qœ)إ n6Ԧx c^ ^^qʼn9O +3y~r83k*PIk\J] ;j;h[&2Q }PR20y|N(屮)P%g:;K_^9DcB4I~Sf| o?MQr1vT,6Ux_]r#9,^QVaO>/|TX4D#Wz0VCʈ*3oRV D⯘Ld BAnso؅ n>b/^| n^ ֕浵gi]пߒRW1ěpѯLU߫xykq^s¦TV5 1zMN8)7.`A{?F] ,=B7؇U9RW@Sջ3,S!M5BٽB1 < AB;.媉å "RDS,#-')L\fnٯoɋZDzE-J,GQ6B9+ IVG(8{C:XUtxpB4+{y9g {tBst_Q*qe rliwyvƛIJuR.TzFV;_ia&0`ri] }q~)yͮ~ Py%H*Ⱦ3_'z |>In%+[J<[%vQDQ:jhy\Y %7|xsּqHjF5%"J=\@i\\B@E>4(^jaSnSvnnb #(55Ha\~~LPin>XT> {ekL-slAaݮ&ZF\{D39T-,k+|BYGz\n7BYVj}SN{T܈VRg?OYL7e/P O5TɛDG[yC uy0^Fj#G8}D?=6s}j'ʌ=AY 除=ܑ'fZO0ި3<鬝{N3- [}/c_ns/N(]kd7O(?ero ӝG)-/EE|+Ռ C*U-.IϦ(ZeW/t?~t_JL=͔ IP/ rb\Y5 YN j ݑʽ"~!WHV[BKvRۣǙJ&f~m얓Do Lt*:fiyTG9~bְ>iYF~/Ǥm)^- $f=K3X}T-lR^J,f6-6E&?p-Dx)d*uOW*Ǔ02"SPu~Qoc9{?t 4!Cgt+rQ4?nЫaI4fg0$^X们4WRci)x-?򌞑DgndjcbCƳ)d_L/f݊5&kfHcQ{:.ZЉ}]9[(" A2+րٿ԰􉳊Ga1|-Cf.wZV~v+.XH_ZzN¥Lh#OǶ MAU4#m g-;'ϭgȏT>uG8,RQYy؁L]z:óW971U̬R tr$P曬hEeVH;(/vbWg"N,u+VjG[ lFHܫCN\=C>\2+~Ȅn:qH;¬_?7:~R2pxG4~ R/HolJ2m[wZAhidVc3{@7Hjv.C4jInˀ}Fe1,Yn s=)yӂj>M- uLߞi܎h_t|J<3TͿ=>gP7#bю~ yx k%BY{vP4F[^uk\N&,cuv \y..섲{A_J 6mj>J6C)TY栄n< OQ7=A^{i0.@c!>WPڭxu6,1Q:~"8_ԱQ{`tt157pHAMe#|kا ѳ)R7n#D!ӻ LG^o|@E=&_5<֝~y[赒A1s&+a(IX e:Q{U(p  ]h)(NwA/} G)ۻ?i~,s*%LvDjAYOҷ`R9 (Mp }4[,gA!ԍ hc KȈD %'U?M J1 $ͪfQ>pëwn( #&66x]n{K/>"_CV7!(ڞF/<>rWP˂pkᵵ,(Z_ 8u/BPH~ -mV'ʏT9g$dxKOq8I V!6c=׆s'ed ݙjeg:PAP&Z)J/a4b\ԫ5v@5$#AVdCų6n|GȢneE9)|nڇIE ufV2ir} ́rѻBoQROS$CLNĴ!"HBߏ _5@˖'isSI aB膃F0a5س/bi ,CC9tc]O2|L^$`w7_[ITR!US,sZD"[V`,NY2\C*9+K ¢=Nƒ&<6FJ̣`Z#,$uJCQxleY]"(vʘ?. n H v/iaF%T-|H}7 Fk7ťx@ekȃ-HURݾ[|~;l[UBZG.(.;hZB+0?ށNΠzFZ` 1j7M^_Gk\A:{_}\иvJkfvSH<)zэgUEb"p_)GtIVxM:Qa61p˃@}ܬ1`xc3RJIS-*8AHξ$OiBVz(R0aHv,/a),I60/#OCb?Z4Rd1Jh?bJc;n80w@Tq}#چ;i2LSzz)ӚX}kS$*>YmFLYy7X|7=my 'Q4ІXuiŢ%fw;z]z$ " SYF/쁏)ZUM}φfh0ڣŸfVm]u$`YQV?Z{ϳq'j"6;ؼUZXG4T2SxOZoMq0{x 5JhL,,% &$]G6%8nv'#쟦F0ekͺ⮫Le\F=hk@d%}SRnzRSr3:uh7XlKpɼ%$2ˣ0djŰu XBtDf|F9ȋr4*,Cd!b-ui2xgWcꋋEw"#GХeHh{\}E-e3=f5 ]E00FfF4++d T+=̞I.MTJe`EѯeiW + G6 H/J@Ȝː9$`t黨F>b2EC]`hLť.ha2K>D&="Zm!ِb.^D}"(O>TcXr,5.51!K_i,!{% ?I,oWKg-嶃9ˇ`PVS ⵣq21ʈa %])d-*$mx_Q0"y區~CY?\C"QYSQb/ 5+8Q*u1 <5:<#`qEAZX*gc`;#s`vm=|#\̌uPF0\$Sef\RkO>_UyWbJ.',QfqӢ@^5W?InikDYeTo5vų9VCگۏ; Ba/~4Pn Y8vT-BTabTn :l/[=? ;փ7[XYL67 :̃_V[X=< NIz+x/Qe?#,V!0cn*I&3C w-YOjF":|18z-,ǒ~Gό9YZGcz 9C^mƦ *I2! |gP$xܟ<9ԫ4BBV+gy^7vS/"TAh왝`yRf7T+1+0\M{Wダ0O%8uP( 4/tt\:]JJf[R'f9Ի|lܗCp P0~v'y1ap.c]mn^R涺qcBnns.5~zSO{bzn(߆p\`@DdʡY8^:1Xv Ӳp˫O8`@JD蚻 ,3~,GPl`v'ןa5D 3I e'ղ VeCH.CR+D+1QH)dMuc<[EڽF/)o [{Ӻpczzx%X9lF&'/VI 2[ 7F%wX,s,%`DA#I P~FIPD!ʮI-%P j L?Uϓ_00PmA]H|L Q4MR`osOJ ȓ>11yY<crYOjٺz].:G ُbsmƾ)9lOFٟI 8vAhp//T\c9s]m0õw`E7|1e4S(km1utVXػ_̈*̮ؒэ=k%"(ݠBPܔ׷֨t>)V<L4lµ\ n\߄3SdsUEfhʱ{ l-gaXwj {۔ę>?MT|S_ vYvotXl02h{{dZж[ד|6( *(3*VllcGFL:,DVgN^mwf>4y.7MH <_^RF̠ayS-)?b>'yS(6~xEn4ˊGi9*3qOϧ9;%qgAڔ@=)jl#66 . Ɨ.rݡ8 7l=UѦĩ OC-{hsQnO.I$lؾ1moJ]>Hm>'.==Oq=Ӎ$=ڭSԒG_Q=:&=:8y%=:66eF ʡGGңCDGGУc+"xqQcMz~SR>=<F[ӼFը)[>v&Z> 0(q݇E[?ȢZ'ТТ3!FxlJgHhuv8kz?qL6`r' Ҫ*_;+A);RrZ}Q2:l^\;-{&W#yjt'fqKy U.o3$L~R?UZ6.I=(,OzJOp0? Ãpeed&xݧ>61-?I`KrC-/εU-4So+pujReϣ_Ԩnº85)d=CfE~cHYmfb'%v>vXAT{ȧrVG9&|߈mJ/{Dt39+Fbř%{* xJY?FzpNH nJ޸'}o>S\i5U?Wr{6?Fz6]9u،@Y Z>AyM@hxnpN0;@X „K1yqy:4By'V7z){70w__.Gne_^-)¿Y]w U7BV*;WA3|PlS6MA1o!=(Е Q)U=ёFv*ݨ߄XfULEg# O ۉ~zt9F?{P(8r`V ƫS=:łC7":Wi 9.p_,Vj29~G؍`Y 4 @z}5v\Bӛߴ_WIyUENJ٬WAyW56W>AԜAy)t_? v'<ɁS~kDlt_EE_o=HǠ4?H^UPW(H<:Vr|u!?IǴgs/.V: :]B\MMśP8bgep1ڔ]S$ $((x%i@cB-) 䬤aC6%>f,)M m82ce+PFs~ki[#vLC˰z@+cyx(XV`PDVIߪh"Y(ݽ|QYF0eC"e;l,+I{ e+hPb> s ݕ@ [s0= O3 i lצpf(o[*P$ONhw;I7b_!!%Hyޔd:_(y^R.Z$LaPJ| #yG3[߰b{3ǮelQC'} T+Hڌ*1Ó'KskoC=IDU/A,UlL TUW-sk,^fRw:*oOxIxx$/>s'@ **vB˜~e/ ra]|:Fc NlF#nL0TN!g̎_؜Jd:RqӞ%@m3cY*+a;G.L^wb6Ěk҄MjxdUmYE13䌗bՇ k+zjqd0*ZVN+>"ڱiɯR@J #ױV@ H7?+! U(_Bء[USfH,o&Gz/,T`)A! Ov?I"ysitrע:\1)t:*ZCIIm"!vpU9fx5b,B*J \ @nǮ`a?~1u iZFe[a\A)A.p,ޤ+(/K O4*66nSxF*j%VT%T9i&8C rJ%|\Z%WT㴈W$}_0Χx2dF C/~`N;]uhPBJuJyC/ 1!9L6JU\{>TIU]0XqE-#j\1*bP1*eؕw5FOm,aH^,ZFCQ29QP ȿwR[m"x$<(#0ŝ{ Yim nY 4CDG^T<@[~%rwo4mM\X+suIM mIu3;n º4C<tG}shoD<B@+ޅ-l YP&o66%c0tQxw9lVqiktͻ 7 &oz|oJm|@Hʒ_4kG*7N6V=UpWiG~p6RoEҊW1StbXqfZt).Ÿ1t?x Sh~͏@x/GGRd~ #|XƳ>϶> S<)98؊^Ǘm}0'1[m}$r}XH[>4u804>8>M|i~4W脫a} _!m#)i}LB'_yj1l؆184Yc|B=M/\[Gm~D9̏)u Jc < c^^ ?P*DC1-лiKWX y0mJ6@Hhpㆄ n XJnCkgJж? W0@i Σtڔ[EU Ġ 3JS -A:QVDo6z2oTєBr, 9n6rĜR?Wg<[<6n/]˒$hlxe ɨC2 NeX1[A$|s4te(aBnEd@NB'ڽ#.QR cPw7 Yt?BZ$Vg$91/ udD`+#8ء?h BZyɨǙ{!w1M=9(Ookik[}Pl?tzrrs]>?~gNAٓA: ,A5Wg<*92>A"),k/9X6h8y7\c&)oj;0R5AХ0 nk6H3!,[_I[xϵ ݔ̾aev}q۲/0[pcQf[In2}Θ,fWRٖgUNO KZb\ z"ԫ|(&PZ|$9#w5b c)JWLPx<*\1zz#nxWF :o!Ͻo) *;d#}޶d ϔؖn|`L򳭸TL0`_m:3(3^IDQF?72OƘ /=np9erѽZAz0pAlp廉WDܽ`HdRR2u4 f`;-7_,w#LB|CZN1#LZ_kApQYvy'Ϙ*"!e?E2XtyEHsSv1^2LP" ɤP;!{kѸ.B(s_^[!@mb#2iP9^$;^d/*"NI@|xJ|iu4aerEċx+I @`KQWȅF8 Yi#xPyAym W`m{5Pn@Jrbe*}!tw#т&z"{d1K=~A+ !Ĥ|.EO`w98S}ESúaݛ9O6ˑnò"4"L=H{mE9IMP&:'eڷDMRF/䙠(ltLKKqک):t*9P9 =ru9ZL3uۯ<)w33Im8Aٓv@dݩV#ES 9gdI,PDb:c+m %r][ɻsmlqY4xqk_QAj6EGhF\ FPnΦb}voYxxRHT!Րiۀr)NYss~ѳi'D+J>"3`yU윺-\0BhcAp,[.9 E@ F4=QKI/Y4/]jf(5-愀Vޣ]Vl2YV4hH!>($σ؊ϣ`7U2)YF [6ד~W Ip̍usw6s5Z!҆?Ɲ^FHď`nP ŽFSFsF9 0g07xs`^;ésSe9é6ET`hs|seSI?1ٻ_HӰvG܎`>ܝFܛTfs f^g07~ܝp}; 3ys7(;1W`xz88`n wM`n01y`n0>Gq˙nK(7lF|su+g̍ :^`G;)(={tH'J%!rrdC1YXFofDe ~ =/F<rß7[;HU5_lҁ'G y.(g=L5p?߂r 3)3txp91ܔ].Q!l& =OĽ`D[OF9e D42qV;|lbr~qְ}6i49e6q] :.ɉ5{~fdOnɔo+OYrJJX:OgIڔ&nW#-np~Q,mT߮5;~M lSn:񊲂s:}4B/tjvlG4IټjSN۰46ςr˄UuW~M 79ZUp\ j.vh١o I9FTb,(˶;N-K]h\#:T'L]Dy苩**r # Mȏ0W6q )g'[1AZvBQ/Ft`~WFb7c#K" 6~mdl{r@`{@95-%߶æݍw3)g.{-« l!t՟sQK\]$e/3e_]l.Pf. ĸx+baA"c7$rﻋ1 P\^|͏#.ExqPcI/ڗ@. Vڰ 82xƾ5|ǁ9ӑP17뙎M +uLez Ṯc%sxuta"s?ytl:d1~".@e;4_ϕ7,^jdo1a49H%Jŕ 1Gq7g@UUEID_xPA(YgnVlaz9NXvXޓ<]p2|yUP ؋_G2,85DZD?(]dR6g&_b9Q3k{J&EO=d^/*^^ӂNM=ߺu}i^3a;YKؗ% ^HyeՔPbJ{p ~) рWm0+![T-Jr+jc`u/x_/}&ꋠTCX)EOmR76$Brx"(5q\I$)uSQ%MYi/o2YуC&epA "]=~Em~3YVjόڄGBEa0wQi4v݅!Qe(y%ߋ1Q?:M/bp~KԀ?TBxYEڿ;&66l̦̝:ȘIK\lB9h/>|,vi[%[. F pMWtM8kB*гj!)-ԥ1 VHl̓_QMcyMh\ה{"ȷW'V|8T0 6]zƙMͩx _b|yUR][( Vt]_CCKU% FUUQbV1ϰDF0LiMXXZXq XYvK˜HvyT9<8сyz DghʸFtTnB_W[+taSrƔCxtr* -r{4(\ OSDgD2]vN'WL/Fe@!e0+$t& ղSG'WBH>@_'WD~Qm )f7sBJ嗔1 ȇfν+ ;x!L:n'6W~2=5 ޗlYE!;ڞps1GIx h#m<6? x6nقx"u:71GUl˜\ȗ$LYMa(rNfleo.6%vF&R5rm{oJE+ Z36S%{Gh{̚ \V O\oq+7צqI[,GǹNPÌ]mPZmN=oH&@/.IgfBuWZ]lW;Y3A"(ڥx:.txe`d:#Kal=8ۆ\OIN1ed"?UULSU 7R}VVqF [aI #-BEXg2, L, {Kۼ>zPȚ-٧YQiRiJ W6EPN YFltΤs 1S88~3u']{QSP"&(ɥV-ޟsPIJqJ<*\Z4w .9w VƙSlO3TFX(kf6DSs9ne$b ^`dnr BIiaշA6.cjӆF)*|Er06Qn+}N6$S{ CJWJk$(Eeރy'|L;*|ddY 4Im 5NH9M9E_I*LkW n&^TJRJz$Lޏ̓q3YmNޏAXD wϿOq%Q$eE{#}?Ͳpk7tW\ C3*R5I _l ?°p\R"*/5`g۴Z aQpB̯JGU}@<(PW!р.H_Иo H\(L1f,DBLG5D1EH),UC$@TKlH΀ RWEp n+woHr2( b솄>~:AfYx<#,iG.x0ӌ50L~ExW8 1 2rq*sRB7'GȓEܚ/ehEa(W{펱(aXE!+9zsWn"$A(@׃dT&e?d9wz{! bw|:+C~fYERًDq|o7T%9/7_ msf t5Avٰ5%@CZ7a1Q)O, 7CFTvW#X h/2"VAlz?{gxH%ߨ /aW38l@! FZLB (qH4݀lyFQJP@m" 80W(V7~p@OQT^2&ΧlfܐcU9Q<BIIOC^FM#SrETl>uH|Exȇ`qQH H?ۇL?bvC΄ ';C~ 47]v:60`nDg :t+ 1) !W* e⠿#fgh#0k[,>7o (9왓zl\2#b"qBc.@$eoU|"얜0V_7 nz{ @뱠]k|]'b{vH5,}*㮚҆78<}j|o3"H;ɼsMaտZ\̌b_Mӑ2g8ʘP_t, $L٣, 4]B/8Hݏ?MbK\}_7K?>БaN1㻴Lz,crA!ˏL~5p|XQEE҈s& Llh<ICN ~xIv uJLb1QAי?{̨q%qQFt +6~ V/\r-FZ &ٜ_z7ͩvs C`)98b˓VҍD'$s[*|b,Mt#9E6>J [D;jLTKdRO vnyI=I8 ̼ik6m71"R~č.ldreSL5 g=X<~Mva&m=̼gcX,K@SGlg2HO2I%J#JMAilBo[l)j+y,^RIb<i!'4$QnѕY,C#C)4y}}C]?? ү׏CKP[ﳷ5i~"|k4%h~R=MS&k]`.31.T7i<ҶvbTşsҵ FJw}iXˡX{$,Ns7 kQ#XIEԁl|–1 ”[in55|{xo_m/ d&BvN}#'Ԋz7j0K 6^=xUObE6)W:d'MYJ8| z&ؤ OP2;@ADl(8umNG"@MʠțS* ^azV8?wl_z cjDęWGl5C`N ݶy-e%쌜W79bܐi@FcM;0ӒDm\X)|99p7Rd'TYgӇ6h.L7PpAgO?7Z6ގ2ːAC@@#8# i0&[4zFp ,-9罓l7nj6L"d;E2ˢ?Q*E*M j0㾉wEA6'a!p:Mz`>0YBp鍯Y5]]cVN} iJB'a#g%¡׆G^.y&-1@,Q7Mno_} Rkд V_%E`AspB͹A[Dd7@({suhMGAf\wc^os^qDjI#4![%Jtf|Ҙn@_lG;ԮDF%0ҝr^^k`dK9Yc}F'h^x5@{ZK ?_iAJ_&)]auU~CV.U.O;o0y~_"s6#Iοn X\85BRnLnJ&c޶f*5ɺoph|5wԲ Oe%PB ;K2J,Z@XCI#- ۸-Z  /=rSQ= 4_ Z/.W (r堇X4fWv CNpKԀ>*#Љ慰ֺY7\u; Pj'COJ 肗yUPz]נnCڲV n.^;pS{g1^Jxmm3f$fV 34O Q7C5:pi#D+q!.}_R7]mY%/AN;Jt` ]1hz ])CY֑W2kKσ:2[aU4f{?}<T> 1+~.BH97#-n ƨ5>Kw#Gr7;-Hz­>B.B{[W|t: m3Z| ֌&j)Kme66_r[ݿ0eh8R㺉*u62̆tfDz2kYÿi]K`$mp4͈31j"cYB$aCzX^5Y2y\W;־j\z2Y0 %ᢆh15R aPHq&5 =mt#0XZoA <[˝Ԁ u$j0|>Ma(؏Bn7A n9$-ج[G06A [m"ͤ /"L*&.ImL<d="~6d W,{IRlTC=zeW@T\d ,Uke8=L'ƳCT~-K  A1-"!RAM=NKDæѯRc3%IZMXz䔙6ebܖ̇2lɟw-؏zMcfp}DvCA+n|>MG4g/:6]cq_E~90C$y?,On?ByP25B~"!],[jFL%~e]^L2V^#S0ϕ[\%S_pG عDU""DZ? !Ez2l%~j|Ǒ=u!z D!qCyl% 7P[[<32gهGLOLmwb0=b-x1S|-!Np 1~PPQJ /:b fnjqMױsQq.4,u2N̚s2Dc;RA(ݙK>+ @Zߘ+@ˁ= RRryD0] a8#qw\;@ i 2i*˷t<vb) P \9 ҵbL,_d*>0W)G!8ɉ`3b8(һ7 LL³3ȵ-I|U8ޗ\>]pW"6e[a[E\ N`2=$R&$½+@&퉳# ˿VeČt[iL<+}avX n$$*/cϺpŘz1hx:{5[̓R ׆]^ gy&[~]!/5P6n3rC+``Ir*xSg dڪw.6o1:ZYγyh`Qu`D ҥ+Ϧ&~dP81_M e)C[7%Dé̚}P'qȨ{f?[C /x:f,$H Y Y(Y~0,ewRLqha-P N[mkTYKD р Д =~aG*9\^u4Қ2AAyPbl !{C B; ^lci ]K,Fs5WN+Ecr=KeE&L☙_DuHM31i$pa%! \BI=O-޻3V4\DVh64g= i0'Nn:wMY@p)p \y8zfs3: 5iUJo5+ ٿ>Ć*-T paU&B2NrLjq<+3{ e;GbU.х`\ !XEza>HVd쓩 V8 js?n>庖 a2i/u . xWwLǝXjRY5p?}-~T\Q1Z&In`>,uc˼qMAb~nE'3H1QMK~XI=xM擓äu,aG'zRo -śnZh@5 5zVMV^U^|8֪϶ܵ e44yAS;y I~+1ыG.}'35m4"əNb'V|6?'bZ\t~LrQxj|ZM/pά{2LY,Ԍp]WJE BbsPݪfLVkd^"ïs݊'5?[k2JH`HӖ8&nL[‘xK!IJJ.l`)4$+/rS|qנFԖ)\H2棈'J92@# $Ppx*Ab X @\JM<'IʂbɁxe6U;Ml'Z D=titiGȕMP Jn8X3R{5g&$8 <.5400[Y^ <S'&ًLJg'֠tNRM&hx NJ' ('ghf{48 U*SV0e!>L;L-]C^G'5 g:v.1v`Eĺ~ kdή3f;PyWjnu敊)~S)/r!c UfJ-3lsJyZ Sj(+[f;(0f 陋v6UMz ;W7R{Ԩ1|:1t.߳;E |4^b$Hq=7I1ΦӨ\CX ֥@.C]zO^DJ'ڠAc^jx݅8MxZb -nDҤKOU?1abkh є){pWkPA2})\ u2tMɿđN(ӑ8RjݨIo gwW1`'j>V;bII1+M37'刱9 S mڴfTOL@sX.Xܓnv4j?^>'A8RNKviaHMnq{*N x5wI}d1P89s{ 5 T8te\g#r&PR^MY_Iү1-V`׶RWn m |E*_ŵvvk A4&uY;"WXa/+NKQĔu?j B<ٟ4uF\x(ч1mlb̻Pew%y6j ڵSd=@ ं eBӑk,OGHaFTEϲB PXt kw`al*rq]eZPJqcJdH)C>X}&WҔO=Oq)@ұz 2iSkchwyp~Cҭ\M%f`Yӝ3:8 -cJ}TyBNzTBc"ϯrN/99^RN'y?)SDٿ{%.SyݖGwRkQQ]nZ4r *Bb7ydl4;+G3eb b;(60 x"D:4@CLjW N}}6o,OF11a9q4iHk:eIJm1T)іxDqNk#].e`LzUC'&k\BS=Wǒ1 N+;`cNQ tT^("2UkA[qV+OtT(X>Y$nZ||l3]Sc./=;Y̬Wl43)C8R֮suQgC :*ȯESy.P9fÙ[ bkݚ0?8y/_.3|{- ndq]d1WBIdE诘'C\t]L6v>@=#.r*`5oGx{$`%F ;J=^:Uw,XEO>hhH '2uU>cwOr6+y.#K5QNLщ՘=^WɽʀY7$f L+y5 y a8yz1ǝƀѼM~IΪ+I9CA;F+J7P .IVnd6t`4aiNI G>-Ⓐvvf}71];C`<6`DmbU(-R} t8 }[PȢh_bN2f{Jhf9ZZ+ay=U:i+Ω$_\aA)mX:Ole{ 3`W޼L2s_ҦX6pXsW2JuHdz'>d],z I7tXhWS(^$IN9SN]aYciӖg'5:ͪ7D.K ~6P2Lf'_(:BEq|( [8;غ:a:ȣH#.I݁ W^A 'J CT̓\h[a9}`שNvLϫxB~R<]рD@78'1dkT@z 7Ի7 FL* 2/x@`6JtUp1rD# DмF|I~w#h~C+T̫BmnO^w4B')t1e3 Ҕ#数+"w`t4:hl/c>sC'@0ޞy9<.Qt`Eļ Fȼ͸1/W%3YA|/"@pp6p$\9SEȦ`U>ck˫N!6 %ᰉ]ÖF@'0}<&<8BtLJHGvNm)w#.|8NG8mi5,V^:bhS-au8`K;i^S'/x4һ/U>moRXHة%n2[.)ǧeO9"aiHL׍l7xDE]aMFqԩVLasha'Bo# )Hp]E_9ds .BI[nɿMފБ: qR(Ӭkq,zİJg˞S%2mQ*fIs q'e񀼵ǧz)x#UGʿr ;SxVLB{{7":2><`("~Y]eb) ?U*6hv\A4i:%yy:;kkKBbq*loJ*lYk=E̘]UvKrJ~AN%眷S\} ۯ&8-gMITo?bmާSytZq L#eݔTG7MZ//BsG7e^ ªuEJŖZvLł!a*oKMn[VH(1gV8*~CbWr0/@K oxjJ0ot9T E;A ry:3`[D BYź(L(txwkJChtu8HWi*$^&$;Qc5A'=dq*iVhL=KzW|]BH1¦]F-7ƑR[L Б8Kӈo@Ry LFT0ko8t3U=̶`$kF,П9(O*32H*#<.p|mI DgT!"6j0JEC ,^Lˍ jW㤆;K Dr. jhaP5;HZIz9HVzvH`2(W#E 8UFnפ".3gtaJrW~x u`.'9SGl-l!1E+*z^웳 &\LSkt#z 78pb:y5U8Y3OeUXJfBDX!A%E(|)`2Ksv)[+?GC 5@UR Q58evLV1@CQuM9!ڔTh ġ[jvbzV9`; -139pɖ+]c]ѽgem#U,/e=^̈́sLtqcS$=iSu%0UJy{ڦ̽nӅ% X’Bl(DKX^Oǫ`aLL՝\'ɕ;.Ul!f#ɏ^s*xڝ+ owt=zha6dz:-&O i Ο'3tf́{- Q@ViU,5tJIZ~!S&iҠg.7 !N6( INIJb.2]Z;U+IJ"oRUtCbԱm<MC< (ءp RJ{-!w%p@}(*0QNx"Z@+*Coz~/~3@ ''y7Jdپ|`O+D_?vKn|7v#geҝU~>2Vl{7$BD S X*~Wj4>;1 rIbw3'#C? }'[\w{Q%Q  /,F(.SWkAc.$Lη~_Xٵv6ƨG???j4K!peM-Q q >=.SJׇTEsmDuWק֕$Ț-eLײR($NJC=GU Xs=? ⅟Gs}N-p^ЈCIA纖\ Cd-x`OK+wFl;)E6\ח @ ס`fZ\#= 蚣] c*ZHWPݝqN0J MqA+L̋1b_nŮ}qVlJM 8\2~8y/VWG6ɾ}B8Dv3Te V[׎+-v^6u=P%WՊ)&~/1 AR3X=|%<2\ |- ,]IA{ǖ~/wl-N~o=WCL+=¯ ;_}gWwE8*|--Ly "뗋|I圬z~ZOי1_+E9T~9@φp90CcRGJLʡEUյ_dudT4DõPBvHs(Ռm34S!4 W3]m[,@ % '"0/FoeʥpzP ,d! fR^TD#O*mi'mS`d22M`l:pQUꕠ2@˻3Oo1(uJD[Vs RIh7Ld2*ޘ@秊_d:gݞ-sxrԽ]9-^FVvL Ak͏wU~ }l>TO _22~n\/[:0ȍHh}50<7a&ͥ?f+"iC\| k/Dh05T Z+SxϜ eڊxs/d턻H- EyDАLU =m8~^mE{mI7<Ia > P>gD|yu\[Dۮ!'6/lXEWMv(x ,h4BO]y+ܢL:hf7vCtABaJVU 4-%5ym!X?Ȥ2NWCޝ5_Ekl^h߬5nN߳Yښo;lT̏{ߴmF^^Y:@k=L-<c{ȡP<]pm.X@:`Z!6_Alexkdw~q `,(jyKH=z-ErG;gq?oTwAK gA](NwfVӠshhv]9 -g _ݳ8C/RBE"zTYb-EniM4oJZ~QPfQ7| (g$)2ux+Ѱ;9ks7VG74D E{t4BY:`/P`v0]>,ۃ?<=YOcvx=oOwχ˛{dZ/\ tt6kg`><!z6|t<{Dt.QqNqbp;3's mXr~j79>~!^kQbZR47bWWj8}荻؝] vcsvFGAs& ks9C؎{S 6764xo衏mo/m@u:_,ޜT7gmhonг fMuF]{^7;3{\v]؛3 kn\qP/=/k-{߆-O7lӊ@b>(N?^ɴ#^?"vwoNdKjU8zHX~w([ޚFݖ }Eo>6߉>69 1JJV#պ|6_%՞Jy.JYT{lSJYV- 'ˬ0%"DD@6?2SݐZgrM ׺[|Xh,R-HQsK""s$cz`ĦDUiKY<i=7]QMpo"(W8ae0+Ya\L~A7+hpO#~{]o;?I+w 5\VMΫ痼Qߧ*YZ*熘}.ލ'>PD}rn.E!c2c79!1!3!M%4?e9}2!.6 .؆`V\]W%.ӲFr4P FE6**kaϡ 3;W7@Zߗ˞H .;dVq&캘0C6UME~9g-ø!q{p%ie=1sa*bG4c[G$y̒IvÿHQQLrl*\IIN'\ wNz"\L5"'}G$$Nɖ<"'Ag#]lt99B߲sr+p9_{v^NH؊tD}{D/B'`']$PΖc$4,dtrsroDCM7茢J9hUFTTJd)UgƤ+p#HɏHԙ ^V)91SCK'|SNu)RvnZ^$]K4]PwH*<ɧ0 ;+=Y fIDѥth0W ݸs!;#Z{dJlEfe'aٍ| hIl۸&w e1WUc9Hiwq=݅٦l+#nzlOFf5^~fsʉMPKb7Ey.>+%aS9TZT)UR"̬ R,7$k}0}ƴSs\Fzi t|BWL_4]NК\+*EzX)-,. r IJ$.Vwwo)VEamxsh\τla%7K{grM%cu[F$.0T3}FK;,;3V6gU(y13\AK3BH9H\ۇ#pzVKbj5.!I-.Hg]XJRzX$-|^ T\%83j\.țHXICW&'=5s̮9Q7~(C*#y}+ ySγJX0c2!QrzС-c#@(<VyR 7y5U=k1WT@lNZ8 TNSqh_1nS6әFNubuFw6xdbӦW""r:w,!acKOvly"2>wD91@b%lfٽhF&UӅR8"ywU6gDmæE^D ѤLCirC6> %a[q54B˲Ldo_gl>su2*I- o2|qo1;]q>]NWBKJ0mǵ3RI$'>* SåىaAG. N[kIC朾GGjM, CMP(X˭ĿsG e-F/rF͖9*ak_c38v+69X5q</bcyU'z`<}XJG t4;~N.+g2g;{9^p{z%Mյ^$uD*%nG> *QLS/u:!~/SUjrlN+Z Mԃ>kNZ7o-#=^Y=D ݤ]52YƑ71aqn5&V \&Au>䤚 F~ y씺Fܮ"EE\uR#T@YPp~Uմ"z2^՟Fl e'] ,Ct"[Pןo=_VORkNuK=MZnm$Sf^G S,(TvJE2Hp%|G`SqK-#[ѽx̿74-5y!r΄jq=!kyC`v3(,<8(U38OZhb fLEob1\[x 3 zv,^vY&l{Umy701K^z$mB :x8$(STų\L߸Za6xѪeJo[LLͪZ$j\.te{T]MO,#M$oeDWZ]-դJ8pہD PUD*%kwzcn̮7~^4|92UQ@o84- !#6_E Bf )S{ +TE{kc(3jqlU$$[Ug4W?;p"vNgu68 xDAJKүsOY7ka$M ." XN(nʺ;J(E3$-rp:i:er|# 3038eJ^ZeR^̗#|kʃ.5-YEW,lݱ)]oD|ZVnZ-]qTfTxu%V`k c<З:IvGsUe(%$3xhו9&50KGIJ*,m.bzp;7,o-KzK9ّfR/'/>ٳҖ| ˯[;]7Cʪ+Ңaņ,Y ҆ⱖN 8'4p Q}f-̬BhjtHw ĺ t`Qӷ+ٷ #pK(t%zʮ{$dsfhSO.Ksr,W>zďJRΆoќOW uE6T`ɏpӖI8gy1(lfx"mߛ 5b"6^sk!0Fv8/G2NP\_ŏ,BVB@^6i!)~x1G +`Hg+=wWK]#eBlMg;.Y^zJ1P?G٧qg?FWײTSKR'+7Rpd'uS-҄a"s(\8zEb|3(U\*of D@5ݮ!7H=Gs]Mcȇ˟3Lx6?X koj,hռXf.?fϥVEĿJ'0Y5(ӤYYV]"\"Znd귆 u̸Z9InC-"΅߶:nVv9.nL􄺾dǪ'"av ^K0r6!hY5pӺ Q`hyԦ b 'U+VJE⦆j2mbj`t4DB"Jt^=r٭4]ze7|d>svmzN4OPqn],}NShbcBL3_Y,:^r24p"D]SMI{`pEEJHx/$5YX\OA?hjG㉎S}Eb ( 3mn 2= .[^8KwUZoUX˜ bUH Q9!bsܢe0OAs8Kwo:[}Jڊ+U*jdh bVBSq:W`ieG&$3 hwH:gnpIu(OZc:7)V]MTcp(4=c"ц]޽UknDY *xbIbwG:QL }lF*p~ _$m(r@ڽYHfuǷJiV3[9yHQ 5tD9 ZJ(fw&]lr߰UE^BB3اc:tI{(m=}6q!=QZT驜v]K.,}E8- WfW(qቡSKn>PR 1Nzy*ű{GSB;W = Xfl,gxUf ZWt@ c0Am%G H3:x1/ PJ`mqQJ݌H2lZ{9D]SYIUFM=BtJa%"EWy2b Yr%*I g͔^UqٜyP_ai`^wòWڟ}hBHsJuB5>eXnv/k9#B -M44Mj8o4?uK=]7H_wjnPGBH58t _mz٨qe{鬯R1;yV(aqAaX( ;@aNzL`RQB+C0:)|]Z&i58u:LZn7ŞF^YuԏX}B=8c‏xf(y kO(gtơGERˤGN;G|Z1PV BT[b}Y􍠶]X&:u:Jo3_ H8[pXחa9XĊ|z'viX;R_uUVaY=jS3ē^➊b+ApG{Oo8*U*k;˺" 7B&~fE+YGR[v ep\<GRnҧѥ>cUHUŔV.>hȴJ_2>) EC5=ꎸi 95kփ&)RţcB@FOqة9s`EU,Kp6.MM5.⎏ݯt^Y'˿Թ?H8}De :fX٦4ԬzNrG!}W0CU8#V`N!>n^?#li5oT?fvʿs2T9U K$|V_nUC-9 Ry! w SﺵAtPpx8,XN(R8kAw9f2]'q- B- >={O}c 0XNzRo4KFl`^iY NW?Jʂ=.X{VCJ(6J@=*z_Y:/74ӣ>؋rz*pIS `~¸sp0JѧV mcJ@"'=ϑaR 9xU=g{a)y* ݿN|%W{+%MjrO.}Y)d)jh?>2ؠ0vgޗ#Kك2{1wVʈsU$xR_%yx+|ptHwJT8˰> Zz'YplBZ*Ycyzެpjg{'٘\tDGAI#dGwZ;TjUy/V"c܇ GT  %"H>$GkSi0w~ƖI*c6%Ɖ='y1?=SsCQ -NH2YX|DŽ0-7%Knȱ&WW+jYJ"C]Yʘ0VB5$!E0-e@aH\1!!9Tf lUzGp4Fu# #D44;\2yfqZުߤ݊"4cꒋo3# gP~nfX}%)筩q@5:80n{xUZK76S}-T4Hm&ֈiU8k[w}54C}gԹAãbߋ jKᛴT}N]U2yfY+oL4{&wF5~8Fzrx6)TU=aJBR)^|(KNmW9p;E8h/;dϫ}bϊ73'EQUGY>+mAqC3m.zdE1H}#e-[ȆnVlX͟QW?ZbJޡw"_v4B"FJ7?̊ : g 8 Ҝc!-+\)*Su- *|(+hHRz%}(0 e0ŝf7ʤ>I\6UiWh>ijzF>\+;Ό|=+[8ւ[``xʎ$};Z~"&g{*NS/m*$KcN܈oXT?m FW=˘[I$|uo(<a,ޠSIlbɯ -)OvHd3U3X"ytH$o1;e0 ej9a"5rHJ5n5ӎ{j3m9#NLDCset:3}iTe-+3&v2WZtFb `[̣Cn_SBJQr']BtG!b zeUu<04=n^AplF> kp7Ԋ^iV2}:Hb]o[n,96;4Oy+o6$Nѝ ( oguB)O;CƐX AYgfo!𞎦DӫNO.NUx{\{:LxlXY eŊw@Aտ:R0 " QːqyXZ1B([")25SJ29Zdыhvatafᴐ]#(na^F9/(ŭM34@^V"GV VPkR)O%yޏ Y?W%DHj xׯ!ml4.YC*9NBRBUg$xI`dXI:]4X0pG>")f˭Ti <|y?`D4B#̛ODN21iX n՟8HyI"MKw"6N(IdUGwzuvfڳJul /=![yd/4)9% fTJs#'~VI=cׯhwN%؜z|wWh- #Kc/o/AP5)Y =<,+mgZȞ-^TJ\Xm0ffZ OZk_m/C섂5 Ѐ}rv]4*u4;ON^NHp esMvWV :4h&EZzEF"4}xqzdETBU?8'|w(tH O96!>;?:^'RߙV5wOl!SgqE-Q lgFoVO,3Mjljb)]i}lLՖ0?yRjZ`\&JB+^A{ C5|}Ke)]"'j0m!lu<}׊'$!@H'P#h]dQuլ׏AD yY!q_ߘ/}(+C+K:Ԡ>Ǿ҈pUEhn.O;3GPDwz\v/W<"{YדZ'vxlHr6Wj*",Nz Ω m>0h؈j'Ykڏ\z10s"noȶx]ʙD7B)zR\ȺsL.F^u Df' $|\@O6yUp٘SfN燺}J2>D*󓺶A0LMoԁX2g@\͎H R~jEG`;|p~֖8f(@Wă q}ܕIa=+Ϭi(NIv4 |^*nNz;.W vzC|4%/-uGͯ5^uAt{{k9g-MX&K T*R+?E׏ !M_m,qst}ZǽٺUy+v5%~U[F]`LDq/S//xIv~ m=mQj'&Av̈́.w#lcvsѫ[m۞;L=˘٫{< W UZkZ7"^؆ۆ;/0ݫ[RYP&|+=迸3TEI{`F(+b(=>op]5\ `p~Æc*e*6|F`<D_6|y(^\ 'LFw5Cg:831|Ź+ކok8vq\  hC;e><~| <2".fodO|h%WJyq6sp7Pƈݴ&~,J=:޵qeV.VU6Vu?=3gmɽ9ޘQtQٹu#u2a"{K P|6cD̄HiΨrExSx6 'L` ƾAX>9z@SX"A\@G͎3lҗkVfvf8Zqx_|A,T t cMZՈg')h+=-<?.-`L}JK % Cb4kڌ C`7Js? .?/ŧyW@yT>̔R6Ϣ1GmpsT( jw =pTtS 2!y3q,<w )JvB%MD{Tkzu|ћţN(:rīE1&ZPIjD})&.>l}{VQ<-)XGH80n>zW|`^/Pv~V$Τԯ렬l.RD߸LG_?X=iʍjPN9kRT *mK_7b z,D(fxCRp{-JZ݂q /OwΜ=\XkW "Ǔ6I4:?r҈p.%Cيzž@!{dwFr+0^[;";{.Ls஌{o6^D+R3n|}I5Ydk;>KwFx` }#xnߢ#- .{sۖ{G3́ 40_,YSL|i "b9Te>hz2lDKYA2]x;g<)ېUx )7#"1WL6TdI dSz : V?6sd:AWW;rùt!bEqҝw$v!ʮE@-JaZ|nu$on^ >*~; 8. }k]}qPݼy(:g)Ąx1N%s.-]{n!wi/}FiW^(x}8z : Jjg@FI[GﬓtXgW-[cU\ꕣ(4&@ݽ{.0S1xW淕V%"~_1i 4Fd?ꌦO iK9'z=yHk5 i3y~Ɲզ0Y eg\si' V=Ǡ` V.kH^ix{H߳&UyBhHb{s%>p6 Tٛo;;TeoYX`s ]Z}t|f. ğ?B&y ?>e30~;8P3#H|;uѳ7?5>_eVC_?1# %pP@lJ7BiR7E1kGgttC{gENvF6^ zQs iƦm&/~_z63`zZeJ~eEo1bnʅfpif}̧O׏Nw!{3״0x.3I7u9*v;N[\BfnpѾ`̅p1;_V?d6:owu{?G7k7H$ή]{vlt߼iCnv(b2 N~{H.g5=0J'0.ȅqux'譆x{(;^u`ԫCiq򔘯÷vW/$*(,yGÎxqr∙0)`˳k"|gPͷ>SԝZ#_V!+YJ^X 4_tM9u0e)k'5X!&+xjG/-r<lj!B/*ޔœmME悃+)}V}%FLl0]QA1yn╶d56MjܔC0uh ?nΧk1-oᐐryѓkTcdOJ#pÀ~`F귏#z(nJ)Ib'+$t,C\Ic #RYpxXj*k(f粋"T4k}H!VEY3&.w~a jI )ڬ㱂EKM(%$sbƗݛa?t*à$n'5B\uN>QeL(zmJ$TJFٞbX̏b9&h2PQoHB]}顨p Yy#&{,+G,t\\0s85F̒7<]_pJ>Pݾ uLF Z 3yIs+*@XA&'"`ă,*QUyIbx? GCraSŰ:r;DRv;똉|כvtytߤ~ZIeW+2wR;TrbP*"Ztv3&)n??ϑz *dgzG3CW 6aTḢ%ANEJB/juLu̴"mխ `HG@rD}KKqb(lE1q.P>Qgvmr?1#+n]f@\=kTCk>} IiӠ\Dm;DZtapI\ϜZ8|nGP_t׋wjWfxFP$)6}BToF?\<$K޳] ;û(&Xa-UpP)6ϗJ:^86_ _]"v謜e?:3eSPi7zN 'zca7J&NI?m$*=*I^iakTߥ+DjwrPZ5(9ȀTC|#J٣+u ~LuP@w` Ǩ˪|!`ntH֐- "{zzctXv``lyqڃ'Ge4KԤD, mǗgْ#L ]=uosOsvTӹU/Fn)'/>ix׃&&};4wLbYrDcQ1Ot7/͈n,S'Q/Xz|P/yt-Gtk 6k?e "L.? "$`LD|a<'5=!?&D3{U8̷A!m/5s6|< `ۃo6uffü0C>] >0RdA`לYy5M"o:99 1~62U _ @@ CYOA0O󟊢H :$uY k"Q+ڡ&R|dm/m^v:=41u:ZO z  ):LVa+18q~ ZORn4*%yQd fֶķ-UL:Y/^{ER* _4V2GӵTZ0yf?!-_[_e@U}lv`Bk.U^`ȅ*f?߭o+=Yٵh$wΏ 7C̨R*J8NmU]d%U ɕ(FNJrVZbuzSdKx_dg%^xVŜycDRc] & Y/4Ř7lE^ga.][/2 50x73Y3xjGMv++zӮh$SzBgdň}¡d_40Ȋj `cFQ'rW#4 .3ݴJfglDqB8T?aoF0*Fle(B|1yw8)+a?>uǢi]㥘YW|YۓbU`d}*1fa}+NL 7ʵ.zUn吸)DOY&gs xJ+q8\%8O!(_Ih_OFtA alMKMW!_ X\㸬|3Uw.)[JLx[P:GեzwO !7`zgˈhṉ~r`MA12ؑe{rBiJ]#9ԉ4U]:m]6jiqFepU;FdLE!QQ=Wy$TyG*Uï8&qs.ӸxS652ڥ@h Oolf@k/A q(k P˒n8{㉣k)lݕք!lRli 1M{ m # Rn΁(Q0y6P{^n ؋b,d-KB]s <ԕ2+̾vM޶ǰg9žoߚ%:]"Y W {C8diju#eE5,?L2 (]Z䜆oB墱#%;b _ Wf-Y)Lu˧=(v?v,b/uqD1IPr10lC0vʮ3y`7tb [Ga.:e{p*d{̈鳉!/´|Z6Axk3tыWy\ C ΉYfR"Ԯщlb?1{/qK;Q, SxTG(/3kjJه̈a%2+}s먞 .,yő>U0ũuy9}5u\Ʊċطi~M]|OHLׯ;aMZSąW]nofc}hxR<+;WW%kÓ\-c&tGVlvڮڮef(iϱ WNgVݥ|·bW_;S54ySy3D$}:ڢ:ۢ_0pUV?" x?~Vy*#LYz3jxV |s>uMZ5s6iQaۋU_;8}+ܝʵؾ"1U^Ie.1v^:AKnM:7ߌj]忮#O0ݝic=;RJ߶sM,DoKg "LjHdaY?ૂD$L ON:+ÆS]Q÷{5~}c޿p|?t@t\4aAǪԃJsu #i`XN='(; JYz!JIK IKf&.@Xlt 0HDJFd͕YIKg<.F '-9ino3z .i^MyCE,KvR Iê9#n YkYuRkXy; $^ikHPb#iR Zp3e_fJXJXIӫ|Xʙd,ee郓N=31P K4~+-{|мTPekAn0{+8qPwI ;7>wtox"1'Wydlɛ`).RhxzýYyv_?6b+.vq\Hw'%#ҏsmlw U%s[!(Wmtp7e# VKqVFsM ۩dVʤ 6s7#XPWiW= |icTT=?*']2M^e@ǡ3eن.Lef ]7p꺌M J{7ҍ3LrNº#PpEJ"%2nDrd^ `ubÖq :B\b-/}#=lۄ wg @F*o@ɘ /5ߋ_4o~x{j; /icãPd1a[Fc}ov]ux&5Q}l$j~3: !eEm[}ޅbo&.J6Wݳʪo75^Cr/@kKpcp~yݰ mbb~3*/=!7J(-_v-G l$N)GČVD0/Xo lx=: ǚ:@QHfvd(Uv~gr0$8/lgzH `pz\a}@Xx ogchM-`m[/ -XŲdjP) i|"^U_:`.ttz^VV~8`f1^IV[)8kY?N~% ?!9N ;ɽa!u})v.vEՙ!{ֶz&jCשRglz+LzG @+|{Ӳk*W'73k7̓n#8Bq84iz@},T w:~XY  .jڜ؁qz,/[7b ^ && A]oN Ъgi? ʆp3أ.=̉OBőWmq$_b2qV%[ 3ETvK$c6B}e)^Pl06XjM}^1)^1ͱؽi#[xs^}Ґ*Nm"rD#DDh7-VMYOqj(5}b~t@boÚi4՚9>l(1ϛeXA5S8I&н!.;pXSQA[k# /Bv4E~<%_<_"tB"ωw63a8+]!`}ʄ$ћ3mDb@I!x2QaE-,}k홾N- .ZW6u6XPn~kvu.tqL]vo tU_iR ~J6jS.^l' #<7Pt0< 6 },badgcHW3ŝIΒc< 1>Í轅G6q`VTn!Ipps5{U)$=[jpYNw2:yg3T1J#JaGT̸ISD"w$QV!ǩAXi#$̓'\D@* ,/ Q :ypiǭ002 D+Kan:+o7ݝ Οa*^xO7bQ}r>6ؽpp n|/Eً_a*u0Ym*n8F,8=#;ދ?{nݝ )&Tծal( ~û\:/ڨ8wlј ߤlˈ-^.qWCO:8u]GcѮ+`*R"!zuDTc[D7hذDTKzhIz܀H]+pxtЙ c"/UGDGǂ>'#&t؋]6 - D=[Dpk U[Dչ-8" A5凗q-N)]#D58C9am~^~_y-p =7Áh.(^":zCb)233\R OvVF*0JK[D[Dޕ;.=?Fa$_FHe;FaH^GRa=M@AH^-XF2|H6⌮W7W/ɫ)td=FRc$cpMɫǠ)9K1;HKlta$|H~݀/8Bk*:y!͹z8AO ݵBlp4}2;J?vGH{[Cw};NUīmcv-ng_igYOtvypq_ULJڸIFf|B?>0\J8=%!s­wv.CH0`ָ SDmu0~A\fJz2N$Jfe皱GP0k!0~:&KPɰc]B(^su{XŢRZf;g$hϦR͓$;A3i] E/ucw϶.bzb\V5~&T!IfM E#ܼ!/7p53U9-P3bg߿WcFasBZKYZYw?.M::uۡr>NKđ\l7Wb0W-> K^p/?.qnΤNr!,t[gxa-5FR|n2-2B{fM8دde hfYul%NCj%=\<EI돜3 0IG/,vR9e) ȿ)S)miWg{paE'oJKUrկ+y:ͺOVS|o8Jt USb:}uQ 6^ ID>/\DfzÃDհՀcuDDInSŋ YR_MϠp4ӝ^z%,axR/s3yJ\cH[~ c&Oo[%A:ONY`-U&G#e⷇QLcZ;cJv !D$ 3fy'xB-az߫IhMUYl1 Cn遉Yj5X[uVH6FAEQ Bl#H147֭)%7\m7%z[H/Dnml gUzxp }/*Ǟm%uK<~1w« YE26#:?ע!V`[2P#/ù0YLtY[ǡz4XmB#BAw^:=63\?JbJMMu̓ L[UEBBrkS>V6*syʿ^n1O])ܒv?if0 *et8IJ"s/BCe7e =WĔhK]VQdbu·x4IѬSߓrlk<#nMnvfRFt ɝڂ{"A'q4 аT-ph9|JZ ;!!ݰrY1i.tBcWvOE0ݳ(w%UiڬEUtw[K!$Ai/^Iu -oMq&'u?}tgUאCxLA'ckZavD1"WXe<Qȳ&"fZ{v s"GJNa|ֹj&]ON 'B AsBbe__ OsT¿(Q:K|sp#S78[Ut:;C3VSw3onukxL[7GEvW5dB_Yj~NWr,y)}ɮ.ࠚR'}( `Aw2}~śL]KP]lwEk#C' ?)'%nǰ[(}ݫ(d;*  0mIj^ޒu 'WIPLօk%(SD4oHIBDWҚ$[޼cDMwC&y>nd&5=t+`- A^"y+Ah&ԯhU-4졍jȯ{E"鲒TCq~0SX;HPڳ=֧ƄyԡǡMEjr g/|S9ǣS<)j% Q !W.FXVg,GDҬYVQ ZdRR%++a7<綗y;}>uay01}C ='-rxJl1'Ep#v=B΍:soV[w$>^fm9\+FBXS6NDj>U[\Vyz2 X $_RzC9ߐCdoq^0{ +ffzAVQ,DHl gX V3wl:W7?R:u_mb*M~<0&$00FwwK'H'X(#nq:㢪FU gL%q컻iq\ۊ5C;`^/7]pt]ݫgl/{vl|Z/;%?UC=LO(t?b&ggta!l{1U;{bYä2Rtp0u='bZdG)VWqBk~ Q 3Y'ю0ިa+KB'1\G(1{޽%S1W}QT&r,A׼"Ғ`rU5кb"[I*(6\ ,-1(^} \T!G FW@WIIaj<濚{P]A;]"PB=κ.QoU@WNϖd͕Y @k_d]G}0ݔ?yP4ǯV<$Ѻe7ᑈ1_"Α1A>~ H|KLE0QL1sFMcV̹{*Ob(PU&ZRpcv  T-M\C/#k9$4'@4>KQ4"ԋ@b8f5gv8УI.hP;<$Y&8 ]I1Ri|Yu34%JCzTUL1HQ|@GU[m'q>C"M" !6IJl$6(#yf$ SgSSXfP _t5Җ /f)jyQ(9H# C ^7|ܨ0CI2Z3M4`.U{OK[X4;W u${nj{_|cxH0U+Pմ(Pe2`iA !Ph0t`*VJ-u#. g'YHl29K 1`p["W#e91h,=,s|8SDL5l"j-t:բr,Ūn-n_۸oXZtEl[TƄů #k퉳5p7$=#J`Ro;U} XkM|ۓ~eW0t)9~(Wuy$nW!:v5~Ǽx'XОNydY$?0B)O0,NAG\Y5װj[GB G ]Uh㷍ksnIuS ٬34%'EglG^㪺hj8WmoԽa\H+d#Kà? #b/A0؜Bl#ᑴ/to!<D4ԟ:7CI`0& 3Wc;}!3:ELbm ֒ pu>A&]]*nsH D%;Z #+`0`"dFsbb)jj"AܝU-tgN4{{e<6J[g:QlzEhF "0wǠag']#'Mq`j={N+'ϩGY! 2!O9FMOI~pA]P)eqpe<SZG ҤK6JzKm!JtU_X;`Ֆx_DL~#>Tj(c5żϞ4h0|ʹ{"d#^Q((Nۗ'o* A\dR".a_)C C{@cw,Nz'gm ̡̆I"EϊqBsE #A7}Zіv-KǦ)<Ȥ,< iV$d#/4k˷G.uQ pKє(i3ƙX~7s :BDDp>b,Y$,NuEewR5=AEN^ lX^~9g*"+h"%Ӷ9H/18VV5981X?$Ffb#uX1B،K #~^ښ|J,JF떘8Ĕ5pZ2H%0iyE"3^ZL?30N@4+4{WhTҀQušH2]*hu .÷&5ϻo=㜹z-5f'9nR *IANGQ6KFrhUdה޾E7// 4Zqntl!% $Ci/E\%MQؽjRjD<ڏ*#N Vh4Q\nv9"Ҵ~$$?F8hU&(ȏS a75+ӃBxDpcâ(QxyyGOD A /ΰD9$/(m"Mf!gu8m_VI{c6&^:&gni.X8boS9J a/ &iֳ#R'9dqPUFkUP!&ޟhRT;uık{:x,9.<0T>2ڵc`9B$oiךp9@\ΰן~4J==Oֲԁ/5SXUF!G(ӷhqfJFEwSQv~GMS'&FhU-ٓ4*Wi rhNtQONh6h=?SCFpxd h8 F&HN3]!4 .M{uC^*`$^n1f\s$)|MxVUO 7؍i)UOJqQ|d* B74K(>܅7ob](?x@+.-(σfՂ-GGźFXJ (&Qߔr%+]D,#i|>E+Jڥ}V"ѫ<5NMy&[j!ŷqUݧ]*.t>G(F!PwE4J)Z!i "m7 SF^(l%UGoc:C^~Q,^AXʷ:iϑ_fg<{ AsFKʽZ^$]LTQb8|S"`tT`d$otPG0sCO84 ߯ ythϱPpMMxڵaX~Y˘Y<4SFD֪{}s\,$z:)ƞnJ~sKMOsum6E>Ǵr'a5:VV0AՈѶ&EcQ^!u_豼cVGkL Hf/?RX~Rzvp;.t`lہ ҹb%*)Vd#|-)ĪӜka>aZ{?"2%c yö|"Hh飡Zw׊FS>e f 0wtDɨu[Kv7ec]IX~I%8`Z)84Q;tk: ,$K}ʽQrv1_ЭXLF"PX>WVEA Qt`[biΝe]D 笮sAvOg.J_WR>\$6ؽgڻ5xI(^nQ";:{䛿I7,`*z:eo?ϏMÚQq"_?6&+w]t%bm8mNt=+ ,c)]tF4Fj"i7@11,ԔO>elI)K:slçO֑eu73G@uhh3G* 1đ"}VED*3o$f p eu XokLNX^kC%0)_L(??uTN!ꅫB!]raROφgWRHGd>Y5zrq<o+wᬖ9+2PXIlMi9^$ b²b J*٠X4`1ܑ3UycE cOlF&̤D32"vÕ$"mlf.b"-yCS01BLmA"8rE7GH0+.8,1LRX"=׏z珡717쌑ȖL`[#E{ )vkԓ0CJH{ےZ&p8δ& ]z5ʏ|3fԢy ,Z/)/M쩧j4L 0g늛ّ?rnFH]xG} *~q7:4p#Y0ߛ D )EP| )rUlϧ%C,z؏8*V 'i5ì<{5d BMAlȃQ.smJְilp8 cآڸ;pdT1u$Q"쓻:jX%p?a;bF_MhV94ZXl8UWu34Wy(mhOH`]jA 9i{q'\|FT#l,SܲflFuZ?\hdt0kSˆl4nSIZNyzb 7%Jht⊦kߴH?QLۧ\6s3!k҃V/@Dى .$.⚱)E\@BSL=\zdc5SM #zq϶QܬtoH\t21NQ9*lDF#z!E=Tջ FM0KMɒic)/ D`Tm3 uJ}' SJlj@`p8F"}}yhh6%-I0!zC C)0vcbg2G?sͭbEN3!7ܯ5)xu-gx|q.l ir-Ǝ `׃(rv"Hnr&7$`3hf1*Cr%>ftQ`4b]YO1]ArZ:%9dZnr~_rQqj,lթnaq145r@r_5^5.-'U~'гq*k[˳&Z*Ts\Gd9Oq }_ġ뿩>z7?HSYPpaQ#^+YTwIr|YHcWHo\?ԟR 0u4W+y{x9+= \ FK ЅK Wb{iI-7(r[G{ٵ8ML+43G Y&֕+ ʔEJEèEԣז vԋx"TpYH9PuzZk)}fOЯrԘ1{T/"d4T{q~^etBn b#єp5{URv"ËG ]ec;Ę)fTrq >8 b(wEw 1|8?Gix/r]|YXV]Sc)#1Ck:}aCe}geFSLVA118 aimw$*^da:PcttǾ=HQ3 \hXGi^ޯ]kwYq^dżGM ۈ.eŒ`|%uo82o+-!Don [)tVF ˻}>)rHQ A#gVb qV,  lLos3<(DM(bY+* \-=+#V5{EKoDeY9 ?2h<"]>67o]<]2y$7C/XnzZ_ 54Šf^TՋNUH^vxN0b]P?^2 oeYg%b\'+PhI1ސ~ú1 #i5*aZRt\{Hgݍ^@Qf ꁢUJְWn 㢳nKښU+/5U?WFfn.0"e7hgGඃ_7^Yu:AMzpSï/"{*M"v!]&RR^C(*"zRi1E f7*쮈c+6VBa^o[Uqre E\dG+"$pd)Bp2R%r#iա-$1<|Q+2X${UlK| m$TR.{&Y//@RR1ݒ 4 Мpϫ JYtA-3爣FނY?'].y#H.X;<\n}r^P _FzP9Ւڢ,UMKKѵ򱤂TI*7t78oЏoܺ>ywۘ*$ah<2;N)e$Vֹf%"WO@Oz.,"y];uJU+ oΥCieI'L<읙wLF̄yaqox@Y>pH#)IL+^hOϏ7d?ėfӅO`'"QC ;ڳF5-A4r qG> d6/zZCx#SFK,eiY;wdAnzE<}^m~놛xkcoI [5&(L(}e1] I]3L=Ձɴ;M6E#Ajhg xUG⋦! u %eq"{yTCc\ ȮN Pk3,A"TY=5ΰ@xvz" 1T!ݾjr3dc:W=V#%Br:a}i0G,e)M~>YƢk^i/ҷlm]1BAt,Z2&n&G_.v8t螜 C!?t=tO #qZ; CnMYw}׏(.eJ'_#JOu.L*[p7]VE]e1\G3]QY4-uOd#SKo>Jc:i6tC\Zns`a*VdT;ڢHo@jK~P'EP1Ęq~4]CnŅ E=l\| {*u%Iמ/E/O15hԊx{q˫p-]4+U S!U\M;c4qb^F`{ Z{im3gX91`vi{ Χ:oc/`Kt{Gsg'T!]g˱3!N:+v:.N708vC2]^gv]0_ցPװ<htmBwlR q)qt !kNY<yW$UGأ43DypՑW~&8[=4ҟ[FWcg큉E/7yMa}v_Zn_F2A媚>P3 _'k~V慇j0BVSm+;c \|SVJ?0MS !cwM<~zmbGm"dze3(v2 ]4wfLQ (FԊ?ER8Y2bLtS>n=S#┤Lj QcQ ʓUy>ӽ!<jH"<^+/Ag@5 qQajs㢋5.حNpEqi7et32qwi4A9; zVStXET(JBE*NXpY]nqSɬvQå!@bfI/ǐфX,yx5riٌ? J2 T'R-"bvq}FAm;qoe35na]׆#/=~w|H`/MJ~"1iSV4C)s[Vw[W((ܫrUp:x|oPNB@TGr㞋l/O@ n`ߟ_+!ɡ"ͽ8]Jr*2jv|Ex pNB:CX:G5pp]D Ge4 f\sKnɀj^٨V|i[;2ui!T^_j0"{FIb !xg`xa^UhDAgw!o 1`{XL ?\R̀RJHTLm+ӭԙw tD?gdV'MHn7@i"EwEov-tWEw8ݺ2f*~;J S.&0'd z9sME!]p:o%Q:P4%υYv*Vh75^ybajaw3K;;g6FWƞ&\VIޕa+6 вSX~׉}(˾vUI2zYwRMӻXbgMT_ք=J*faL"v^4T&#@c$囸ElIr j{xʿ H}b|7H/DnO[*m\s?q/Fi2iKl%}yG5tp-)2$^DE+j%nCYxmxIې~%$Ս2VQ\re]\3qy:Vญp\R_X#OAS`‰ЗTW8Z I+Kyđ~F_;Q1]0i,Tt"k%noE 3&0_B*gV< $rQ$I*!K2n5#F(2L!zWyϋ<ؘe+-yw#7wՖw(P6;nB޴X ~cj,cR&! .cp,LC^o,K#ik"*=$"Ը*&v`MMgN^U R|jok_S-kE'!/lzs=&Z'h0_^?E;@osYYm}5|h " nC_\r4%OgYMLA;ZmL(z"ˉ@qBo_ bKQvW+~}p:`K6Sfze1aG*=Kp%cM߃czp*9AZM_0w 88ee e"2|X1Q fLXXX5+o3VyCH^`yfI@5sL]qaGAG<|NHbVyyNϹGIljFt+\qx9ՒVwd6d@K.c_gj}`Vi_9 Q}qEEx 6 vy63U[J7#@H4r}/38gƩLǢqrʀL =#k {a+qj"*/T@,z&j]ʰP툐؈ U L)z6gQ5z*p`jH Lw֯O<$Dc> V ZwԹ$3G%s>%`N1TC'ڃfD#)uNVVh `mآt;+l%;VD"ZZ4^բX-\jrjpeZిL*BV;6XG~H&KAdmv3ՇhIssCA3 :p,t`PЁmTЁ ]ٽ qT*( )ZAPl_!G蝿VPICA;昩S(>'>M:P\ J:< N h'evG3=ϙBcqaf_iBv)ۢ9K;;e#(9EP4CP'J-g.T]k0Gۛ#t-D!9·I@'!lO"myиsj-6DO$Č`u Q7siji@Z1K7Oε'iBiCӄ-jkӄL {"H"f &ʳeE=;8$i`' '=Kh3JYi_gj- N̑g ahd,UiKw;$iJYϖc.ri{;K0?_"oZ_PDjsqO_#'-tڠWxrD5" !C_Frxi ;-Rjjb/Ñ,n><"N8EL_xRZt@.B0!2S8 Hd|IuB '>A#ƻ"%ˆ҉e%PXpk1T~~"0V|95aʃ @IB#2$Wוdl[D5UXHPFA^BBD0IK@jcAb=+a)|k#P0@PrigfMyb^y (|˜B*к=tU{!W_]؄*_a!G &'jǣ 5eZ*]ӫ^l0-%KfWp̀YTkEm mQ@߮H'!DC!G.~&,H3D(eU1lwN;c ?:pۿ"|cw&/|-0p(;_x.uHc]rOÄ2{4ؙtMݸQaD{ y^ n rw.Q7F5{kvNO`Y^~FTQ'{tsE0$Ͳ8T9!o(%[poZ(A&w+'2 "}d2j L[|,&%p4W_ ]#!rnoYC# ׍#!jڌBd`q %[-.BJEL%DᷚYBZj,ysQDVn]1d3]|Cf,*C"rzgJ& B!wtu| 2-vuDC2-Sww)0H&g!?V_'V{f6-\4#nCA Md30&Oszͱl@kX7JfxDSGb{4L*O6\0!V8<u/SF`KϦE2Z7'DuMi'ڷu~ 81x#b^UZ |E<O3S23/[&L"tѥr/%X͒&zɢպ\}CfӪTˡ/>3!zdc:vBD6u%Hyt5Cpx|ZQ۩"ƥS|xfSV#c%k"JO䖣K]oD]҆V|t+$LHL "DHI<Ř YpPf(ddJ-$ϚOƑ.DoDř{BjYؗ4O먶7#>lXKwP'z܈H8X8hmyY?/HjMTb5U >a-kCV(!f+~֛Wӎ~GZRI J'; H 0.VjJH/ZIPo<;.ڋUGLͼm9z99 qh͞6!? "5I~3c7~v3-DY>Q븀:?#>S"`1 F'_AiEɐI0gԇM\d w&c1ٕEpdSb:"_O+EIrtD_%QDނ8S0;´0֝$ B`Qa>6P$B'g˥x:=ucd\PѺdPl43qP|2XH@+5c u 'өrȬL;/Z`aYSd-\/φY^w[_#w+_3DܪDcy9+1Lb>tr9 fxԋ!,i؆(J*(zh QGV ;ƐclU:p*Z?,A*KVd![&^|+;@%P&0E(,DG K3AymGlS|[cHGa^eL?NhtЃ&&<T) 6EBR ]$-`A ]Z;` ulqBu!Ӳw{_hUmaW)[QhD.dC4&G}\# *lդP6KpU@2BncQGrHXL uržR餼5.Ս.h-s=Mi!u`9ԻLn{_t= , \d-s9 la*4tzXF~k61Oۃn] ~ @yhWv},F푄QpfVW][~T?(Sƅ_ g5׀ŬgVg@~݊ጻOs5ʤUPk *kwjҠr8.!u7]52xk֓WjP-fK8E#Ytws[8Iq^ m"cw- s —6bY @=U+#A#|sݣu4;Y lIL75"L{B s.7GBĪkc!z9ൿC^3K>Ȏ}IߗȌ' ﱏx'; ɀ껳vc74-&ϖx0F-\x4elZiL3WٳID;^JF͠/8e0ĩU,WqYv?X/0|zavĖgq2|N7ZM.MMڵv>.-Zv=-/-\em ܋7h[-X4|hHSL7mfvozoǣixtm=ʇ=ٛZi&MffmyeǓ5%"o=͞ Wfo+ާ-JaD׶).-[F9VՅ6{<ȶ{<pi&g!{3m>+nluE_2P.ؗ^R%8v[S_;g11ODZh7CQ@u'3sD1SՙJzlpLY>yj.^ 9 X X"Aofe豩[QNC*_U}*5ok$W9) {sbS-\> m)펧4oIyw.˓?)v.<*-w!f]vN,( Vt2 - &U#OSdqp9ú#|-MW-dt.Vt -g$g-c \e0wud.xUr09An7Vkg B`)9)OZ>v臮/Awܤ>dP(^u"*T{_@ۑI}-DjgZpsg$4 6Y\{FvQI 4왯Kܕp,v( >f/ˏrQMn/wzQOg?ebyرqG[`hFOۮ~dHB~J56uqy7Q7Qh^ C¾GQonp=pL!/0;hSӡV x==+>υf2E+3?Q|x&*kHP3u.Bqӎ#Ζq Dۢ\pU J;7eM/SM,:ro[u̎Sʍ;G9o1&l; E%ߖp,f/R}'(ϣ5 _9J8=wv3i3qVǯkDte9dmGϟ3CFW_-z$c@=%%:Cȝ_BWh&.-GFlDU%ddCԢ ӂ?\UE}́pvu@ƇűI&S@Ik޹b;^ir~Es~+-NO'sW0 ٦Ji6"S6|e0 I_/,@ҴlYE88[]<2<./"gh?U_{o[?CFAZSN;DįoߑNC>Abe7עok`0([ΉM!b!$ MtIӃ.!FM؄W&/M&\lkSgؤbJ )Ofs!t91ZPXMnB՜pjpIMŦ']lrx&4]lI&]lw4\l.RD:k#Kt1II˹]6],ݟ..-UBuNmMKؤ7b[5yb?!Vγ"^efIgM8G'X|mMB*?V5? sn_) lؤwA zjBtGQͬ*&L6/6yxk lRax1-bsJ'Xac'^lN&QƋbx1U܁ x&7^lr7x1a^Ƌj\X_2_lM7_lŶA7[lԨ Gb-:@lX$ZREZbbkF}d؂;E.F<Ć\L,6CxLh$4t&]2M$8,zj!XK1%X 9b6D0$ r!-CF+J\fJP?bMsU N9b$Ulb4bmL dEZL1fyNl)6 90Rl.13")6 c: RR&hT5bS)6/u!Mf|:KH A֝8[JPP%gpCB ZnAb C$u(H_Y?d8B:v-(|Eжǖ@/)"! EPC#)%Z ^mf +IV, "0*ɪ1XmI~ʆۥf85!$bC&VLlbŤAQ@<RlrFHDMU )&mH~6#6-'"b2R,T%JbllX1֍Md-&S,Z)S,B:[8n[XO*ABgqUBV!(bPx%A"-ƈEf?ŗ|mTZx ; I :D3U,t՟T1Zr[*!% l AbBbL1[Lhg<*gO`d`EfE4%=/&-9&TlGPPU>^}t;BÄ}D҅*|>A"NΖb 7%S,RR탻7gR\+oS-+q'U,zD>5:gTH^IH`fbƊEYLUinwƊCޅ[pКs b7$YlT6WIbK bU:th'bnX2z (|B~&<?uImP --T># y}hak@n27Yli=bY>i&e-XuŖ\q7Yl`غYlBqž˔'Y!oؒ&E3&aur X趰gObR`C~~f 61/7_W,̓8bY$[Ʃz5"Mz5tNz5LwN,WŖI[dd@r,Cb%bWDmX$X|k jarPl li$8aQ6Wb1M 02D;gq6cŢRnƁɅk.(( ],h1]P1I*.95]l=M.TN z|"/C%v贯/;7#!Axm{|* DDŽKt6%BZ4GAa#8=\6W ċETet$ Y{dRD߻ crto"k7{0gBLN nآb"QՌūHjmcTH!`,e4EU"uu~Ƣ\ x+? .L&)㍞&KHEka J<T,&gXz|ƢH S7򒷃.c|Ȇ0Eb!DE8h= g"a ^$Й7D^.؈0&3)B7<+bÛg9V0, g.1dopLк:BXIU$ c [MʸlتjB,Hc!'  \W b,[)U_1c Un%Lü8}/룄Wŝ@ :>jX$L- n7#&4XQN0I4_ll&⋅.&XNa |Ij4c7[-$b-V8bidX?wD [U#"sL{Y+q ^p1vAb9B8bIb -l1z Jplt.&] ,1ݏ$[l6K/ ?sBb!7&p,R+p,XZM[-!sE?`*H'Mtl6.kŢ#QGk 3a n!wM}iy܈進0EA]Y(R8AcoͿ#b$ލ 8{t V(?cXܭfi Ό1goXúU7b,Cػ 'K{H< c~@w3A6&@=WuSƔ8AĜ9o]d,K&)c.:R\ؓ2Lo}9ִ~IHmLUMͿe3ds#$Nx5=cƶ41?MLpvJ̩߬1/Ps$k̥'ޘ6yc³LhQ^L7_#zX5`#zi+MQ[P)s51G ^Jlj?bE_qa>]uč)iG"Pmc쮬F,ږ0ϛ-*3EIs錭WIsSwcq0pkA.xGsnNەr=efMo;} >1-Y<86x"r 6-6B՞s'f-=xl;. 0Xc N;c,-5[.𭔹V۝Ackp̘xTƶN"VkPre*x3MNƖ`&m*,{!Ne.R[1C=C#rR,d~>c.=EWgFƿx1eFg'>posH 8Y7P>5Yb1šB>.X#Ucw9mF]Rqazh7fp + ic~[f86k=Έ0QB-N`E#ndc[E J6.B$CJԘi,$i,cv_j,SF)Ϝ!)[; ƨ,9Ʋ\HVD"r5 bWb@r=yVVXĚyvAE ~Q=0qT c|#6 #S&X&}W<_MZqoAԝΚǜws2@/$f<̙#p[RvB`;!bNL)Ќ߇G8,.q~0a;!N %;kP@vBV[QU5 99^sTOX|7l cȾ +a;N _<%1XT 'XNxݭ1oX.*gel9~aNVϜf钶s(D(h;(wPs{}`n[+i;0 A[U]hN]*dܥ ߢ%Mi"̔ .^+@d)cG+92MxL[E9I[VecAQ8Wp"jB11[T)=Q ~Sވo?# nZR\z)/"%^yL+&Z!z9 w4Q*#:zC{azFo£ii"9b+mIܔrڼ,b^9l^)ŹD\b)'y[WҰxyɆ'M^m3eCJ&/z+ La\2y[`>U&`0y!'M^l/EU!7ശB{YLr epgŋV0a>+’/bX\["lݍHbػ|81_L%`ljj-tbpV"=cɯǀ1d\/op8nmX }[b iIۢ c;\zkvz c::r6[+hv+)cC3{cHƘϒ1&1&/U،1,? [=2s~<8ȏNy 2*2mQ;9)7C,%e WA[̘3&1cr90csMpd$/̍;Yۘ(|`b-ct`v\jEX fltLqČ)cQ2O%e{(mã%,d,e!!˟}1;8"0psX]o2bI6g#wc.=D0E1_EnVkAFgcrvczÄdnyݪ[>lM x B&Z|4N-dCucqPlDE)DZ({lUKCfxE. 2iֽ8cPVc(c3 hxsxߟc=1J1\3cLNbi!א߀gt?!cI{$cr2srU0,G ~'D<@eE>Džsܪ$8owd||8 7\0[As'il4`;@5$ER5Kc q(aֹi-co`߳NT4ݔw7` y>pS[OTd&@1:hc;okĘ,$blpӏS1c,jҞbc'S Q-!w1vp+Zxc)حʞ8fbĘD9`#ƴ}uw-g2 Q;ō9+f,c1f,c1g숶eJF5&Q ͏XդÆAmIúHXneG1Fl,7,?O%ıg#KD5uQX}!-=d'':cccN^G>#c8_$3+[uQ-NL̐luS2~}YwNkT_3;7"`{1+%cyS9+]:ns=p? 1$`n\; cGE~Mj:C `d뻹$Sǰ%>rԓRż\/'t KS;莹EC2`gaqrX.W@BǼ`X:b,cMzy²+ E8w>[B9-K'k?k?q?r} endstream endobj 4 0 obj 290650 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 5 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 841.889771 595.275574 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 5 0 R ] /Count 1 >> endobj 6 0 obj << /Creator (cairo 1.10.0 (http://cairographics.org)) /Producer (cairo 1.10.0 (http://cairographics.org)) >> endobj 7 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 8 0000000000 65535 f 0000291053 00000 n 0000290767 00000 n 0000000015 00000 n 0000290742 00000 n 0000290839 00000 n 0000291118 00000 n 0000291245 00000 n trailer << /Size 8 /Root 7 0 R /Info 6 0 R >> startxref 291297 %%EOF mumudvb-1.7.1/doc/diagrams/TS_packet_repartition.svg000066400000000000000000002366451177353207000225760ustar00rootroot00000000000000 image/svg+xml TS Header Section - Beginning payload_unit_start_indicator=1 pointer_field=0 TS Header Complete Section payload_unit_start_indicator=1 pointer_field=0 section_length Stuffing TS Header Section Following payload_unit_start_indicator=0 section_length TS Header Section End payload_unit_start_indicator=0 Stuffing { N TIMES TS Header Section - Beginning payload_unit_start_indicator=1 pointer_field=0 section_length TS Header Section - Beginning payload_unit_start_indicator=1 pointer_field ..... TS Header Section Following payload_unit_start_indicator=0 section_length TS Header Section End payload_unit_start_indicator=1 { N TIMES TS Header Section - Following payload_unit_start_indicator=0 section_length Section - End pointer_field ..... SectionBeginning TS Header Section - Beginning payload_unit_start_indicator=1 pointer_field ..... TS Header Section Following payload_unit_start_indicator=0 section_length TS Header SectionEnd payload_unit_start_indicator=1 { N TIMES TS Header Section - Following payload_unit_start_indicator=0 section_length Section - End pointer_field ..... SectionBeginning section_length CompleteSection Different cases for reparting sectionsin TS packets TS Header Section - Beginning payload_unit_start_indicator=1 pointer_field ..... TS Header Section Following payload_unit_start_indicator=0 section_length TS Header SectionEnd payload_unit_start_indicator=1 { N TIMES TS Header Section - Following payload_unit_start_indicator=0 section_length Section - End pointer_field ..... SectionBeginning section_length CompleteSection section_length CompleteSection mumudvb-1.7.1/doc/html/000077500000000000000000000000001177353207000147155ustar00rootroot00000000000000mumudvb-1.7.1/doc/html/QUICKSTART.html000066400000000000000000000404571177353207000173070ustar00rootroot00000000000000 Quickstart guide for MuMuDVB

mumudvb-1.7.1/doc/html/README-fr.html000066400000000000000000002323471177353207000171600ustar00rootroot00000000000000 MuMuDVB - README
Note
Une version HTML de ce fichier est disponible sur le site web de MuMuDVB.
http://mumudvb.braice.net/mumudvb/logo_mumu_wiki.png

1. Présentation

1.1. Description

MuMuDVB (Multi Multicast DVB) est, à l’origine, une modification de dvbstream pour le cr@ns. Nous avons décidé de redistribuer le projet.

MuMuDVB est un projet indépendant.

MuMuDVB est un programme qui rediffuse des flux (chaînes de télévision) depuis une carte DVB (télévision numérique) sur un réseau en utilisant du multicast ou de l’unicast HTTP. Il peut diffuser un transpondeur (ensemble de chaînes regroupées sur une même fréquence) entier en assignant une ip multicast par chaîne.

2. Auteurs et contacts

Auteur principal
Contributeurs
  • Manuel Sabban (getopt)

  • Stéphane Glondu (man page, debian package)

  • Special thanks to Dave Chapman (dvbstream author and contributor)

  • Pierre Gronlier, Sébastien Raillard, Ludovic Boué, Romolo Manfredini

  • Utelisys Communications B.V. pour le transcodage

Note
Lorsque vous contactez à propos d’un problème, n’oubliez pas de joindre le fichier de configuration utilisé et la sortie de MuMuDVB en mode verbeux ( -vvv sur la ligne de commande ) ajoutez y toute information qui pourrait être utile. Merci.

3. Fonctionnalités

3.1. Fonctionalités principales

  • Diffuse les chaînes d’un transpondeur vers différents groupes (adresses IP) multicast.

  • MuMuDVB peux réécrire le PID PAT (table d’allocation des programmes) pour n’annoncer que les chaînes présentes (utile pour certaines set-top box). Voir la section réécriture du PAT.

  • MuMuDVB peux réécrire le PID SDT (table de description des programmes) pour n’annoncer que les chaînes présentes (utile pour certains clients). Voir la section réécriture du SDT.

  • Support des chaines cryptées (si vous n’avez pas de CAM vous pouvez utiliser sasc-ng mais vérifiez que c’est autorisé dans votre pays/par votre abonnement)

  • Configuration automatique, i.e. déouverte automatique des chaînes, référez-vous à la section Autoconfiguration.

  • Génération des annonces SAP, voir la section annonces SAP.

  • Support pour DVB-S2 (satellite), DVB-S (satellite), DVB-C (cable), DVB-T (terrestre) et ATSC (terrestre ou cable en amérique du nord)

  • Support pour l’unicast HTTP. voir la section unicast HTTP

  • Support pour les en-têtes RTP (seulement pour la diffusion en multicast)

  • Transcodage, référez vous à la section Transcodage

  • Acces au Menu cam pendant la diffustion (Utilisant une interface web/AJAX - voir WEBSERVICES.txt)

3.2. Liste détaillée des fonctionalités

  • Possibilité de montrer le niveau de réception pendant la diffusion

  • Montre si les chaines sont désembrouillées avec succès par le module CAM

  • Génère une liste des chaines "actives" et "inactives" en temps réel

  • Peut se transformer en démon et écrire sont identifiant de processus dans un fichier

  • Supporte les LNB standards et universels

  • Peux s’arréter automatiquement après un certain délai si aucune donnée n’est reçue.

  • Arrête d’essayer d’accorder la carte après un délai configurable

  • Les PIDs obligatoire sont transmis avec toutes les chaînes :

    • PAT (0): Program Association Table : Contient la liste des programmes et leurs PIDs PMT.

    • CAT (1): Conditionnal Access Table : Contient des informations concernant les chaînes brouillées.

    • NIT (16) : Network Information Table : Fournit des informations à propos du réseau physique.

    • SDT (17) : Service Description Table : Le pid SDT contient des données décrivant les différents services ex : nom des services, fournisseur du service, etc.

    • EIT (18) : Event Information Table : Le pid EIT contient des données concernant les programmes comme : le nom du programme, l’heure de début, la durée, une description etc …

    • TDT (20): Time and Date Table : Le pid TDT contient l’heure et la date. Cette information est dans un pid à part car sa mise à jour est fréquente.

  • Peux s’inscrire à tous les groupes multicast (IGMP membership request) pour éviter que certains switchs ne broadcastent les paquets. Se référer à la section problèmes avec certains switchs HP.

  • Supporte l’autoconfiguration, pour plus de détails voir la section Autoconfiguration

    • En mode d’autoconfiguration, MuMuDVB suit les changements dans les PIDs des chaînes et se met a jour automatiquement.

  • Scripts d’initialisation style Debian

  • La taille du tampon peux être réglée pour réduire l’utilisation processeur. Voir la section réduire l’utilisation processseur

  • Peux ne pas envoyer les paquets brouillés

  • Détecte automatiquement si une chaîne est brouillée

  • Peut réinitialiser le module CAM si l’initialisation échoue

  • Peut trier le PID EIT pour envoyer seulement ceux correspondant a la chaine courante

  • La lecture des données peux se faire via un thread, voir la section lecture par thread

  • Génération de listes de lecture, voir playlist

  • Possibilité d’utiliser des mots-clefs

4. Installation

4.1. À partir des sources

4.1.1. À partir d’un snapshot

Si vous avez téléchargé un snapshot, vous devez regénérer les fichiers d’auto(conf make etc …). Pour faire cela, vous avec besoin des autotools, automake, gettext et libtool et taper, dans le répertoire de MuMuDVB :

autoreconf -i -f

Ainsi vous aurez un source qui peux être installé comme un source "relase"

4.1.2. À partir d’une "release"

Pour installer MuMuDVB, tapez :

$ ./configure [options pour configure]
$ make
# make install

Les [options pour configure] spécifiques à MuMuDVB sont :

  --enable-cam-support    Support pour les modules CAM (actif par défaut)
  --enable-coverage       Compiler avec le support pour les tests de couverture du code (désactivé par défaut)
  --enable-duma           Librairie de debug DUMA (désactivé par défaut)

Vous pouvez obtenir la liste de toutes les options de configure en tapant

$ ./configure --help
Note
Le support pour les modules CAM dépends des librairies libdvben50221, libucsi ( des dvb-apps de linuxtv ). Le script configure détectera la présence de ces librairies et désactivera le support pour les modules CAM si l’une d’elle est absente.
Note
Le décodage des noms de chaîne longs pour l’autocoonfiguration en ATSC dépends de la librairie libucsi ( des dvb-apps de linuxtv ). Le script configure détectera la présence de cette librairies et désactivera le support pour les noms longs si elle est absente. L’autoconfiguration complète fonctionnera toujours avec l’ATSC mais les noms de chaîne seront des noms courts ( 7 caractères maximum ).
Note
Si vous voulez compiler la documentation i.e. générer des fichiers HTML avec asciidoc, tapez make doc. Le rendu des table fonctionnera avec asciidoc 8.4.4 ( il peux fonctionner avec des versions plus faibles mais il n’a pas été testé ).

Pour installer les scripts d’initialisation ( style debian ) tapez :

# cp scripts/debian/etc/default/mumudvb /etc/default/mumudvb
# cp scripts/debian/etc/init.d/mumudvb /etc/init.d/mumudvb
Note
Il est conseillé de créer un utilisateur système pour MuMuDVB, par exemple : _mumudvb. Vous devez ajouter cet utilisateur au groupe vidéo et rendre le répertoire /var/run/mumudvb en lecture-écriture pour cet utilisateur. En faisant cela, vous pourrez profiter de toutes les fonctionnalités de MuMuDVB.

4.2. À partir du paquet Debian

Si vous voulez installer une version qui n’est pas dans vos dépôts, vous pouvez le faire à la main en tapant :

# dpkg -i mumudvb*.deb

Sinon vous pouvez utiliser aptitude ou synaptic.

5. Utilisation

La documentation concernant la syntaxe du fichier de configuration est dans le fichier doc/README_CONF-fr.txt ( Version HTML ).

Utilisation:

mumudvb [options] -c fichier_de_configuration
mumudvb [options] --config fichier_de_configuration

Les différentes options sont :

-d, --debug
        Ne se met pas en tâche de fond et affiche les messages sur la sortie standard.

-s, --signal
        Affiche la force du signal toutes les 5 secondes

-t, --traffic
        Affiche toutes les 10 secondes la bande passante prise par chaque chaîne

-l, --list-cards
        Liste les cartes DVB et quitte

--card
        La carte DVB a utiliser ( le fichier de configuration est prioritaire en cas de conflit )

--server_id
        Le server id ( pour l'autoconfiguration, le fichier de configuration est prioritaire en cas de conflit )

-h, --help
        Montre l'aide ( en Anglais )

-v
        Plus verbeux ( ajouter plusieurs v pour plus de verbosité )

-q
        Plus silencieux ( ajouter pour rendre encore plus silencieux )

--dumpfile
        Option de debug : Sauvegarde le flux reçu dans le fichier spécifié

Signal: ( voir kill(1) )

    SIGUSR1: bascule l'affichage de la force du signal
    SIGUSR2: bascule l'affichage du traffic
    SIGHUP: force l'écriture des fichiers de log

6. Autoconfiguration

MuMuDVB est capable de trouver les différentes chaînes dans le transpondeur et leur PIDs ( Program IDentifiers ).

Sans l’autoconfiguration, vous devez spécifier les paramètres du transpondeur et, pour chaque chaîne, l’ip de multicast, le nom et les PIDs ( PMT, audio, vidéo, télétexte etc… ).

À la fin de l’autoconfiguration MuMuDVB génère un fichier de configuration avec les paramètres obtenus. Le fichier généré est, par défaut : /var/run/mumudvb/mumudvb_generated_conf_card%d_tuner%d

Si les PIDs sont changés, MuMuDVB mettra automatiquement à jour les chaînes sauf si vous mettez autoconf_pid_update=0 dans votre fichier de configuration.

MuMuDVB est capable de s’autoconfigurer de deux manières différentes :

6.1. Autoconfiguration "complète"

C’est la manière la plus simple pour utiliser MuMuDVB.

Utilisez ce mode lorsque vous voulez diffuser un transpondeur entier ou une partie d’un transpondeur (en utilisant autoconf_sid_list).

Note
Vous ne devez pas spécifier de chaînes en utilisant ce mode.

Dans ce mode, MuMuDVB trouvera pour vous les différentes chaînes, leurs noms et leurs PIDs (PMT, PCR, Audio, Vidéo, Sous-titres, Télétexte et AC3).

Pour utiliser ce mode, vous devez : - Définir les paramètres d’accord dans votre fichier de configuration - Ajouter autoconfiguration=full à votre fichier de configuration - Vous n’avez a spécifier aucune chaîne - Pour une première utilisation, n’oubliez pas d’ajouter la paramètre -d lorsque vous lancez MuMuDVB : ex mumudvb -d -c your_config_file

Example Fichier de configuration pour une réception satellite à une fréquence de 11.296GHz et une polarisation horizontale
freq=11296
pol=h
srate=27500
autoconfiguration=full

Les chaînes seront diffusées sur les adresses ip de multicast 239.100.c.n où c est le numéro de carte ( 0 par défaut ) et n est le numéro de chaîne.

Si vous n’utilisez pas l’option common_port, MuMuDVB utilisera le port 1234.

Note
Par défaut, les annnonces SAP sont activées si vous utilisez ce mode d’autoconfiguration. Pour les désactiver, ajoutez sap=0 dans votre fichier de configuration. Par défaut, la réécriture du PID SDT est activée si vous utilisez ce mode d’autoconfiguration. Pour la désactiver, ajoutez rewrite_sdt=0 dans votre fichier de configuration. Par défaut, la réécriture du PID PAT est activée si vous utilisez ce mode d’autoconfiguration. Pour la désactiver, ajoutez rewrite_pat=0 dans votre fichier de configuration. Par défaut, le tri du PID EITT est activée si vous utilisez ce mode d’autoconfiguration. Pour le désactiver, ajoutez sort_eit=0 dans votre fichier de configuration.
Note
Un fichier de configuration d’exemple, documenté (en anglais) est disponible : doc/configuration_examples/autoconf_full.conf

6.1.1. Modèles de nom et autoconfiguration

Par défaut le nom de la chaîne sera le nom du service définit par le diffuseur. Si vous voulez plus de flexibilité vous pouvez utiliser un modèle.

Par exemple, si vous utilisez autoconf_name_template=%number-%name Les noms de chaîne auront la forme suivante :

  • 1-CNN

  • 2-Euronews

Il y a différents mot-clef disponibles

Mot clef Description

%name

Le nom donné par le diffuseur

%number

Le numéro de chaîne de MuMuDVB

%lang

La langue par défaut/principale de la chaîne

%card

Le numéro de carte DVB

%tuner

Le numéro de tuner

%server

Le numéro de serveur, spécifié en ligne de commande ou via l’option server_id

%lcn

Le "logical channel number" ( numéro de chaîne attribué par le diffuseur ). Votre diffuseur doit diffuser le LCN. Le LCN sera "affiché" avec trois chiffre incluant des 0. Ex "002". Si le LCN n’est pas détecté, %lcn sera remplacé par une chaîne de caractères vide

%2lcn

Idem que précédemment mais avec un format à deux chiffres.

Reférez vous au README_CONF pour savoir quelles options acceptent quels mot clefs

D’autres mot clefs peuvent être facilement ajoutés si nécessaire.

6.2. Autoconfiguration "simple"

Note
Ce mode d’autoconfiguration disparaîtra bientôt. Si vous en avez absolument besoin pour autre chose que spécifier le nom ou l’IP merci de me contacter.

Utilisez ce mode lorsque vous voulez contrôler le nom des chaînes, leurs IP d’une manière plus approfondie qu’avec les templates.

  • Vous devez ajouter autoconfiguration=partial dans le début de votre fichier de configuration.

  • Pour chaque chaîne, vous devez préciser :

    • L’adresse IP ( si vous n’utilisez pas l’unicast )

    • Le nom

    • Le PID PMT

MuMuDVB trouvera les PIDs audio, vidéo, PCR, télétexte, sous-titres et AC3 avant de diffuser.

Note
Si vous mettez plus d’un PID pour une chaîne, MuMuDVB désactivera l’autoconfiguration pour cette chaîne.
Note
Un fichier de configuration détaillé et documenté (en anglais) se trouve à l’emplacement : doc/configuration_examples/autoconf_partial.conf
Note
L’autoconfiguration simple peut ne pas réussir à trouver les bon PIDs si le PID PMT est partagé entre plusieurs chaînes. Dans ce cas, vous devez spécifier le numéro de programme ( service identifier ou stream identifier ) via l’option service_id.

7. Annonces SAP

Les annonces SAP (Session Announcement Protocol) ont été conçues pour que le client obtienne automatiquement la liste des chaînes diffusées et leurs adresses. Ceci permet d'éviter d’avoir a donner la liste des adresses ip de multicast a chaque client.

VLC et la plupart des set-top boxes supportent les annonces SAP.

MuMuDVB générera et enverra les annonces SAP si cela est demandé via le fichier de configuration ou en mode d’autoconfiguration complète.

Les annonces SAP seront envoyées uniquement pour les chaînes actives. Quand une chaîne devient inactive, MuMuDVB arrête automatiquement d’envoyer les annonces pour cette chaîne jusqu'à ce qu’elle redevienne active.

7.1. Demander à MuMuDVB de générer les annonces SAP

Pour envoyer les annonces SAP, vous devez ajouter sap=1 à votre fichier de configuration. Les autres paramètres concernant les annonces SAP sont documentés dans le fichier doc/README_CONF-fr ( Version HTML ).

7.1.1. Annonces SAP et autoconfiguration complète

Si vous utilisez l’autoconfiguration complète, vous pouvez utiliser le mot-clef %type dans l’option sap_default_group. Ce mot clef sera remplacé par le type de la chaîne : Television ou Radio.

Example

Si vous mettez sap_default_group=%type, vous obtiendrez deux groupes SAP : Television et Radio, chacun contenant les services coresspondants.

7.2. Configurer le client pour recevoir les annonces SAP

7.2.1. VLC > 0.8.2

Vous devez aller dans paramètres, puis paramètres avancés. Les annonces SAP peuvent êtres activés dans liste de lecture → découverte de services.

N’oubliez pas de sauvegarder les paramètres.

Vous devriez avoir désormais une section SAP dans votre liste de lecture.

7.2.2. VLC < 0.8.2

Allez dans le menu paramètres puis ajouter une interface et choisissez liste de lecture SAP, Désormais, lorsque vous ouvrez la liste de lecture, les annonces SAP devraient apparaître automatiquement.

8. Unicast HTTP

En plus du multicast, MuMuDVB supporte aussi l’unicast HTTP. Cela vous permet d’utiliser MuMuDVB à travers des réseau qui ne supportent pas le multicast.

Il y a une connexion en écoute, la chaîne est sélectionnée par le chemin HTTP, voir plus loin.

Note
Rappelez vous que l’unicast peut consommer beaucoup de bande passante. Pensez à limiter le nombre de clients.
Note
Si vous ne voulez pas que le flux multicast (toujours présent) aille sur votre réseau, utilisez l’option multicast=0

8.1. Activer l’unicast HTTP

Pour activer l’unicast HTTP vous devez définir l’option unicast. Par défaut, MuMuDVB écoute sur toutes vos interfaces.

Vous pouvez aussi définir le port d'écoute en utilisant l’option port_http. Si le port n’est pas défini, MuMuDVB utilisera le port par défaut : 4242.

8.2. Activer l’unicast par chaîne

Vous pouvez créer des connections en écoute seulement pour une chaîne. Dans ce cas, quand un client se connecte dessus, il obtiendra toujours la même chaîne indépendamment du chemin HTTP.

8.2.1. Vous utilisez l’autoconfiguration complète

Vous devez définir l’option autoconf_unicast_start_port qui précise quel sera le port d'écoute pour la première chaîne découverte ( le port sera incrémenté pour chaque chaîne ).

8.2.2. Vous n’utilisez pas l’autoconfiguration complète

Pour les chaînes pour lesquelles avoir une connexion en écoute, vous devez définir l’option unicast_port qui permet de spécifier le port d'écoute.

8.3. Coté client, les différentes méthodes pour obtenir les chaînes

8.3.1. Utilisation d’une playlist

MuMuDVB génère des playlist au format m3u.

Si votre serveur écoute sur l’ip 10.0.0.1 et le port 4242,

vlc http://10.0.0.1:4242/playlist.m3u
Note
Dans la playlist, les chaînes seront annoncées avec des URL du type /bysid/ ( voir plus bas ), si vous voulez des URLs de chaîne par port utilisez l’URL /playlist_port.m3u.
Note
Des playlists pour la lecture multicast sont aussi générées, elles sont accessibles aux addresses suivantes : "playlist_multicast.m3u" et "playlist_multicast_vlc.m3u"

8.3.2. Cas d’une connexion pour une chaîne

Si le client se connecte au serveur sur un port qui est pour une seule chaîne, il obtiendra cette chaîne indépendamment du chemin demandé

Si votre serveur écoute sur l’ip 10.0.0.1 et le port pour la chaîne est 5000,

vlc http://10.0.0.1:5000/

8.3.3. Obtenir les chaînes par numéro

Vous pouvez obtenir les chaînes en utilisant leur numéro ( la première chaine est numéroté 1 ).

Si votre serveur écoute sur l’ip 10.0.0.1 et le port 4242,

vlc http://10.0.0.1:4242/bynumber/3

vous donnera la chaîne numéro 3. Ceci marche aussi avec xine et mplayer.

8.3.4. Obtenir les chaînes par leur service id

Vous pouvez obtenir les chaînes en utilisant leur service id.

Si votre serveur écoute sur l’ip 10.0.0.1 et le port 4242,

vlc http://10.0.0.1:4242/bysid/100

vous donnera la chaîne numéro avec le service id 100 (ou une erreur 404 si il n’y a pas de chaine avec ce service id). Ceci marche aussi avec xine et mplayer.

8.3.5. Obtenir les chaînes par leur nom

Note
Cette fonctionnalité n’est pas implémentée pour le moment. Elle sera implémentée dans une prochaine version.

8.3.6. Obtenir la liste des chaînes

Si votre serveur écoute sur l’ip 10.0.0.1 et le port 4242,

Pour obtenir la liste des chaînes ( format HTML "basique" ) entrez l’adresse http://10.0.0.1:4242/channels_list.html dans votre navigateur.

Pour obtenir la liste des chaînes ( format JSON ) entrez l’adresse http://10.0.0.1:4242/channels_list.json dans votre navigateur.

8.4. Unicast HTTP et surveillance de MuMuDVB

Cette connexion HTTP peut être utilisée pour surveiller MuMuDVB.

Des informations de surveillance sont disponibles au format JSON ( http://fr.wikipedia.org/wiki/JSON ) via les URLs suivantes : /monitor/signal_power.json et /monitor/channels_traffic.json

Il est assez aisé d’ajouter de nouvelles informations si nécessaire.

9. Surveillance de MuMuDVB

Vous pouvez utiliser Monit pour surveiller MuMuDVB et le redémarrer lorsqu’il a des problèmes (MuMuDVB se suicide lorsque de gros problèmes apparaissent).

Vous devez installer les scripts de démarrage ( fait automatiquement si vous utilisez le paquet Debian ) et ajouter les lignes suivantes à votre fichier /etc/monit/services :

check process mumudvb with pidfile /var/run/mumudvb/mumudvb_adapter0_tuner0.pid
    start program = "/etc/init.d/mumudvb start"
    stop program = "/etc/init.d/mumudvb stop"
Note
Le 0 doit être remplacé par le numéro de votre carte si vous avez plusieurs cartes.

Pour plus d’informations référez vous au site web de Monit.

MuMuDVB tourne habituellement pendant des jours sans le moindre problème, mais avec monit vous êtes sur. Monit est aussi capable d’envoyer des e-mails en cas de problèmes.

10. Support pour les chaînes brouillées

Note importante : vérifiez si le contrat avec votre fournisseur de services vous autorise à diffuser les chaînes brouillées.

10.1. Débrouillage matériel

MuMuDVB supporte les chaînes brouillées à l’aide d’un décodeur matériel ( un module CAM : Conditionnal Access Module ). MuMuDVB peut demander au module de débrouiller plusieurs chaînes si le module le supporte ( les CAMs Aston Pro ou PowerCam Pro sont capable de débrouiller plusieurs chaînes simultanément).

Si vous êtes limités par le nombre de PIDs que le module CAM peut débrouiller simultanément, il est possible de demander au module de débrouiller seulement les PIDs audio et vidéo. Cette fonctionnalité n’est pas implémentée, merci de contacter si vous en avez besoin.

Note
Le débrouillage matériel n’utilise quasiment aucune puissance processeur, tout le débrouillage est effectué par le module CAM.
Note
MuMuDVB ne demande pas au module CAM si le débrouillage est possible. Cette fonctionnalité des modules CAM n’est pas fiable. La plupart des modules CAM répondront par un menu si le débrouillage n’est pas possible et MuMuDVB l’affichera sur la sortie standard d’erreur.

Les informations concernant le module CAM sont stockées dans le fichier '/var/run/mumudvb/caminfo_adapter%d_tuner%d''' où %d est le numéro de carte DVB.

Example
CAM_Application_Type=01
CAM_Application_Manufacturer=02ca
CAM_Manufacturer_Code=3000
CAM_Menu_String=PowerCam_HD V2.0
ID_CA_Supported=0100
ID_CA_Supported=0500
Note
En cas de problème avec certaines CAM, il se peux que vous aillez à appliquer un correctif à la libdvben50221 : Lien vers le patch

10.1.1. Comment demander le débrouillage ?

Vous utilisez le mode d’autoconfiguration complet :

Il vous suffit d’ajouter cam_support=1 à votre fichier de configuration.

Vous utilisez l’autoconfiguration partielle ou pas d’autoconfiguration
  • Ajoutez cam_support=1 à votre fichier de configuration ( avant la définition des chaînes )

  • Pour chaque chaîne brouillée, ajoutez l’option cam_pmt_pid. Cette option permet à MuMuDVB de savoir quel PID est le PID PMT. Ce PID sera utilisé pour demander le débrouillage.

Note
Vous avez un exemple de fichier de configuration avec le support pour les chaînes brouillées dans doc/configuration_examples/autoconf_partial.conf

10.2. Débrouillage logiciel

Note importante : Cette solution n’est pas autorisée par certains contrats de fournisseurs de services.

MuMuDVB a été testé avec succès avec des solutions de débrouillage logiciel comme sascng + newcs + dvbloopback.

Dans ce cas, vous n’avez pas besoin de définir l’option cam_support. Vous devez juste ajuste l’option card pour être en accord avec votre carte virtuelle dvbloopback.

Si vous utilisez ces solutions référez vous à la section réduire l’utilisation CPU de MuMuDVB.

10.2.1. Some information on how to configure SASC-NG

The following informations have been given by MuMuDVB users on the MuMuDVB-dev mailing list

When the channels are not sucessfully descrambled (channel down in MuMuDVB) the following options are reported to improve the situation

--sid-nocache --buffer 8M --sid-filt=200 -D

You can try also the option --sid-allpid It seems to happend with transponders with a lot of channels (TV or RADIO channels).

10.3. État du débrouillage

L'état du débrouillage est stocké avec la liste des chaînes diffusées.

Example
239.100.0.7:1234:ESCALES:PartiallyUnscrambled
239.100.0.8:1234:Fit/Toute l'Histoire:PartiallyUnscrambled
239.100.0.9:1234:NT1:PartiallyUnscrambled
239.100.0.10:1234:ACTION:PartiallyUnscrambled
239.100.0.11:1234:MANGAS:PartiallyUnscrambled
239.100.0.12:1234:ENCYCLOPEDIA:PartiallyUnscrambled
239.100.0.13:1234:XXL PL:PartiallyUnscrambled
239.100.0.14:1234:France 5:HighlyScrambled
239.100.0.16:1234:LCP:FullyUnscrambled
239.100.0.17:1234:VIDEOCLICK:FullyUnscrambled
  • FullyUnscrambled : Moins de 5% de paquets brouillés

  • PartiallyUnscrambled : entre 5% et 95% de paquets brouillés

  • HighlyScrambled : plus de 95% de paquets brouillés

11. Réécriture du PID PAT (Program Allocation Table)

Cette fonctionnalité est principalement destinée pour les set-top boxes. Cette option permet d’annoncer uniquement la chaîne diffusée dans le PID PAT (Program Allocation Table) au lieu de toutes les chaînes du transpondeur. Les clients sur ordinateur regardent cette table et décode le premier programme avec des PIDs audio/vidéo. Les set-top boxes décodent habituellement le premier programme de cette table ce qui résulte en un écran noir pour la plupart des chaînes.

Pour activer la réécriture du PAT, ajoutez rewrite_pat=1 à votre fichier de configuration. Cette fonctionnalité utilise peu de puissance processeur, la table PAT étant réécrite une fois par chaîne et stockée en mémoire.

Note
La réécriture du PAT peu échouer (i.e. ne résout pas les symptômes précédents) pour certaines chaînes si le PID PMT est partagé par plusieurs chaînes. Dans ce cas, vous devez ajouter l’option service_id pour spécifier le "service id" ou numéro de programme.

12. Réécriture du PID SDT (Service Description Table)

Cette option permet d’annoncer uniquement la chaîne diffusée dans le PID SDT (Service Description Table) au lieu de toutes les chaînes du transpondeur. Certains clients regardent cette table et peuvent ainsi montrer/sélectionner des programmes fantomes si cette table n’est pas réécrite (même si le PAT est réécrit). Ceci peut se manifester par un écran noir de manière aléatoire.

Pour activer la réécriture du SDT, ajoutez rewrite_sdt=1 à votre fichier de configuration. Cette fonctionnalité utilise peu de puissance processeur, la table SDT étant réécrite une fois par chaîne et stockée en mémoire.

Note
Si vous n’utilisez pas l’autoconfiguration complète, la réécriture du SDT nécessite l’option service_id pour spécifier le "service id" ou numéro de programme.

13. Tri du PID EIT (Event Information Table)

Cette option permet de ne diffuser que les packets EIT (Event Information Table) correspondant à la chaîne diffusée au lieu de toutes les chaînes du transpondeur. Certains clients regardent cette table et peuvent ainsi montrer/sélectionner des programmes fantomes si cette table n’est pas réécrite (même si le PAT et le SDT sont réécrits).

Pour activer le tri du PID EIT, ajoutez sort_eit=1 à votre fichier de configuration.

Note
Si vous n’utilisez pas l’autoconfiguration complète, le tri du PID EIT nécessite l’option service_id pour spécifier le "service id" ou numéro de programme.

14. Réduire l’utilisation processeur

Normalement MuMuDVB lit les paquets de la carte un par un et demande à la carte après chaque lecture si il y a un nouveau paquet disponible ( poll ). Mais souvent les cartes on un tampon interne ( la carte a plusieurs paquets de disponible d’un coup ) ce qui rends certains "polls" inutiles. Ces "polls" consomme du temps processeur.

Pour réduire l’utilisation CPU, une solution est d’essayer de lire plusieurs paquets à la fois. Pour faire cela, utilisez l’option dvr_buffer_size.

Example
dvr_buffer_size=40

Pour voir si la valeur que vous avez choisie est trop grande ou trop basse, exécutez MuMuDVB en mode verbeux, le nombre moyen de paquets reçus en même temps sera affiché toutes les deux minutes. Si ce nombre est plus faible que votre taille de tampon il est inutile de l’augmenter.

La réduction de l’utilisation processeur peut être entre 20 et 50%.

15. Lecture des données via un thread

Pour rendre MuMuDVB plus robuste ( au prix d’un légère augmentation de l’utiliation CPU ), MuMuDVB peux lire les données en provenance de la carte via un thread, ce qui rends la lecture "indépendante" du reste du programme.

Pour activer cette fonctionalitée, utilisez l’option dvr_thread.

Cette lecture utilise deux tampons : un pour les données reçues par la carte, un pour les données actuellement traitées par le programme principal. Vous pouvez ajuster la taille de ces tampons en utilisant l’option dvr_thread_buffer_size. La valeur par défaut ( 5000 packets de 188 octets ) devrait suffire pour la plupart des cas.

Le message "Thread trowing dvb packets" vous informe que le thread recoit plus de paquets que la taille du tampon et est obligé d’en "jeter". Augmenter la taille du tampon résoudra probablement le problème.

16. Transcoding

MuMuDVB peux transcoder le flux dans différents formats pour économiser de la bande passante. Le transcodage est effectué en utilisant les librairies du projet ffmpeg. Cette fonctionnalité est assez nouvelle, n’hesitez pas à envoyer vos remarques/suggestions.

Pour activer le transcodage vous devez compiler MuMuDVB vous même. À cause de changement dans l’API des librairies ffmpeg, le transcoding ne marche pas avec des versions trop récentes de ffmpeg.

Note
Le transcodage ne fonctionne pas pour le moment avec l’unicast.

16.1. Compiler MuMuDVB avec le support pour le transcodage

Pour compiler MuMuDVB avec le support pour le transcodage, vous aurez besoin des librairies suivantes : libavcodec, libavformat et libswscale

Vous devez aussi ajouter l’option --enable-transcoding à votre configure. Ex: ./configure --enable-transcoding

Vérifiez à la fin du configure que le transcoding est effectivement activé. Si ce n’est pas le cas, une librairie est probablement manquante.

16.2. Utiliser le transcodage

Merci de lire la documentation concernant les options de transcodage et les exemples.

16.3. Futurs développements concernant le transcodage

Faire fonctionner le transcodage avec l’unicast, en particulier une fois le support RTSP achevé.

16.4. Problèmes courants

16.4.1. Broken ffmpeg default settings detected

Si vous obtenez un messaage disant : "Broken ffmpeg default settings detected"

Ajouter les options suivante a votre configuration de transcodage lui permettra de fonctionner :

transcode_me_range=16
transcode_qdiff=4
transcode_qmin=10
transcode_qmax=51

16.4.2. Codec not found

Si le module de transodage ne trouve pas le codec que vous voulez, vous devez probablement installer des codecs supplementaires (libavcodec-extra-52 pour debian).

Lancez MuMuDVB en mode verbeux vous donnera la liste des codecs disponible.

16.4.3. Le flux non transcodé est envoyé

Pour eviter aux flux original d'être envoyé, vous pouvez utiliser l’option transcode_send_transcoded_only.

17. IPv6

MuMuDVB supporte le multicast IPv6. Il n’est pas activé par défaut. Vous devez l’activer avec l’option multicast_ipv6.

Pour "apprécier" le multicast IPv6 vous devez utiliser des switch supportant le protocole Multicast Listener Discovery.

IPv6 utilise intensivement le concept de [http://en.wikipedia.org/wiki/Multicast_address]scope. Par défaut, MuMuDVB utilise le scope "site-local" (càd des addresses multicast commencant par FF05) les annonces SAP sont aussi envoyées avec ce scope. Si vous avez besoin de plus de flexibilité de ce coté merci de contacter.

Pour plus de détails consultez la page sur l’IPv6 sur le site de MuMuDVB.

18. Détails techniques (en vrac)

  • Consommation processeur : MuMuDVB utilise 15% du temps processeur d’un Celeron 2.6GHz avec une carte satellite Hauppauge et un noyau 2.6.9 lorsqu’un transpondeur entier est diffusé ( environs 30Mbit/s)

  • Essayez d'éviter les vieux chipset via ou nForce et, de manière générale les cartes mères à très bas coût. Ils ne supportent pas d’avoir un important flux de données sur le bus PCI.

  • Lorsque le programme démarre, il écrit la liste des chaînes dans le fichier /var/run/mumudvb/channels_streamed_adapter%d_tuner%d ( où %d sont le numéro de carte et le numéro de tuner ). Ce fichier contient la liste des chaînes diffusées ( mise à jour toutes les 5 secondes ) sous la forme : "nom:ip:port:EtatDuBrouillage"

  • MuMuDVB peut supporter autant de cartes que le système d’exploitation. Les anciennes version de udev+glibc ne supportaient pas plus de 4 cartes mais ce problème est résolu en utilisant des versions relativement récentes ( udev > 104 et libc6 > 2.7 )

  • Lorsque MuMuDVB tourne en démon, il écrit son identifiant de processus dans le fichier /var/run/mumudvb/mumudvb_adapter%d_tuner%d.pid, où %d est remplacé par le numéro de carte et de tuner.

  • MuMuDVB supporte la réception satellite en bande Ku avec des LNB universel ou standard. Le support pour la réception satellite en bande S ou C est implémenté via l’utilisation de l’option lo_frequency. Référez vous au fichier doc/README_CONF-fr ( Version HTML ) pour plus de détails.

19. MuMuDVB Logs

MuMuDVB peux envoyer ses logs sur la console, dans un fichier ou via syslog. Il peux aussi les envoyer dans plusieurs de ces canaux. Le formattage des messages peut aussi etre ajusté.

Par défaut, les logs sont envoyé sur la console si MuMuDVB ne tourne pas en démon et via syslog sinon.

Si les logs sont envoyés dans un fichier, vous pouvez forcer l'écriture (flush) en envoyant le signal SIGHUP au processus MuMuDVB.

Pour plus d’informations référez vous au fichier doc/README_CONF-fr ( Version HTML ).

20. Problèmes connus

20.1. VLC n’arrive pas à lire le flux mais cela marche avec xine ou mplayer

  • Pour VLC vous devez spécifier le PID PMT en plus des PIDs audio et vidéo. C’est un problème fréquent. Pour le résoudre, vous pouvez utilisez le mode verbeux de VLC ( vlc -v ) et vous obtiendrez une ligne comme : [00000269] ts demuxer debug: * number=1025 pid=110. Vous obtiendrez le PID PMT associé à votre numéro de programme. Vous pouvez aussi utiliser dvbsnoop, ou vous référer à la section "comment obtenir les PIDs" du fichier doc/README_CONF-fr ( Version HTML ). Une autre solution est d’utiliser l’autoconfiguration complète.

20.2. VLC arrive a lire la vidéo mais pas le son

  • Ce problème peut arriver lorsque le PID PCR ( i.e. l’horloge ) n’est pas le PID vidéo. Dans ce cas, vous devez vérifier si le PID PCR est bien dans votre liste de PIDs.

20.3. MuMuDVB ne marche pas en mode démon

  • Pour passer en mode démon, MuMuDVB a besoin que le répertoire /var/run/mumudvb/ soit autorisé en écriture pour pouvoir écrire son identifiant de processus et la liste des chaînes.

20.4. Le système plante ou gèle

  • Les vieux chipset VIA ou nForce sont des chipset grand public. Ils ne peuvent pas traiter une quantité importante de données sur le bus PCI. Mais vous pouvez tenter d’ajuster les paramètres de votre BIOS.

20.5. Problèmes d’accord en DVB-T

  • Vous devez vérifier les paramètres d’accord, sachant que la détection automatique de la bande passante ne marche pas généralement.

20.6. Ma set top box affiche un écran noir

  • Si le flux fonctionne bien lorsqu’il est lu via un ordinateur et pas sur votre set-top box, c’est probablement que votre set-top box a besoin que le PID PAT soit réécrit. MuMuDVB peut réécrire le PID PAT, pour cela ajoutez rewrite_pat=1 à votre fichier de configuration.

20.7. L’autoconfiguration partielle ne trouve pas les bon PIDs

  • Ceci peut arriver lorsqu’un PID PMT est partagé entre plusieurs chaînes. Référez vous à la section autoconfiguration partielle pour plus de détails.

20.8. Le module CAM refuse de décrypter des chaînes "locked"

  • Certains modules CAM viaccess peuvent avoir un verrou pour les chaînes "adultes". Pour enlever ce verrou, allez dans le menu du module CAM, en utilisant, par exemple, "gnutv -cammenu" (des dvb-apps de linuxtv).

Vous devez mettre le "maturity rating" au maximum et déverrouiller "Maturity rating" dans le sous-menu "Bolts".

20.9. VLC ne choisit pas le bon programme même avec la réécriture du PAT

Vous devez aussi réécrire le PID SDT en utilisant l’option rewrite_sdt

20.10. À L’AIDE ! mon traffic multicast inonde le réseau (J’utilise un commutateur HP procurve)

La meilleure explication est fournie dans le guide de routage du multicast de HP.

On switches that do not support Data-Driven IGMP, unregistered multicast groups are flooded to the VLAN rather than pruned. In this scenario, Fast-Leave IGMP can actually increase the problem of multicast flooding by removing the IGMP group filter before the Querier has recognized the IGMP leave. The Querier will continue to transmit the multicast group during this short time, and because the group is no longer registered the switch will then flood the multicast group to all ports.

On ProCurve switches that do support Data-Driven IGMP (“Smart” IGMP), when unregistered multicasts are received the switch automatically filters (drops) them. Thus, the sooner the IGMP Leave is processed, the sooner this multicast traffic stops flowing.

Switches without problems (supporting data driven igmp):

  • Switch 6400cl

  • Switch 6200yl

  • Switch 5400zl

  • Switch 5300xl

  • Switch 4200vl

  • Switch 3500yl

  • Switch 3400cl

  • Switch 2900

  • Switch 2800

  • Switch 2500

Switches WITH problems (NOT supporting data driven igmp):

  • Switch 2600

  • Switch 2600-PWR

  • Switch 4100gl

  • Switch 6108

En conclusion, si vous avez un commutateur de la deuxième liste, c’est "normal". La solution est de faire en sorte que MuMuDVB joigne le groupe multicast. Pour cela, ajoutez multicast_auto_join=1 dans votre fichier de configuration.

20.11. MuMuDVB utilise beaucoup de temps processeur avec sasc-ng !

Si vous utilisez sasc-ng + dvbloopback, MuMuDVB consommera plus de temps processeur que nécessaire.

Une partie de ce temps CPU est utilisé pour débrouiller les chaînes, une autre part est due à la manière dont dvbloopback est implémenté et à la manière dont MuMuDVB interroge la carte.

Pour réduire l’utilisation processeur référez vous à la section réduire l’utilisation processeur de MuMuDVB. Dans le cas de l’utilisation de MuMuDVB avec sasc-ng cette amélioration peut être importante.

20.12. La réception est bonne mais MuMuDVB indique toutes les chaînes "down"

Si le signal est bon mais MuMuDVB vous indique que toutes les chaînes sont "down", cela peut être dû à votre module CAM si vous en possédez un. Essayez après avoir retiré votre module

20.13. Je veux diffuser à partir de plusieurs cartes

La solution est simple : lancez un processus de MuMuDVB pour chaque carte.

20.14. Je veux diffuser tout le transpondeur sur une "chaîne"

MuMuDVB peut diffuser toutes les données reçues par la carte sur une "chaîne" (multicast ou unicast). Pour cela, vous devez ajouter le PID 8192 dans la liste des PIDs de la chaîne.

20.15. J’ai plusieurs interfaces réseau et je veux choisir sur laquelle le traffic multicast sera envoyé

Pour spécifier l’interface, vous povez définir une route pour le traffic multicast comme :

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth2

ou vous pouvez utiliser les options multicast_iface4 et multicast_iface6

20.16. Que veulent dire les codes d’erreur de MuMuDVB ?

Voici une courte description des codes d’erreur

    ERROR_ARGS=1,
    ERROR_CONF_FILE,
    ERROR_CONF,
    ERROR_TOO_CHANNELS,
    ERROR_CREATE_FILE,
    ERROR_DEL_FILE,
    ERROR_TUNE,
    ERROR_NO_DIFF,
    ERROR_MEMORY,
    ERROR_NETWORK,
    ERROR_CAM,
    ERROR_GENERIC,
    ERROR_NO_CAM_INIT,

20.17. J’obtiens le message "DVR Read Error: Value too large for defined data type"

Ce message indique qu’un débordement de tampon a eu lieu dans le tampon du pilote de la carte DVB. C’est à dire que MuMuDVB n’a pas été capable de récupérer les paquets assez vite. Ce problème peut avoir des causes variées. Tout ce qui ralenti (beaucoup) MuMuDVB peut être la source de ce problème. Pour l'éviter vous pouvez essayer la lecture par thread.

Des problèmes réseau peuvent provoquer ce message :

I experienced the "DVR Read Error…" message very often on my Streaming Server (ia64 Madison 1.3Ghz) (with errors in the video). I could solve the problem by exchanging the network switch. The old switch was limiting multicast traffic to 10Mb/s per port. This limit is not documented.

I have tested the limit the programm dd and mnc (Multicast netcat, http://code.google.com/p/mnc/)

dd if=/dev/zero bs=188 count=1000000 | ./mnc-bin 239.10.0.3

I looked with "iftop" at the current network statistics and with my old switch i saw the limit at 10Mb/s with another switch I was able to transmit 92Mb/s ~ 100% of the avaiable bandwith.

Merci à Jan-Philipp Hülshoff

21. Utilisation avec des clients "particuliers"

Cette section n’est pas traduite, referez vous a la version anglaise.


mumudvb-1.7.1/doc/html/README.html000066400000000000000000002366231177353207000165540ustar00rootroot00000000000000 MuMuDVB - README
Note
An HTML version of this file is availaible on MuMuDVB’s website.
http://mumudvb.braice.net/mumudvb/logo_mumu_wiki.png

1. Presentation

1.1. Description

MuMuDVB (Multi Multicast DVB) is originally a modification of dvbstream that cr@ns made. We have decided to redistribute it.

Now, it’s a standalone project.

MuMuDVB is a program that redistributes streams from DVB (Digital Television) on a network (also called IPTV) using multicasting or HTTP unicast. It can multicast a whole DVB transponder by assigning each channel a different multicast IP.

1.2. Website

2. Authors and contacts

Upstream author
Contributions
  • Manuel Sabban (getopt)

  • Stéphane Glondu (man page, debian package)

  • Special thanks to Dave Chapman (dvbstream author and contributor)

  • Pierre Gronlier, Sébastien Raillard, Ludovic Boué, Romolo Manfredini

  • Utelisys Communications B.V. for the transcoding code

Note
When contacting about an issue, please join the config file used and the output of MuMuDVB in verbose mode ( -vvv on the command line) and any other information that could be useful.

3. Contents and features

3.1. Features overview

  • Stream channels from a transponder on different multicast IPs

  • Support for scrambled channels (if you don’t have a CAM you can use sasc-ng, but check if it’s allowed in you country/by your broadcaster)

  • Support for automatic configuration i.e channels discovery, see Autoconfiguration section

  • Generation of SAP announces, see SAP section

  • Support of DVB-S2, DVB-S, DVB-C, DVB-T and ATSC

  • Possibility to partially rewrite the stream for better compatibility with set-top boxes and some clients. See PAT Rewrite and SDT Rewrite sections.

  • Support for HTTP unicast see http unicast section

  • Support for RTP headers (only for multicast)

  • Ability to transcode the stream (only for multicast for the moment) see the Transcoding section

  • CAM menu access while streaming (using a web/AJAX interface - see WEBSERVICES.txt and CAM_menu_interface.png for screenshot)

3.2. Detailled feature list

  • Can show reception level when streaming

  • Show if channels are successfully descrambled by the CAM

  • Makes a list of streamed and down channels in real time

  • Can deamonize and write his own process id in a file

  • Supports standard and universals LNBs

  • Can stop himself if it receives no data from the card after a defined timeout

  • Stops trying tuning after a configurable timeout

  • The mandatory pids are always sent with all channels :

    • PAT (0): Program Association Table

    • CAT (1): Conditionnal Access Table

    • NIT (16): Network Information Table: intended to provide information about the physical network.

    • SDT (17): Service Description Table: data describing the services in the system e.g. names of services, the service provider, etc.

    • EIT (18): Event Information Table: data concerning events or programmes such as event name, start time, duration, etc.

    • TDT (20): Time and Date Table: information related to the present time and date.This information is given in a separate table due to the frequent updating of this information.

  • Can suscribe to all multicast groups (IGMP membership request) in order to avoid some switches to broadcast all channels see problems with HP switches.

  • Supports autoconfiguration, see Autoconfiguration section

    • In autoconfiguration mode, MuMuDVB follow the changes in the PIDs and update itself while running.

  • Debian flavor initialisation scripts

  • The buffer size can be tuned to reduce CPU usage, see reduce MuMuDVB CPU usage section.

  • Can avoid the sending of scrambled packets

  • Automatically detect the scrambling status of a channel

  • Can reset the CAM module in case of a bad initialisation

  • Can sort the EIT PID to send only the ones corresponding to the current channel

  • Data reading can be done using a thread, see thread reading section.

  • Playlist generation, see playlist

  • Templates support

  • Simple webservice exposing detailed streaming status (see WEBSERVICES.txt)

4. Installation

4.1. From sources

4.1.1. From a snapshot

If you downloaded a snapshot, you will have to generate the auto(conf make etc …) files. In order to do this you will need the autotools, automake, gettext and libtool and, type in the folder of MuMuDVB

autoreconf -i -f

Then you have a source which can be installed as a release package.

4.1.2. From a release package

In order to install MuMuDVB type:

$ ./configure [configure options]
$ make
# make install

The [configure options] specific to MuMuDVB are:

  --enable-cam-support    CAM support (default enabled)
  --enable-coverage       build for test coverage (default disabled)
  --enable-duma           Debbuging DUMA library (default disabled)

You can have a list of all the configure options by typing

$ ./configure --help
Note
The CAM support depends on libdvben50221, libucsi (from linuxtv’s dvb-apps). The configure script will detect automatically the presence of these libraries and deactivate the CAM support if one of them is not present.
Note
The decoding of long channel names for autoconfiguration in ATSC depends on libucsi (from linuxtv’s dvb-apps). The configure script will detect automatically the presence of this library and deactivate the long channel name support if it is not present. The full autoconfiguration will still work with ATSC but the channel names will be the short channels names (7 characters maximum)
Note
If you want to compile the doc i.e. generate HTML files using asciidoc, type make doc. The rendering for the tables will work with asciidoc 8.4.4 (can work with lower version but not tested).

In order to install starting scripts (debian flavor) type:

# cp scripts/debian/etc/default/mumudvb /etc/default/mumudvb
# cp scripts/debian/etc/init.d/mumudvb /etc/init.d/mumudvb
Note
It is advised to create a system user for MuMuDVB, e.g. : _mumudvb, you have to add this user to the video group and make the directory /var/run/mumudvb RW by this user. By doing this, you’ll be able to get all the features of MuMuDVB.

4.2. From Debian package

If you want to install a version which is not in your repositories, you can install it by hand by typing:

# dpkg -i mumudvb*.deb

Otherwise you can use aptitude/synaptic as usual

5. Usage

The documentation for configuration file syntax is in doc/README_CONF.txt (HTML version).

Usage:

mumudvb [options] -c config_file
mumudvb [options] --config config_file

Possible options are:

-d, --debug
        Don't deamonize and print messages on the standard output.

-s, --signal
        Print signal strenght every 5 seconds

-t, --traffic
        Print the traffic of the channels every 10 seconds

-l, --list-cards
        List the DVB cards and exit

--card
        The DVB card to use (overrided by the configuration file)

--server_id
        The server id (for autoconfiguration, overrided by the configuration file)

-h, --help
        Show help

-v
        More verbose (add for more)

-q
        More quiet (add for less)

--dumpfile
        Debug option : Dump the stream into the specified file

Signal: (see kill(1))

    SIGUSR1: switch the signal strenght printing
    SIGUSR2: switch the traffic printing
    SIGHUP: flush the log files

6. Autoconfiguration

MuMuDVB is able to find the channels in the transponder and their PIDs (Program IDentifiers).

Without autoconfiguration, you have to set the transponder parameters, and for each channel, the multicast ip, the name and the PIDs (PMT, audio, video, teletext etc…)

At the end of autoconfiguration, MuMuDVB generates a config file with the discovered parameters. This file is: /var/run/mumudvb/mumudvb_generated_conf_card%d_tuner%d

If the PIDs are changed, MuMuDVB will automatically update the channels except if you put autoconf_pid_update=0 in your configuration file.

MuMuDVB is able to do two kinds of autoconfiguration:

6.1. Full autoconfiguration

This is the easiest way to use MuMuDVB.

Use this when you want to stream a full transponder or a subset of a transponder (using autoconf_sid_list).

Note
You don’t have to specify any channel using this mode

In this mode, MuMuDVB will find for you the different channels, their name and their PIDs (PMT, PCR, Audio, Video, Subtitle, Teletext and AC3).

In order to use this mode you have to: - Set the tuning parameters to your config file - Add autoconfiguration=full to your config file - You don’t have to set any channels - For a first use don’t forget to put the -d parameter when you launch MuMuDVB: e.g. mumudvb -d -c your_config_file

Example config file for satellite at frequency 11.296GHz with horizontal polarization
freq=11296
pol=h
srate=27500
autoconfiguration=full

The channels will be streamed over the multicasts ip adresses 239.100.c.n where c is the card number (0 by default) and n is the channel number.

If you don’t use the common_port directive, MuMuDVB will use the port 1234.

Note
By default, SAP announces are activated if you use this autoconfiguration mode. To deactivate them put sap=0 in your config file. By default, SDT rewriting is activated if you use this autoconfiguration mode. To deactivate it put rewrite_sdt=0 in your config file. By default, PAT rewriting is activated if you use this autoconfiguration mode. To deactivate it put rewrite_pat=0 in your config file. By default, EIT sorting activated if you use this autoconfiguration mode. To deactivate it put sort_eit=0 in your config file.
Note
A detailled, documented example configuration file can be found in doc/configuration_examples/autoconf_full.conf

6.1.1. Name templates and autoconfiguration

By default the name of the channel will be the name of the service defined by the provider. If you want more flexibility you can use a template.

For example, if you use autoconf_name_template=%number-%name The channels name will be in the form :

  • 1-CNN

  • 2-Euronews

There is different keywords available:

Keyword Description

%name

The name given by the provider

%number

The MuMuDVB channel number

%lang

The channel primary language

%card

The DVB card number

%tuner

The tuner number

%server

The server number specified by server_id or the command line

%lcn

The logical channel number (channel number given by the provider). Your provider have to stream the LCN. The LCN will be displayed with three digits including 0. Ex "002". If the LCN is not detected, %lcn will be replaced by an empty string.

%2lcn

Same as above but with a two digits format

Please refer to README_CONF to see which options accept which templates

Other keywords can be easily added if necessary.

6.2. Simple autoconfiguration

Note
This autoconfiguration mode will soon disapear. If you absolutely need it except for setting the channel names and their IP adresses, please contact.

Use this when you want to control the name of the channels, and their IPs better than using the templates.

  • You have to add autoconfiguration=partial in the head of your config file.

  • For each channel, you have to set:

    • the Ip adress (except if you use unicast)

    • the name

    • the PMT PID

MuMuDVB will find the audio, video, PCR, teletext, subtitling and AC3 PIDs for you before streaming.

Note
If you put more than one PID for a channel, MuMuDVB will deactivate autoconfiguration for this channel.
Note
A detailled, documented example configuration file can be found in doc/configuration_examples/autoconf_partial.conf
Note
Simple autoconfiguration can fail finding the good pids if a PMT pid is shared within multiples channels. In this case you have to add the service_id option to the channel to specify the service id.

7. SAP announces

SAP (Session Announcement Protocol) announces are made for the client to know which channels are streamed and what is their name and adress. It avoids to give to the client the list of the multicast ip adresses.

VLC and most of set-top boxes are known to support them.

MuMuDVB will automatically generate and send SAP announces if asked to in the config file or if you are in full autoconfiguration mode.

The SAP announces will be only sent for alive channels. When a channel goes down, MuMuDVB will stop sending announces for this channel, until it goes back.

7.1. Asking MuMuDVB to generate SAP announces

For sending SAP announces you have to add sap=1 to your config file. The other parameters concerning the sap announces are documented in the doc/README_CONF.txt file (HTML version).

7.1.1. SAP announces and full autoconfiguration

If you use full autoconfiguration, you can use the keyword %type in the sap_default_group option. This keyword will be replaced by the type of the channel: Television or Radio.

Example

If you put sap_default_group=%type, you will get two sap groups: Television and Radio, each containing the corresponding services.

7.2. Configuring the client to get the SAP announces

7.2.1. VLC > 0.8.2

You have to enter the settings, choose advanced settings. The SAP announces are in playlist→service discovery.

Don’t forget to save the settings.

You should have now a SAP section in your playlist.

7.2.2. VLC < 0.8.2

Click on the "Settings" menu, then on "add interface" and choose SAP playlist. Then open you playlist, the SAP announces should appear automatically.

8. HTTP Unicast

In addition to multicast, MuMuDVB also supports HTTP unicast. This make you able to use MuMuDVB on networks wich doesn’t support multicast.

There is one listening connection, the channel is selected via the HTTP path, see further.

And you can have listening sockets per channel, in this case the client will always get the same channel independantly of the path.

Note
Be careful with unicast, it can eat a lot of bandwith. Think about limitting the number of clients.
Note
If you don’t want the (always here) multicast traffic to go on your network set multicast=0

8.1. Activate HTTP unicast

To enable HTTP unicast you have to set the option unicast. By default MuMuDVB will listen on all your interfaces for incoming connections.

You can also define the listening port using port_http. If the port is not defined, the default port will be 4242.

8.2. Activate "per channel" listening socket

You can create listening connections only for a channel. In this case, when a client connect to this socket he will alway get the same channel independantly of the HTTP path.

8.2.1. If you use full autoconfiguration

You need to set the option autoconf_unicast_start_port which define what is the output port for the first discovered channel (for the following channels the port will be incremented).

8.2.2. If you don’t use full autoconfiguration

For the channels for which you want to have a listening unicast socket you have to set the option unicast_port which define the listening port of the socket

8.3. Client side, the different methods to get channels

8.3.1. Using a playlist

MuMuDVB generates m3u playlists.

If you server is listening on the ip 10.0.0.1 and the port 4242,

vlc http://10.0.0.1:4242/playlist.m3u
Note
In this playlist the channels will be announced with URLs type /bysid/ (see below), if you want a playlist for single channel sockets, use the URL /playlist_port.m3u.
Note
Playlists for multicast are also generated, they are accessible using the following names: "playlist_multicast.m3u" and "playlist_multicast_vlc.m3u"

8.3.2. Single channel socket

If the client connect to a single client socket he will get the associated channel independantly of the path.

If you server is listening on the ip 10.0.0.1 and the port for the channel is 5000,

vlc http://10.0.0.1:5000/

8.3.3. Get the channel by number

You can ask the channel by the channel number (starting at 1).

If you server is listening on the ip 10.0.0.1 and the port 4242,

vlc http://10.0.0.1:4242/bynumber/3

will give you the channel number 3. This works also with xine and mplayer.

8.3.4. Get the channel by service id

You can ask the channel by the service id.

If you server is listening on the ip 10.0.0.1 and the port 4242,

vlc http://10.0.0.1:4242/bysid/100

will give you the channel with the service id 100, or a 404 error if there is no channel with this service id. This works also with xine and mplayer.

8.3.5. Get the channel by name

Note
This is not implemented for the moment, it will be implemented in a future release

8.3.6. Get the channels list

If you server is listening on the ip 10.0.1 and the port 4242,

To get the channel list (in basic html) just enter the adress http://10.0.0.1:4242/channels_list.html in your web browser.

To get the channel list (in JSON) just enter the adress http://10.0.0.1:4242/channels_list.json in your web browser.

8.4. HTTP unicast and monitoring

This HTTP connection can be used to monitor MuMuDVB.

Monitoring information is avalaible in JSON format (http://en.wikipedia.org/wiki/JSON) vis the following urls /monitor/signal_power.json and /monitor/channels_traffic.json

It’s quite easy to add new informations to these files if needed.

9. Monitoring

You can use Monit to monitor MuMuDVB an restart it when it experiences problems (MuMuDVB kill himself when big issues appear).

You have to install the init scripts (automatic if you used the Debian package) and add the following lines to your /etc/monit/services file:

check process mumudvb with pidfile /var/run/mumudvb/mumudvb_adapter0_tuner0.pid
    start program = "/etc/init.d/mumudvb start"
    stop program = "/etc/init.d/mumudvb stop"
Note
The 0 have to be replaced by the DVB card number if you have multiples cards.

For more detailled information, refer to the Monit Website.

MuMuDVB usually run for many days without problems, but with monit you are safe. Monit is also able to send e-mails in case of problems.

10. Scrambled channels support

Important note : check the contract with your broadcaster to see if you are allowed to stream the scrambled channels you’re subscribed to.

10.1. Hardware descrambling

MuMuDVB supports scrambled channels via hardware descrambling i.e. a CAM (Conditionnal Access Module). It can ask the CAM to descramble multiple channels if the CAM supports it (Aston Pro, or PowerCam Pro are known to work with multiple channels).

If you are limited by the number of PIDs the can can decrypt simultaneously, it is possible to ask the CAM to decrypt only the audio and video. This feature is not implemented, please ask if you need it.

Note
The hardware descramblig uses almost no CPU, all the descrambling is made by the CAM.
Note
MuMuDVB doesn’t query the CAM before asking for descrambling. The query is not reliable. Most of CAMs answer a menu when the descrambling is not possible and MuMuDVB will display it on the standard error.

The information concerning the CAM is stored in '/var/run/mumudvb/caminfo_adapter%d_tuner%d''' where %d is the DVB card number.

Example contents of '/var/run/mumudvb/caminfo_carte%d'''
CAM_Application_Type=01
CAM_Application_Manufacturer=02ca
CAM_Manufacturer_Code=3000
CAM_Menu_String=PowerCam_HD V2.0
ID_CA_Supported=0100
ID_CA_Supported=0500
Note
In case of issues with some king of CAMs the libdvben50221 could have to be patched: Link to the patch

10.1.1. How to ask MuMuDVB for descrambling?

You are using full autoconfiguration :

Just add cam_support=1 to your config file

You are using partial autoconfiguration or no autoconfiguration
  • Add cam_support=1 to your config file (before the channels)

  • For each scrambled channel add the cam_pmt_pid option. This option is made for MuMuDVB to know wich PID is the PMT PID wich will be used to ask for descrambling

Note
You have an example of CAM support in doc/configuration_examples/autoconf_partial.conf

10.2. Software descrambling

Important note : this solution is not allowed by some provider contracts.

MuMuDVB has been reported to work with software descrambling solutions like sascng + newcs + dvbloopback.

In this case you don’t need to set the cam_support option. Just ajust the card option to fit with your virtual dvbloopback card.

If you use these solutions, see reduce MuMuDVB CPU usage section.

10.2.1. Some information on how to configure SASC-NG

The following informations have been given by MuMuDVB users on the MuMuDVB-dev mailing list

When the channels are not sucessfully descrambled (channel down in MuMuDVB) the following options are reported to improve the situation

--sid-nocache --buffer 8M --sid-filt=200 -D

You can try also the option --sid-allpid It seems to happend with transponders with a lot of channels (TV or RADIO channels).

10.3. Scrambling status

The scrambling status is stored together with the streamed channel list.

Example
239.100.0.7:1234:ESCALES:PartiallyUnscrambled
239.100.0.8:1234:Fit/Toute l'Histoire:PartiallyUnscrambled
239.100.0.9:1234:NT1:PartiallyUnscrambled
239.100.0.10:1234:ACTION:PartiallyUnscrambled
239.100.0.11:1234:MANGAS:PartiallyUnscrambled
239.100.0.12:1234:ENCYCLOPEDIA:PartiallyUnscrambled
239.100.0.13:1234:XXL PL:PartiallyUnscrambled
239.100.0.14:1234:France 5:HighlyScrambled
239.100.0.16:1234:LCP:FullyUnscrambled
239.100.0.17:1234:VIDEOCLICK:FullyUnscrambled
  • FullyUnscrambled : less than 5% of scrambled packets

  • PartiallyUnscrambled : between 5% and 95% of scrambled packets

  • HighlyScrambled : more than 95% of scrambled packets

11. PAT (Program Allocation Table) Rewriting

This feature is mainly intended for set-top boxes. This option will announce only the streamed channel in the Program Allocation Table instead of all transponder channels. Computer clients parse this table and decode the first working program. Set-top boxes usually try only the first one which give usually a blank screen in most of the channels.

To enable PAT rewriting, add rewrite_pat=1 to your config file. This feature consumes few CPU, since the rewritten PAT is stored in memory and computed only once per channel.

Note
PAT rewrite can fail (i.e. doesn’t solve the previous symptoms) for some channels if their PMT pid is shared. In this case you have to add the service_id option to the channel to specify the service id.

12. SDT (Service Description Table) Rewriting

This option will announce only the streamed channel in the Service Description Table instead of all transponder channels. Some clients parse this table and can show/select ghost programs if it is not rewritten (even if the PAT is). This can rise to a random black screen.

To enable SDT rewriting, add rewrite_sdt=1 to your config file. This feature consumes few CPU, since the rewritten SDT is stored in memory and computed only once per channel.

Note
If you don’t use full autoconfiguration, SDT rewrite needs the service_id option for each channel to specify the service id.

13. EIT PID (Event Information Table) Sorting

This option will make MuMuDVB stream only the EIT packets corresponding to the streamed channel instead of all transponder channels. Some clients parse this table and can show/select ghost programs (even if the PAT and the SDT are rewritten).

To enable EIT sorting, add sort_eit=1 to your config file.

Note
If you don’t use full autoconfiguration, EIT sorting needs the service_id option for each channel to specify the service id.

14. Reduce MuMuDVB CPU usage

Normally MuMuDVB reads the packets from the card one by one and ask the card if there is data avalaible between each packets (poll). But often the cards have an internal buffer. Because of this buffer, some pollings are useless. These pollings eat some CPU time.

To reduce CPU usage, one solution is to try to read several packets at the same time. To do this use the option dvr_buffer_size.

Example
dvr_buffer_size=40

To see if the value you put is too big or to low, run MuMuDVB in verbose mode, the average number of packets received at the same time will be shown every 2 minutes. If this number if below your buffer size, it is useless to increase it.

The CPU usage reduction can be between 20% and 50%.

15. Data reading using a thread

In order to make MuMuDVB more robust (at the cost of a slight CPU consumption increase), MuMuDVB can read the data from the card using a thread. This make the data reading "independant" of the rest of the program.

In order to enable this feature, use the option dvr_thread.

This reading uses two buffers: one for the data just received from the card, one for the data treated by the main program. You can adjust the size of this buffers using the option dvr_thread_buffer_size. The default value (5000 packets of 188 bytes) should be sufficient for most of the cases.

The message "Thread trowing dvb packets" informs you that the thread buffer is full and some packets are dropped. Increase the buffer size will probably solve the problem.

16. Transcoding

MuMuDVB supports transcoding to various formats to save bandwidth. The transcoding is made using ffmpeg librairies. This feature is pretty new, so feel free to contact if you have comments/suggestions.

For transcoding support, you have to compile MuMuDVB yourself. Due tu API changes, transcoding is broken for recent versions of MuMuDVB.

Note
Transcoding doesn’t work for the moment with unicast

To have more details on transcoding, see the dedicated documentation file

17. IPv6

MuMuDVB supports IPv6 multicasting. It is not enabled by default you have to activate it using the multicast_ipv6 option

To "enjoy" multicasting you need a switch which supports the Multicast Listener Discovery protocol.

IPv6 use extensively the concept of scoping. By default MuMuDVB uses the scope "site-local" (ie multicast addresses starting with FF05) the SAP announcements are also sent with this scope. If you need to have more flexibility on this side, please contact.

For more details, please consult the IPv6 page on MuMuDVB’s website

18. Technical details (not sorted)

  • CPU consuming: MuMuDVB takes 15% CPU of a celeron 2.6GHz with an Hauppauge card and linux version 2.6.9 when streaming a full transponder (about 30MBit/s)

  • Try to avoid old via or nForce chipsets and in general ultra low cost motherboards. They can’t deal with a lot of data on the PCI bus.

  • When the program starts, he writes the channel list in the file /var/run/mumudvb/channels_streamed_adapter%d_tuner%d (where %d are the card number and the tuner number). This file contains streamed channels (updated every 5 seconds) in the form: "name:ip:port:Scramblingstatus"

  • MuMuDVB is able to support as many cards as the operating system does. Old versions of udev+glibc were not able to support more than 4 cards but this problem is solved using relatively recent versions (udev > 104 and libc6 > 2.7)

  • When daemonized, MuMuDVB writes its process identifier in /var/run/mumudvb/mumudvb_adapter%d_tuner%d.pid, where %d is replaced by the card number and the tuner number

  • MuMuDVB supports satellite in the Ku band, with universal or standard LNBs. The support of satellites in the S or C band is implemented via the use of the lo_frequency option. See doc/README_CONF.txt (HTML version).

19. MuMuDVB Logs

MuMuDVB can send it’s logs to the console, to a file or via syslog. It can also be several of these channels. The formatting of the logs can also be adjusted.

By default, the logs are sent to the console if not daemonized and via syslog otherwise.

If the logs are sent to a file, you can ask MuMuDVB to flush the file using the SIGHUP signal.

For more detail about these features see doc/README_CONF.txt (HTML version).

20. Known issues

20.1. VLC can’t read the stream but it is fine with xine or mplayer

  • For VLC, you must specify the PMT PID besides audio and video PIDs. It’s a frequent issue. To solve it you can use the verbose mode of VLC (vlc -v) and you’ll see a ligne like: [00000269] ts demuxer debug: * number=1025 pid=110 you’ll have the PMT PID associated with your program number, you can also use dvbsnoop, or see how to get pids in doc/README_CONF.txt (HTML version). Another solution is to use full autoconfiguration.

20.2. VLC reads the video but no audio

  • This problem can happend if the PCR (i.e. clock) information is not carried with the video. In this case you have to check if the PCR PID is in the PIDs list.

20.3. MuMuDVB can’t deamonize

  • In order to deamonize, MuMuDVB needs the directory /var/run/mumudvb/ to be writable, in order to write his process identifier and the channel list.

20.4. The system crashes or freeze

  • Old via chipset or nForce chipset are not professional chipsets. They can’t deal with a lot of data on PCI. But you can try to tune your BIOS.

20.5. Tuning issues with DVB-T

  • You must check tuning settings, knowing that auto bandwidth usually does’nt work.

20.6. The set-top box display a blank screen

  • If the stream is working well when reading it with a computer and not with your set-top box, this is probably because your set-top box needs the PAT PID to be rewritten. To do this add rewrite_pat=1 to your config file.

20.7. Simple autoconfiguration fails finding the right pids

  • This can happend if a PMT PIDs is shared among multiple channels, see simple autoconfiguration section for more details.

20.8. The CAM is complaining about locked channels

  • Some viaccess CAMs can have a lock for "mature" channels. To deactivate this lock go on the CAM menu using "gnutv -cammenu" for example (from linuxtv dvb-apps).

You have to set the maturity rating to maximum and unlock Maturity rating in Bolts submenu.

20.9. VLC doesn’t select the good program even with PAT rewriting

You also have to rewrite the SDT PID using the rewrite_sdt option

20.10. HELP ! my multicast traffic is flooded (I have a HP procurve switch)

The best explanation is found in the HP multicast routing guide.

On switches that do not support Data-Driven IGMP, unregistered multicast groups are flooded to the VLAN rather than pruned. In this scenario, Fast-Leave IGMP can actually increase the problem of multicast flooding by removing the IGMP group filter before the Querier has recognized the IGMP leave. The Querier will continue to transmit the multicast group during this short time, and because the group is no longer registered the switch will then flood the multicast group to all ports.

On ProCurve switches that do support Data-Driven IGMP (“Smart” IGMP), when unregistered multicasts are received the switch automatically filters (drops) them. Thus, the sooner the IGMP Leave is processed, the sooner this multicast traffic stops flowing.

Switches without problems (supporting data driven igmp):

  • Switch 6400cl

  • Switch 6200yl

  • Switch 5400zl

  • Switch 5300xl

  • Switch 4200vl

  • Switch 3500yl

  • Switch 3400cl

  • Switch 2900

  • Switch 2800

  • Switch 2500

Switches WITH problems (NOT supporting data driven igmp):

  • Switch 2600

  • Switch 2600-PWR

  • Switch 4100gl

  • Switch 6108

So if you have one of the above switches this is "normal". The workaround is to make MuMuDVB join the multicast group. For this put multicast_auto_join=1 in your configuration file.

20.11. MuMuDVB is eating a lot of CPU with sasc-ng !

If you use sasc-ng + dvbloopback, MuMuDVB will eat more CPU than needed.

A part of this CPU time is used to descramble the channels, another part is due to the way dvbloopback is implemented and the way MuMuDVB ask the card.

To reduce the cpu usage, see reduce MuMuDVB CPU usage section. In the case of using MuMuDVB with sasc-ng this improvement can be quite large.

20.12. The reception is working but all the channels are down

If the signal is good but MuMuDVB tells you that all the channels are down and you are sure about your pids it can be due to your CAM module if you have one. Try after unplugging your CAM module.

20.13. I want to stream from several cards

The solution is simple: just launch a MuMuDVB process for each card.

20.14. I want to stream the whole transponder on one "channel"

MuMuDVB can stream all the data received by the card to one "channel" (multicast or unicast). In order to do this you have to use the put the PID 8192 in the channel PID list.

20.15. I have several network interfaces and I want to choose on which interface the multicast traffic will go

In order to specify the interface, you can specify a route for the multicast traffic like :

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth2

or use multicast_iface4 and multicast_iface6 options

20.16. What does the MuMuDVB error code means ?

Here’s a short description of the error codes

    ERROR_ARGS=1,
    ERROR_CONF_FILE,
    ERROR_CONF,
    ERROR_TOO_CHANNELS,
    ERROR_CREATE_FILE,
    ERROR_DEL_FILE,
    ERROR_TUNE,
    ERROR_NO_DIFF,
    ERROR_MEMORY,
    ERROR_NETWORK,
    ERROR_CAM,
    ERROR_GENERIC,
    ERROR_NO_CAM_INIT,

20.17. I get the message "DVR Read Error: Value too large for defined data type" what does it mean ?

This message means that an overflow append in the ard drivers buffer. I.e MuMuDVB was not able to get the packets sufficiently fast. This issue can have various causes, anything which an slow down (a lot) MuMuDVB an create this message. To avoid it you can try threaded_read see thread reading section.

An explanation can be networking issues :

I experienced the "DVR Read Error…" message very often on my Streaming Server (ia64 Madison 1.3Ghz) (with errors in the video). I could solve the problem by exchanging the network switch. The old switch was limiting multicast traffic to 10Mb/s per port. This limit is not documented.

I have tested the limit the programm dd and mnc (Multicast netcat, http://code.google.com/p/mnc/)

dd if=/dev/zero bs=188 count=1000000 | ./mnc-bin 239.10.0.3

I looked with "iftop" at the current network statistics and with my old switch i saw the limit at 10Mb/s with another switch I was able to transmit 92Mb/s ~ 100% of the avaiable bandwith.

Thanks to Jan-Philipp Hülshoff for the report

21. Using MuMuDVB with "particular" clients

People were able to use MuMuDVB with various clients, I will report here the tutorials I received for some of them

21.1. XBMC (for XBOX originally)

Description: XBMC (XBMP really) started as a program for modified XBOX consoles. In the following years, XBMC has grown into a multi-platform, multi-architecture media center that runs on most standard hardware. The hardware and legal limitations of the XBOX were always a concern and the Team has instead focused on running on the hardware that most people already have.

Tutorial: Here`s what You have to do, open Your favorite text editor and write an ip address with the protocol You are using of the particular program and port save it as something.strm. You have to create .strm files for every program You are streaming. Once you have done that fire up WinSCP and connect to the ip address of Your XBMC box if You are using the live version username and password is xbmc xbmc if You have installed the live version then You have provided the username and password during install process. Now copy theoes .strm files to the XBMC box in lets say home folder. Now in XBMC go to the video menu then click add source then click browse and navigate to the home folder and click ok then u have to give the name of that source use what ever You like and click ok and thats it. Go to the video menu You will see that You have a folder named as You named the source open it and You will see all of Yours .strm files click on it and it will start to play the stream from mumudvb. Works weather You are using multicast or unicast.

Thanks to Ivan Cabraja for the tutorial

21.2. MythTV

Description: MythTV is a Free Open Source software digital video recorder (DVR) project distributed under the terms of the GNU GPL.

Tutorial: Configuring Mythtv and mumudvb

21.2.1. Mumudvb Configuration:

You need to turn pat rewriting on (i.e. rewrite_pat=1).

You can use either multicast or udp streaming to mythtv (udp streaming is achieved by using a non-multicast ip address in the configuration file i.e. ip=192.168.1.100). Http unicast streaming is not supported in mythtv, but RTSP should be when this is implemented in mumudvb.

The channel name needs to be in the following format "channel number" - "channel name" (e.g. name=1 - TV One )

21.2.2. Mythtv configuration:

Single-transponder

In mythtv-setup you need to add a new "network recorder" capture card. Enter the address of the playlist mumudvb provides in the "M3U URL" field. This will be something like http://192.168.2.2:4242/playlist_multicast.m3u

You then create a video source as normal, and associate this with the "Network recorder" capture card via the "input connections" option.

You then need to carry out a channel scan (while you are associating the video source or via the channel editor).

The channel scan appears to hang on 0%, but just select finish after a couple of seconds. This should have loaded the channels defined in the M3U file into mythtv.

Relying on the EIT information embedded in the stream does not appear to work, so you need to load this information from an external xmltv source. You do this by going into the channel editor and adding the correct xmltv ID for each channel. Once you have done this you exit out of mythtv-setup and run something like: mythfilldatabase --file 1 freeview.xml (where in this case the the xmltv file is called freeview.xml).

To allow recording and viewing of multiple channels from the one transponder, you need to add additional (identically configured) "network recorder" capture cards. For example if you want to be able to record two channels and watch a third at the same time you need to have set up a total of three network recorder cards.

Multiple-Transponders

if you are streaming channels from several transponders (by using several instances of mumudvb) you have two options:

1) The obvious thing to do is to define a different network recorder for each transponder (with the appropriate playlist defined), each transponder has to be associated with a different video source (assuming each transponder contains different channels). However, this does not seem to work well, with regular crashes when changing channels, and it also requires that you first switch between video sources to be able to change between channels on different transponders [this may be due to my lack of skill at configuring mythtv]

2) An easier way is to generate a custom m3u file, that contains the channels of all the transponders. This also allows you to define the xmltvid of each channel as well - removing the need to do this manually in the channel editor. In this case when you set up the network recorders, you can enter a file path for the location of the m3u file, as opposed to accessing it via a web-server (e.g. file///home/nick/channels.m3u ). Once again you simply make multiple copies of the (identical) network recorder capture card if you want to record/watch multiple channels.

An example of a m3u file is as follows (in this case the first four channels defined are from one mumudvb instance, and the last two from another - of course care has to be taken in configuring the various mumudvb instances to make sure none of the channels are assigned the same port etc):

#EXTM3U
#EXTINF:0,1 - TV1
#EXTMYTHTV:xmltvid=tv1.freeviewnz.tv
udp://192.168.2.101:1233
#EXTINF:0,2 - TV2
#EXTMYTHTV:xmltvid=tv2.freeviewnz.tv
udp://192.168.2.101:1235
#EXTINF:0,6 - TVNZ 6
#EXTMYTHTV:xmltvid=tvnz6.freeviewnz.tv
udp://192.168.2.101:1236
#EXTINF:0,7 - TVNZ 7
#EXTMYTHTV:xmltvid=tvnz7.freeviewnz.tv
udp://192.168.2.101:1237
#EXTINF:0,3 - TV3
#EXTMYTHTV:xmltvid=tv3.freeviewnz.tv
udp://192.168.2.101:1238
#EXTINF:0,4 - c4
#EXTMYTHTV:xmltvid=c4.freeviewnz.tv
udp://192.168.2.101:1239

Thanks to Nick Graham for the tutorial


mumudvb-1.7.1/doc/html/README_CONF-fr.html000066400000000000000000002220601177353207000177540ustar00rootroot00000000000000 MuMuDVB - README concernant le fichier de configuration

1. Comportement général

Pour fonctionner correctement, MuMuDVB a besoin d’un fichier de configuration.

L’ordre des paramètres n’a, la plupart du temps, pas d’importance.

Vous pouvez mettre des commentaires n’importe où dans le fichier de configuration, il suffit de commencer la ligne par un #. Les commentaires dans une ligne ne sont pas autorisés, exemple port=1234 #Le port multicast n’est pas une ligne valide.

Tous les paramètres s'écrivent sous la forme nom=valeur

Example
#La fréquence d'accord
freq=11987

Le fichier de configurations est constitué de deux parts : une partie générale, et une partie définissant les chaînes

1.1. Partie générale

Cette partie, la première du fichier de configuration, contient les paramètres nécessaires pour accorder la carte DVB et les autres paramètres globaux.

Pour les paramètres concernant l’accord de la carte, référez vous à la section paramètres d’accord. Pour les autres paramètres globaux, référez vous à la section paramètres globaux

1.2. Partie concernant les chaînes

Si vous n’utilisez pas l’autoconfiguration complète, vous devez définir les chaînes que vous voulez diffuser.

Chaque définition de chaîne commence par une ligne ip= ou channel_next.

Example
channel_next
name=Barcelona TV
unicast_port=8090
pids=272
Example
ip=239.100.0.0
port=1234
name=Barcelona TV
pids=272 256 257 258

Référez vous a la section configuration des chaînes pour une liste détaillée des différents paramètres.

2. Fichiers d’exemple

Vous pouvez trouver des fichiers de configuration documentés dans le répertoire doc/configuration_examples

3. Paramètres concernant l’accord de la carte

Note
Vous pouvez utiliser w_scan pour savoir quelles chaînes vous pouvez recevoir. Pour plus de détails référez vous a la section w_scan. Sinon vous pouvez regarder le contenu des "initial tuning files" fourni avec dvb-apps de linuxtv. Le site King Of Sat référence les chaînes satellite pouvant être reçues en Europe

3.1. Paramètres communs à tous les modes de réception (terrestre, satellite, câble et ATSC)

Dans la liste suivante, seul le paramètre freq est obligatoire

Nom Description Valeur par défaut Commentaires

freq

Fréquence du transpondeur en MHz

Obligatoire

modulation

Le type de modulation utilisé (valeurs possibles : QPSK QAM16 QAM32 QAM64 QAM128 QAM256 QAMAUTO VSB8 VSB16 8PSK 16APSK 32APSK DQPSK)

ATSC: VSB_8, cable/terrestrial: QAM_AUTO, satellite: QPSK

Optionnel la plupart du temps

delivery_system

Le type de système utilisé (valeurs possibles : DVBT DVBT2 DVBS DVBS2 DVBC_ANNEX_AC DVBC_ANNEX_B ATSC)

Non défini

Spécifiez le si vous voulez utiliser la nouvelle API pour l’accord des cartes (DVB API 5/S2API). Obligatoire pour le DVB-S2 et DVB-T2

card

Le numéro de carte DVB/ATSC

0

Limité seulement par l’OS

tuner

Le numéro de tuner

0

Si vous avez une carte avec plusieurs tuners (ie il y a plusieurs frontend* dans /dev/dvb/adapter%d)

card_dev_path

Le chemin vers le répertoire contenant les "devices" DVB. Utilisez cette option si vous utilisez des chemins personalisés comme /dev/dvb/card_astra

/dev/dvb/adapter%d

tuning_timeout

Temps d’attente pour l’accord de la carte

300

0 = attente infinie

timeout_no_diff

Si aucune chaîne n’est diffusée, MuMuDVB se "suicidera" au bout de ce délai ( en secondes )

600

0 = attente infinie

check_status

Est ce que MuMuDVB verifie le status de la carte en permanence et affiche un message si le signal est perdu

1

0 = pas de verification.

3.2. Paramètres spécifiques à la réception satellite

Nom Description Valeur par défaut Valeurs possibles Commentaires

pol

Polarisation. Un caractère. v (verticale), h (horizontale), l ( circulaire gauche ), r ( circulaire droite )

h, H, v, V, l, L, r ou R

Obligatoire

srate

Le taux de symboles ( symbol rate )

Obligatoire

lnb_type

Le type de LNB

universal

universal, standard

Universel : deux oscillateurs locaux. Standard : un oscillateur local. La plupart des LNBs sont universels.

lnb_lof_standard

La fréquence de l’oscillateur local du LNB ( lorsque le type de LNB est standard )

10750

En MHz, voir plus bas

lnb_slof

La fréquence de commutation pour le LNB, définit les bandes haute et basse ( lorsque le type de LNB est universel )

11700

En MHz, voir plus bas

lnb_lof_low

La fréquence de l’oscillateur local du LNB pour la bande basse ( lorsque le type de LNB est universel )

9750

En MHz, voir plus bas

lnb_lof_high

La fréquence de l’oscillateur local du LNB pour la bande haute ( lorsque le type de LNB est universel )

10600

En MHz, voir plus bas

sat_number

Le numéro de satellite si vous avez plusieurs LNB. Aucun effet si égal à 0 (seulement ton 22kHz et 13/18V), envoie un message diseqc si différent de 0

0

0, 1 à 4

switch_type

Le type de switch DiSEqC : Committed ou Uncommitted

C

C, c, U or U

lnb_voltage_off

Force la tension pour le LNB à 0V (au lieu de 13V ou 18V). Ceci est utile si votre LNB possède sa propre alimentation.

0

0 ou 1

coderate

coderate, appelé aussi FEC

auto

none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto

rolloff

rolloff important seulement pour le DVB-S2

35

35, 20, 25, auto

La valeur par défaut devrait marcher la plupart du temps

3.2.1. Fréquences pour l’oscillateur local :

  • Bande S 3650 MHz

  • Bande C (Hi) 5950 MHz

  • Bande C (Lo) 5150 MHz

  • Bande Ku : C’est la bande par défaut, vous n’avez pas a spécifier la fréquence de l’oscillateur local. Pour information Hi band : 10600, Low band : 9750, Single : 10750

3.3. Paramètres spécifiques à la réception terrestre (DVB-T)

Note
auto marche habituellement bien excepté pour bandwidth
Nom Description Valeur par défaut Valeurs possibles

bandwidth

Largeur de bande

8MHz

8MHz, 7MHz, 6MHz, auto (DVB-T2 : 5MHz, 10MHz, 1.712MHz)

trans_mode

Mode de transmission

auto

2k, 8k, auto (DVB-T2 : 4k, 16k, 32k)

guardinterval

Intervalle de garde

auto

1/32, 1/16, 1/8, 1/4, auto (DVB-T2 : 1/128, 19/128, 19/256)

coderate

coderate, aussi appelé FEC

auto

none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto

3.4. Paramètres spécifiques a la réception par câble (DVB-C)

Nom Description Valeur par défaut Valeurs possibles Commentaires

srate

Le taux de symboles (Symbol rate)

obligatoire

qam

Modulation : quadrature amplitude modulation

auto

qpsk, 16, 32, 64, 128, 256, auto

Cette option est obsolète, utilisez le paramètre modulation

coderate

coderate aussi appelé FEC

auto

none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto

Note
L’inversion spectrale est fixée à OFF, ceci doit fonctionner pour la plupart des utilisateurs. Merci de contacter si vous avez besoin de changer ce paramètre.

3.5. Paramètres pour la réception ATSC (Câble ou Terrestre)

Nom Description Valeur par défaut Valeurs possibles Commentaires

atsc_modulation

La modulation

vsb8

vsb8, vsb16, qam256, qam64, qamauto

Cette option est obsolète, utilisez le paramètre modulation

Note
VSB 8 est la modulation par défaut pour la plupart des diffuseurs ATSC terrestre.

4. Autres paramètres globaux

4.1. Paramètres divers

Nom Description Valeur par défaut Valeurs possibles Commentaires

show_traffic_interval

Le temps en secondes entre deux affichages du trafic

10

compute_traffic_interval

Le temps en secondes entre deux calculs du trafic

10

dvr_buffer_size

La taille du "tampon DVR" en paquets de 188 octets

20

>=1

Se référer au README

dvr_thread

Est ce que les packets sont reçus par un thread ?

0

0 ou 1

Fonctionnalité "expérimentale", se référer au README

dvr_thread_buffer_size

La taille du tampon pour le thread en packets de 188 octets

5000

>=1

se référer au README

server_id

Le numero de serveur pour les templates %server

0

filename_pid

Permet d’indiquer le chemin dans lequel MuMuDVB va ecrire son PID (Processus IDentifier)

/var/run/mumudvb/mumudvb_adapter%card_tuner%tuner.pid

Les templates %card %tuner et %server sont utilisables

check_cc

Est ce que MuMuDVB compte les discontinuités dans le flux ?

0

Information disponible via le XML ou l’affichage de la force du signal

4.2. Paramètres concernant l’envoi des paquets

Nom Description Valeur par défaut Valeurs possibles Commentaires

dont_send_scrambled

Si positionné à 1, MuMuDVB n’enverra pas les paquets brouillés. Cela retirera (indirectement) les annonces SAP pour les chaînes brouillées

0

filter_transport_error

Si positionné à 1, MuMuDVB n’enverra pas les paquets vus comme erronés par le démodulateur (drapeau transport error).

0

psi_tables_filtering

none les paquets avec des PIDs de 0x00 à 0x1F sont envoyés, pat : les PIDs de 0x01 à 0x1F ne sont pas envoyés. pat_cat : les PIDs de 0x02 à 0x1F ne sont pas envoyés.

none

Option pour garder seulement les PID PSI obligatoires

rewrite_pat

Est ce que MuMuDVB doit réécrire le PID PAT

0

0 ou 1

cf README

rewrite_sdt

Est ce que MuMuDVB doit réécrire le PID SDT

0

0 ou 1

cf README

sort_eit

Est ce que MuMuDVB doit trier les PID EIT

0

0 ou 1

cf README

rtp_header

Envoie les en-têtes RTP avec le flux (excepté pour l’unicast HTTP)

0

0 ou 1

4.3. Paramètres concernant les logs

Nom Description Valeur par défaut Valeurs possibles Commentaires

log_header

Specifie l’en tête des logs

%priority: %module

Vous pouvez utiliser les templates %priority %module %timeepoch %date %pid

log_flush_interval

L’intervalle (en secondes) pour forcer l'écriture des fichies de logs

-1 : pas de forcage periodique

log_type

Où les logs vont aller

Si cette option et log_file ne sont pas specifies, syslog si MuMuDVB tourne en démon, console sinon

syslog, console

La premiere fois que vous spécifiez une méthode pour les logs, elle remplace la meéthode par défaut. Ensuite, chaque méthode est ajoutée a la précédente.

log_file

Le fichier ou les logs seront écris

pas de fichier de log

Les templates suivants peuvent être utilisés : %card %tuner %server

4.4. Paramètres concernant le multicast

Nom Description Valeur par défaut Valeurs possibles Commentaires

multicast

Est ce que le multicast est activé ? Obsolète, utilisez multicast_ipv4 à la place

1

0 ou 1

multicast_ipv4

Est ce que le multicast IPv4 est activé ?

1

0 ou 1

multicast_ipv6

Est ce que le multicast IPv6 est activé ?

0

0 ou 1

multicast_iface4

L’interface résau pour envoyer les paquets multicast IPv4

vide (laisse le système choisir)

multicast_iface6

L’interface résau pour envoyer les paquets multicast IPv6

vide (laisse le système choisir)

common_port

Le port par défaut pour la diffusion multicast

1234

multicast_ttl

Le TTL multicast

2

multicast_auto_join

Si positionné à 1 MuMuDVB joindra automatiquement tous les groupes multicast créés

0

0 or 1

cf problèmes connus dans le README

4.5. Paramètres concernant le support des cartes CAM

Nom Description Valeur par défaut Valeurs possibles Commentaires

cam_support

Indique si l’on veux le support pour les chaînes brouillées

0

0 ou 1

cam_number

Le numéro du module CAM que l’on veux utiliser

0

Dans le cas ou vouz avez plusieurs modules CAM sur une carte DVB

cam_reset_interval

Le temps (en secondes) que MuMuDVB attends pour que la CAM soit initialisée. Après ce délai, MuMuDVB tentera de réinitialiser le module CAM.

30

Si la réinitialisation échoue, MuMuDVB retentera de réinitialiser le module après cet intervelle de temps. Le nombre maximum de tentatives de réinitialisations avant de quitter est 5.

cam_delay_pmt_send

The time (in seconds) we wait between the initialization of the CAM and the sending of the first PMT This behavior is made for some "cray" CAMs like powercam v4 which doesn’t accept the PMT just after the ca_info\ _callback

0

Normally this time doesn’t have to be changed.

cam_interval_pmt_send

The time (in seconds) we wait between possible updates to the PMT sent to the CAM

3

Normally this time doesn’t have to be changed.

4.6. Paramètres pour l’autoconfiguration

Nom Description Valeur par défaut Valeurs possibles Commentaires

autoconfiguration

autoconfiguration 1, partial: Trouve les PIDs audio et video, 2, full: autoconfiguration complète

0

0, 1, 2, partial ou full

Se référer au README pour plus de détails

autoconf_ip_header

Pour l’autoconfiguration complète, la première partie de l’ip des chaînes diffusées

Option obsolète, utilisez autoconf_ip4 à la place

autoconf_ip4

Pour l’autoconfiguration complète, le modèle pour l’ipv4 de la chaîne diffusée

239.100.%card.%number

Vous pouvez utiliser les mot clefs %card, %tuner, %number et %server

autoconf_ip6

Pour l’autoconfiguration complète, le modèle pour l’ipv6 de la chaîne diffusée

FF15:4242::%server:%card:%number

Vous pouvez utiliser les mot clefs %card, %tuner, %number et %server

autoconf_radios

Lors de l’autoconfiguration complète, est ce que les radios seront diffusées ?

0

0 ou 1

autoconf_scrambled

Lors de l’autoconfiguration complète, est ce que les chaînes brouillées seront diffusées ?

0

0 or 1

Automatique lorsque cam_support=1. Parfois, une chaîne en clair peut être marquée comme étant cryptée. Cette option est aussi nécessaire lorsqu’une softcam est utilisée.

autoconf_pid_update

Est ce que MuMuDVB se reconfigure lorsque le PMT est mis à jour ?

1

0 or 1

autoconf_unicast_start_port

Le port unicast pour la première chaine découverte

Voir README-fr pour plus de détails.

autoconf_unicast_port

Le port unicast pour chaque chaine. Ex "2000+%number" (autoconfiguration complète)

Vous pouvez utiliser des expressions contenant + * %card, %tuner et %number. Ex : autoconf_unicast_port=2000+100*%card+%number

autoconf_sid_list

Pour ne pas autoconfigurer toutes les chaînes du transpondeur en autoconfiguration complète, spécifiez avec cette option la liste des service id (numeros de programme) des chaînes que vous voulez configurer

vide

autoconf_name_template

Le modèle pour le nom des chaînes en autoconfiguration complète, ex %number-%name

vide

Voir README-fr pour plus de détails.

4.7. Paramètres concernant les annonces SAP

Nom Description Valeur par défaut Valeurs possibles Commentaires

sap

Génération des annonces SAP

0 (1 si autoconfiguration complète)

0 or 1

sap_organisation

Champ "organisation" envoyé avec les annonces SAP

MuMuDVB

Optionnel

sap_uri

Champ "URI" envoyé avec les annonces SAP

Optionnel

sap_sending_ip

L’IP d’envoi des annonces SAP

0.0.0.0

Optionnel, non détecté automatiquement

sap_interval

Intervalle en secondes entre les annonces SAP

5

entiers positifs

sap_default_group

Le groupe de liste de lecture par défaut pour les annonces SAP

Optionnel. Vous pouvez utiliser le mot clef %type, voir le README-fr pour plus de détails

sap_ttl

Le TTL pour les paquets SAP multicast

255

RFC 2974 : "SAP announcements … SHOULD be sent with an IP time-to-live of 255 (the use of TTL scoping for multicast is discouraged [RFC 2365])."

4.8. Paramètres concernant l’unicast HTTP

Nom Description Valeur par défaut Commentaires

unicast

Utilisez cette option pour activer l’unicast HTTP

0

se référer au README pour plus de détails

ip_http

L’ip d'écoute du serveur unicast. Si vous voulez écouter sur toutes les interfaces mettez 0.0.0.0

0.0.0.0

se référer au README pour plus de détails.

port_http

Le port d'écoute pour l’unicast HTTP

4242

Vous pouvez utiliser des expressions mathématiques contenant des entiers, * et +. Vous pouvez utiliser les mots clefs %card, %tuner et %server. Ex port_http=2000+%card*100

unicast_consecutive_errors_timeout

Le délai pour déconnecter un client qui ne réponds pas

5

Un client sera déconnecté si aucune donnée n’a été envoyée avec succès durant cet intervalle. Une valeur 0 désactive cette fonctionnalité (déconseillé).

unicast_max_clients

Limite sur le nombre de clients simultanés

0

0 : pas de limite.

unicast_queue_size

La taille maximum du tampon utilisé lorsque l'écriture pour un client échoue.

512k octets

en octets.

5. Paramètres concernant les chaînes

Chaque définition de chaîne commence par une ligne ip= ou channel_next. Le seul autre paramètre obligatoire est le paramètre name.

Concernant les PIDs, référez vous à la section obtenir les PIDs.

Nom Description Valeur par défaut Commentaires

ip

Adresse ipv4 multicast sur laquelle la chaîne sera diffusée

Optionnel si multicast=0 (si non utilisé, channel_next doit être utilisé à la place)

ip6

Adresse ipv6 multicast sur laquelle la chaîne sera diffusée

Optionnel si multicast=0

port

Le port

1234 ou common_port

Les ports inférieurs à 1024 nécessitent les droits root.

unicast_port

Le port pour l’unicast HTTP ( associé à cette chaîne )

Les ports inférieurs à 1024 nécessitent les droits root. Vous devez activer l’unicast HTTP avec l’option ip_http

sap_group

Le groupe de liste de lecture pour les annonces SAP

optionnel

cam_pmt_pid

Uniquement pour les chaînes brouillées. Le PID PMT pour le module CAM

service_id

Le "service id" (appelé aussi "program number"), uniquement pour l’autoconfiguration ou la réécriture du PID PAT ou SDT, se référer au README pour plus de détails

name

Le nom de la chaîne. Sera utilisé pour /var/run/mumudvb/channels_streamed_adapter%d_tuner%d, les journaux et les annonces SAP

Obligatoire

pids

La liste des PIDs, séparés par des espaces.

Certains PIDs sont systématiquement envoyés (PAT CAT EIT SDT TDT NIT).

6. Obtenir les PIDs

La manière la plus simple est d’utiliser l’autoconfiguration et de modifier le fichier de configuration généré : /var/run/mumudvb/mumudvb_generated_conf_card%d_tuner%d

6.1. Vous utilisez l’autoconfiguration

Si vous utilisez l’autoconfiguration complète, vous n’avez à spécifier aucune chaîne et vous n’avez besoin de spécifier aucun PID, cette section ne vous concerne donc pas.

Si vous utilisez l’autoconfiguration partielle, vous aurez besoin du PID PMT pour chaque chaîne, lisez la suite pour savoir comment l’obtenir.

6.2. Vous n’utilisez pas l’autoconfiguration

Si vous n’utilisez pas l’autoconfiguration, vous devez obtenir les PIDs (Program Identifier) pour chaque chaîne.

Pour chaque chaîne, il est conseillé de spécifier au minimum :

  • Un PID vidéo (sauf pour les radios)

  • Un PID audio

  • Le PID PMT

  • Le PID PCR (si différent du PID audio/video)

Si vous n’avez pas accès aux PIDs via un site web comme King Of Sat, la manière la plus facile pour les obtenir est d’utiliser les dvb-apps de linuxtv ou w_scan.

Si vous ne savez pas sur quelle fréquence accorder votre carte ou les chaînes que vous pouvez recevoir, vous pouvez utiliser w_scan ou scan (des dvb-apps) si vous avez un fichier d’accord initial (généralement fourni avec la documentation de scan).

6.2.1. Utiliser w_scan pour obtenir un fichier d’accord initial

Note
w_scan fonctionne uniquement pour la réception terrestre, câblée, ATSC et satellite.

Vous pouvez obtenir w_scan à partir du site web de w_scan : Allemand or Traduction Anglaise

w_scan a un inconvénient comparé au programme scan de dvb-apps : w_scan prends ( habituellement ) plus de temps. Mais w_scan a plusieurs avantages : pas besoin de fichier de fréquence initial, autodétection de la carte et recherche de chaîne plus "profonde".

Un fois que vous l’avez compilé (facultatif pour x86), lancez le avec les options nécessaires (country est obligatoire pour la réception terrestre et cable. Pour le DVB-S/S2 vous devez spécifier le satellite)

Note
Options principales de w_scan
        -f type frontend type
                What programs do you want to search for?
                a = atsc (vsb/qam)
                c = cable
                s = sat
                t = terrestrian [default]
        -c      choose your country here:
                        DE, GB, US, AU, ..
                        ? for list
        -s      choose your satellite here:
                        S19E2, S13E0, S15W0, ..
                        ? for list

Pour plus d’informations consultez l’aide de w_scan.

Vous obtiendrez une liste des chaînes disponibles. Le format de cette liste est décrit ici

Si vous voulez utiliser l’autoconfiguration complète, cette liste contient toutes les informations nécessaires. Par exemple, la seconde colonne est la fréquence.

6.2.2. Utiliser scan avec un fichier d’accord initial

Note
En réception satellite, ceci vous permet de trouver toutes les fréquences (si le diffuseur suit la norme). En effet chaque transpondeur annonce les autres.

Si vous ne savez pas ou trouver les fichiers d’accord initiaux, les versions récentes donnent une liste des fichiers installés par défaut lorsque scan est convoqué sans arguments.

Dans la suite vous aurez besoin de l’utilitaire scan des dvb-apps.

Tapez :

scan -o pids cheminversvotrefichierdaccordinitial

Vous allez d’abord obtenir des blocs comme :

>>> tune to: 514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE
0x0000 0x7850: pmt_pid 0x0110 Barcelona TV -- Barcelona TV (running)
0x0000 0x7851: pmt_pid 0x0710 COM Radio -- COM Radio (running)
0x0000 0x7855: pmt_pid 0x0210 TV L'Hospitalet -- TV L'Hospitalet (running)
0x0000 0x7856: pmt_pid 0x0510 Radio Hospitalet -- Radio Hospitalet (running)
0x0000 0x785a: pmt_pid 0x0310 Televisio Badalona -- Televisio Badalona (running)
0x0000 0x785b: pmt_pid 0x0610 Radio Ciutat Badalona -- Radio Ciutat Badal

Vous avez maintenant accès au PID PMT (en hexadecimal), vous pouvez le convertir en décimal et utiliser l’autoconfiguration partielle.

Après ces blocs vous obtiendrez des lignes comme :

Sensacio FM              (0x273f) 02: PCR == A            A 0x0701
urBe TV                  (0x7864) 01: PCR == V   V 0x0300 A 0x0301 (cat)
Canal Catala Barcelona   (0x7869) 01: PCR == V   V 0x0200 A 0x0201 (cat)
25 TV                    (0x786e) 01: PCR == V   V 0x0400 A 0x0401 (spa) TT 0x0402
ONDA RAMBLA PUNTO RADIO  (0x786f) 02: PCR == A            A 0x0601 (cat)
Localia                  (0x7873) 01: PCR == V   V 0x0100 A 0x0101
ONA FM                   (0x7874) 02: PCR == A            A 0x0501
TV3                      (0x0321) 01: PCR == V   V 0x006f A 0x0070 (cat) 0x0072 (vo) 0x0074 (ad) TT 0x0071 AC3 0x0073 SUB 0x032b

Vouz avez maintenant accès aux autres PIDs.

MuMuDVB a besoin des PIDs en décimal, vous avez donc a faire la conversion Hexadécimal→décimal.

6.2.3. Scanner seulement un transpondeur

Vous devez d’abord accorder votre carte sur la fréquence désirée ( avec, par exemple, tune, szap ou tzap ).

Ensuite vous pouvez utiliser l’utilitaire scan :

scan -o pids -c -a 0

Où 0 doit être remplacé par le numéro de carte

Et vous obtiendrez des résultats similaires a ceux présentés dans la section utiliser scan avec un fichier d’accord initial


mumudvb-1.7.1/doc/html/README_CONF.html000066400000000000000000002302021177353207000173440ustar00rootroot00000000000000 MuMuDVB - README for the configuration file

1. General behavior

MuMuDVB needs a configuration file in order to run properly.

The order of the parameters is most of the times not relevant.

You can put comments everywhere in the configuration file: just start the line with #. In line comments are not allowed i.e. port=1234 #The multicast port is not a valid line.

All parameters are in the form: name=value

Example
#The tuning frequency
freq=11987

The configuration file contains two parts

1.1. Common part

This is the first part of the configuration file, it contains the parameters needed for tuning the DVB card and the global parameters.

See the tuning section for the list of parameters used to tune the card. and other global parameters section for parameters like autoconfiguration, cam support etc …

1.2. Channels part

If you are not using full autoconfiguration you need to set the list of the channels you want to stream. Each channel start with an ip= or channel_next line.

Example (unicast only)
channel_next
name=Barcelona TV
unicast_port=8090
pids=272
Example
ip=239.100.0.0
port=1234
name=Barcelona TV
pids=272 256 257 258

See channel parameters section for a list of detailled parameters.

2. Example config files

You can find documented examples in the directory doc/configuration_examples

3. Parameters concerning the tuning of the card

Note
You can use w_scan to see the channels you can receive see w_scan section. Otherwise you can have a look at the initial tuning files given with linuxtv’s dvb-apps. For european satellite users, you can have a look at King Of Sat

3.1. Parameters concerning all modes (terrestrial, satellite, cable, ATSC)

In the following list, only the parameter freq is mandatory

Parameter name Description Default value Comments

freq

transponder’s frequency in MHz

Mandatory

modulation

The kind of modulation used (can be : QPSK QAM16 QAM32 QAM64 QAM128 QAM256 QAMAUTO VSB8 VSB16 8PSK 16APSK 32APSK DQPSK)

ATSC: VSB_8, cable/terrestrial: QAM_AUTO, satellite: QPSK

Optionnal most of the times

delivery_system

the delivery system used (can be DVBT DVBT2 DVBS DVBS2 DVBC_ANNEX_AC DVBC_ANNEX_B ATSC)

Undefined

Set it if you want to use the new tuning API (DVB API 5/S2API). Mandatory for DVB-S2 and DVB-T2

card

The DVB/ATSC card number

0

only limited by your OS

tuner

The tuner number

0

If you have a card with multiple tuners (ie there is several frontend* in /dev/dvb/adapter%d)

card_dev_path

The path of the DVB card devices. Use it if you have a personalised path like /dev/dvb/card_astra

/dev/dvb/adapter%d

tuning_timeout

tuning timeout in seconds.

300

0 = no timeout

timeout_no_diff

If no channels are streamed, MuMuDVB will kill himself after this time (specified in seconds)

600

0 = infinite timeout

check_status

Do we check the card status and display a message if lock is lost

1

0 = no check.

3.2. Parameters specific to satellite

Parameter name Description Default value Possible values Comments

pol

transponder’s polarisation. One char. v (vertical), h (horizontal), l (left circular), r (right circular)

h, H, v, V, l, L, r or R

Mandatory

srate

transponder’s symbol rate

Mandatory

lnb_type

The LNB type

universal

universal, standard

Universal : two local oscilators. Standard : one local oscillator.Most of the LNBs are universal.

lnb_lof_standard

The frequency of the LNB’s local oscillator when lnb_type=standard

10750

In MHz, see below.

lnb_slof

The switching frequency frequency of the LNB (define the two bands). Valid when lnb_type=universal

11700

In MHz, see below.

lnb_lof_low

The frequency of the LNB’s local oscillator for the low band. Valid when lnb_type=universal

9750

In MHz, see below.

lnb_lof_high

The frequency of the LNB’s local oscillator for the high band. Valid when lnb_type=universal

10600

In MHz, see below.

sat_number

The satellite number in case you have multiples lnb, no effect if 0 (only 22kHz tone and 13/18V), send a diseqc message if non 0

0

1 to 4

If you have equipment which support more, please contact

switch_type

The DiSEqC switch type: Committed or Uncommitted

C

C, c, U or U

lnb_voltage_off

Force the LNB voltage to be 0V (instead of 13V or 18V). This is useful when your LNB have it’s own power supply.

0

0 or 1

coderate

coderate, also called FEC

auto

none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto

rolloff

rolloff important only for DVB-S2

35

35, 20, 25, auto

The default value should work most of the times

3.2.1. Local oscillator frequencies :

  • S-Band 3650 MHz

  • C band (Hi) 5950 MHz

  • C band (Lo) 5150 MHz

  • Ku Band : this is the default band for MuMuDVB, you don’t have to set the LO frequency. For information : Hi band : 10600, Low band : 9750, Single : 10750

3.3. Parameters specific to terrestrial (DVB-T)

Note
auto usually works fine for all the parameters except bandwidth
Parameter name Description Default value Possible values

bandwidth

bandwidth

8MHz

8MHz, 7MHz, 6MHz, auto (DVB-T2: 5MHz, 10MHz, 1.712MHz)

trans_mode

transmission mode

auto

2k, 8k, auto (DVB-T2: 4k, 16k, 32k)

guardinterval

guard interval

auto

1/32, 1/16, 1/8, 1/4, auto (DVB-T2 : 1/128, 19/128, 19/256)

coderate

coderate, also called FEC

auto

none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto

3.4. Parameters specific to cable (DVB-C)

Parameter name Description Default value Possible values Comments

srate

transponder’s symbol rate

Mandatory

qam

quadrature amplitude modulation

auto

qpsk, 16, 32, 64, 128, 256, auto

This option is obsolete, use modulation instead

coderate

coderate, also called FEC

auto

none, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, auto

Note
The spectral inversion is fixed to OFF, it should work for most of the people, if you need to change this parameter, please contact.

3.5. Parameters specific to ATSC (Cable or Terrestrial)

Parameter name Description Default value Possible values Comments

atsc_modulation

the modulation for ATSC

vsb8

vsb8, vsb16, qam256, qam64, qamauto

This option is obsolete, use modulation instead

Note
VSB 8 is the default modulation for most of the terrestrial ATSC transmission

4. Other global parameters

4.1. Various parameters

Parameter name Description Default value Possible values Comments

show_traffic_interval

the interval in second between two displays of the traffic

10

compute_traffic_interval

the interval in second between two computations of the traffic

10

dvr_buffer_size

The size of the "DVR buffer" in packets

20

>=1

see README

dvr_thread

Are the packets retrieved from the card in a thread

0

0 or 1

Experimental, see README

dvr_thread_buffer_size

The size of the "DVR thread buffer" in packets

5000

>=1

see README

server_id

The server number for the %server template

0

Useful only if you use the %server template

filename_pid

Specify where MuMuDVB will write it’s PID (Processus IDentifier)

/var/run/mumudvb/mumudvb_adapter%card_tuner%tuner.pid

the templates %card %tuner and %server are allowed

check_cc

Do MuMuDVB check the discontibuities in the stream ?

0

Displayed via the XML status pages or the signal display

4.2. Packets sending parameters

Parameter name Description Default value Possible values Comments

dont_send_scrambled

If set to 1 don’t send the packets detected as scrambled. this will also remove indirectly the sap announces for the scrambled channels

0

filter_transport_error

If set to 1 don’t send the packets tagged with errors by the demodulator.

0

psi_tables_filtering

If set to pat, TS packets with PID from 0x01 to 0x1F are discarded. If set to pat_cat, TS packets with PID from 0x02 to 0x1F are discarded.

none

Option to keep only mandatory PSI PID

rewrite_pat

Do we rewrite the PAT PID

0

0 or 1

See README

rewrite_sdt

Do we rewrite the SDT PID

0

0 or 1

See README

sort_eit

Do we sort the EIT PID

0

0 or 1

See README

sdt_force_eit

Do we force the EIT_schedule_flag and EIT_present_following_flag in SDT

0

0 or 1

Let to 0 if you don’t understand

rtp_header

Send the stream with the rtp headers (execpt for HTTP unicast)

0

0 or 1

4.3. Logs parameters

Parameter name Description Default value Possible values Comments

log_header

specify the logging header

%priority: %module

The implemented templates are %priority %module %timeepoch %date %pid

log_flush_interval

LogFile flushing interval (in seconds)

-1 : no periodic flushing

log_type

Where the log information will go

If neither this option and logfile are specified syslog if deamon, console otherwise

syslog, console

The first time you specify a logging way, it replaces the default one. Then, each time you sepcify a logging channel, it is added to the previous

log_file

The file in wich the logs will be written to

no file log

The following templates are allowed %card %tuner %server

4.4. Multicast parameters

Parameter name Description Default value Possible values Comments

multicast

Do we activate multicast, deprecated, use multicast_ipv4 instead

1

0 or 1

multicast_ipv4

Do we activate IPv4 multicast

1

0 or 1

multicast_ipv6

Do we activate IPv6 multicast

0

0 or 1

multicast_iface4

The network interface to send IPv4 multicast packets

empty (let the system choose)

multicast_iface6

The network interface to send IPv6 multicast packets

empty (let the system choose)

common_port

Default port for the streaming

1234

multicast_ttl

The multicast Time To Live

2

multicast_auto_join

Set to 1 if you want MuMuDVB to join automatically the multicast groups

0

0 or 1

See known problems in the README

4.5. CAM support parameters

Parameter name Description Default value Possible values Comments

cam_support

Specify if we wants the support for scrambled channels

0

0 or 1

cam_number

the number of the CAM we want to use

0

In case you have multiple CAMs on one DVB card

cam_reset_interval

The time (in seconds) we wait for the CAM to be initialised before resetting it.

30

If the reset is not successful, MuMuDVB will reset the CAM again after this interval. The maximum number of resets before exiting is 5

cam_delay_pmt_send

The time (in seconds) we wait between the initialization of the CAM and the sending of the first PMT This behavior is made for some "cray" CAMs like powercam v4 which doesn’t accept the PMT just after the ca_info\ _callback

0

Normally this time doesn’t have to be changed.

cam_interval_pmt_send

The time (in seconds) we wait between possible updates to the PMT sent to the CAM

3

Normally this time doesn’t have to be changed.

4.6. Autoconfiguration parameters

Parameter name Description Default value Possible values Comments

autoconfiguration

autoconfiguration 1, partial: find audio and video PIDs, 2, full: full autoconfiguration

0

0, 1, 2, partial or full

see the README for more details

autoconf_ip_header

For full autoconfiguration, the first part of the ip for streamed channel

obsolete, use autoconf_ip4 instead

autoconf_ip4

For full autoconfiguration, the template for the ipv4 for streamed channel

239.100.150+%server*10+%card.%number

You can use expressions with +, * , %card, %tuner, %server and %number

autoconf_ip6

For full autoconfiguration, the template for the ipv6 for streamed channel

FF15:4242::%server:%card:%number

You can use the keywords %card, %tuner, %server and %number

autoconf_radios

Do we consider radios as valid channels during full autoconfiguration ?

0

0 or 1

autoconf_scrambled

Do we consider scrambled channels valid channels during full autoconfiguration ?

0

0 or 1

Automatic when cam_support=1. Sometimes a clear channel can be marked as scrambled. This option allows you to bypass the ckecking.

autoconf_pid_update

Do we follow the changes in the PIDs when the PMT is updated ?

1

0 or 1

autoconf_unicast_start_port

The unicast port for the first discovered channel

autoconf_unicast_start_port=value is equivalent to autoconf_unicast_port=value + %number

autoconf_unicast_port

The unicast port for each discovered channel (autoconf full). Ex "2000+%number"

You can use expressions with + * %card %tuner %server and %number. Ex : autoconf_unicast_port=2000+100*%card+%number

autoconf_multicast_port

The multicast port for each discovered channel (autoconf full). Ex "2000+%number"

You can use expressions with + * %card %tuner %server and %number. Ex : autoconf_unicast_port=2000+100*%card+%number

autoconf_sid_list

If you don’t want to configure all the channels of the transponder in full autoconfiguration mode, specify with this option the list of the service ids of the channels you want to autoconfigure.

empty

autoconf_name_template

The template for the channel name, ex %number-%name

empty

See README for more details

4.7. SAP announces parameters

Parameter name Description Default value Possible values Comments

sap

Generation of SAP announces

0 (1 if full autoconfiguration)

0 or 1

sap_organisation

Organisation field sent in the SAP announces

MuMuDVB

Optionnal

sap_uri

URI field sent in the SAP announces

Optionnal

sap_sending_ip4

The SAP sender IPv4 address

0.0.0.0

Optionnal, not autodetected, if set, enable RFC 4570 SDP Source Filters field

sap_sending_ip6

The SAP sender IPv6 address

::

Optionnal, not autodetected, if set, enable RFC 4570 SDP Source Filters field

sap_interval

Interval in seconds between sap announces

5

positive integers

sap_default_group

The default playlist group for sap announces

string

Optionnal. You can use the keyword %type, see README

sap_ttl

The TTL for the multicast SAP packets

255

The RFC 2974 says "SAP announcements … SHOULD be sent with an IP time-to-live of 255 (the use of TTL scoping for multicast is discouraged [RFC 2365])."

4.8. HTTP unicast parameters

Parameter name Description Default value Comments

unicast

Set this option to one to activate HTTP unicast

0

see the README for more details

ip_http

the listening ip for http unicast, if you want to listen to all interfaces put 0.0.0.0

0.0.0.0

see the README for more details

port_http

The listening port for http unicast

4242

You can use mathematical expressions containing integers, * and +. You can use the %card, %tuner and %server template. Ex port_http=2000+%card*100

unicast_consecutive_errors_timeout

The timeout for disconnecting a client wich is not responding

5

A client will be disconnected if no data have been sucessfully sent during this interval. A value of 0 deactivate the timeout (unadvised).

unicast_max_clients

The limit on the number of connected clients

0

0 : no limit.

unicast_queue_size

The maximum size of the buffering when writting to a client fails

512kBytes

in Bytes.

5. Channel parameters

Each channel start with an ip= or channel_next line. The only other mandatory parameter is the name of the channel.

Concerning the PIDs see the getting the PIDs section

Parameter name Description Default value Possible values Comments

ip

multicast (can also be unicast, in raw UDP ) ipv4 where the chanel will be streamed

Optionnal if you set multicast=0 (if not used you must use channel_next)

ip6

multicast (can also be unicast, in raw UDP ) ipv6 where the chanel will be streamed

Optionnal if you set multicast=0

port

The port

1234 or common_port

Ports below 1024 needs root rights.

unicast_port

The HTTP unicast port for this channel

Ports below 1024 needs root rights. You need to activate HTTP unicast with ip_http

sap_group

The playlist group for SAP announces

string

optionnal

cam_pmt_pid

Only for scrambled channels. The PMT PID for CAM support

service_id

The service id (program number), olny for autoconfiguration, or rewrite (PAT or SDT) see README for more details

name

The name of the channel. Will be used for /var/run/mumudvb/channels_streamed_adapter%d_tuner%d, logging and SAP announces

Mandatory

pids

The PIDs list, separated by spaces

some pids are always sent (PAT CAT EIT SDT TDT NIT), see README for more details

6. Get the PID numbers

The simplest way is to use autoconfiguration and modify the generated configuration file : /var/run/mumudvb/mumudvb_generated_conf_card%d_tuner%d

6.1. You use autoconfiguration

If you use full autoconfiguration, you don’t need to specify any channel and don’t need any PID, this section does not concern you.

If you use partial autoconfiguration, you’ll need the PMT PID for each channel.

6.2. You do not use autoconfiguration

If you don’t use autoconfiguration (see the README), you have to get the PIDs (Program Identifier) for each channel.

For each channel it is advised to specify at least : - One video PID (except for radios) - One audio PID - The PMT PID - The PCR PID (if different from video/audio)

If you don’t have access to the PIDs via a website like King Of Sat, the easiest way is to use linuxtv’s dvb-apps or w_scan.

You don’t know on wich frequency to tune and the channels you can receive. In this case, you can use w_scan or using scan from dvb-apps if you have an initial tuning config file.

6.2.1. Using w_scan to get an initial tuning file

Note
w_scan works for DVB-T, DVB-C, DVB-S/S2 and ATSC.

w_scan have one disavantage over dvb-apps scan: it takes (usually) more time. But it have several advantages: no need for initial tuning file, card autodection and deeper channel search.

Once you compiled it (optionnal for x86), launch it with the options needed (country is mandatory for terrestrial and cable. for DVB-S/S2 you need to specify your satellite)

Note
Here’s the main options for w_scan
        -f type frontend type
                What programs do you want to search for?
                a = atsc (vsb/qam)
                c = cable
                s = sat
                t = terrestrian [default]
        -c      choose your country here:
                        DE, GB, US, AU, ..
                        ? for list
        -s      choose your satellite here:
                        S19E2, S13E0, S15W0, ..
                        ? for list

For more information, see w_scan’s help

Your will get lines channels with the file format described here

If you want to use full autoconfiguration, this contains all the parameters you need. For example the second row is the frequency.

6.2.2. Using scan with an initial tuning file

Note
With satellite this allow you to find all the frequencies (if the broadcaster follow the norm). Because, every transponder announces the others.

If you don’t know where to find the inital tuning file, recent versions of scan give the default locations by calling scan without arguments.

You need scan from linuxtv’s dvb-apps

Type

scan -o pids pathtoyourinitialtuningfile

You’ll first get blocks like

>>> tune to: 514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE
0x0000 0x7850: pmt_pid 0x0110 Barcelona TV -- Barcelona TV (running)
0x0000 0x7851: pmt_pid 0x0710 COM Radio -- COM Radio (running)
0x0000 0x7855: pmt_pid 0x0210 TV L'Hospitalet -- TV L'Hospitalet (running)
0x0000 0x7856: pmt_pid 0x0510 Radio Hospitalet -- Radio Hospitalet (running)
0x0000 0x785a: pmt_pid 0x0310 Televisio Badalona -- Televisio Badalona (running)
0x0000 0x785b: pmt_pid 0x0610 Radio Ciutat Badalona -- Radio Ciutat Badal

You have now acces to the PMT PID (in hexadecimal), you can convert it to decimal and use partial autoconfiguration.

After this blocks, you’ll get lines like

Sensacio FM              (0x273f) 02: PCR == A            A 0x0701
urBe TV                  (0x7864) 01: PCR == V   V 0x0300 A 0x0301 (cat)
Canal Catala Barcelona   (0x7869) 01: PCR == V   V 0x0200 A 0x0201 (cat)
25 TV                    (0x786e) 01: PCR == V   V 0x0400 A 0x0401 (spa) TT 0x0402
ONDA RAMBLA PUNTO RADIO  (0x786f) 02: PCR == A            A 0x0601 (cat)
Localia                  (0x7873) 01: PCR == V   V 0x0100 A 0x0101
ONA FM                   (0x7874) 02: PCR == A            A 0x0501
TV3                      (0x0321) 01: PCR == V   V 0x006f A 0x0070 (cat) 0x0072 (vo) 0x0074 (ad) TT 0x0071 AC3 0x0073 SUB 0x032b

You have now acces to the other PIDs

MuMuDVB wants the PIDs in decimal, so you have to convert the pids from hexadecimal to decimal.

6.2.3. Scan only one transponder

You first have to tune the card on the wanted frequency (with tune, szap or tzap for example).

After you use the scan utility:

scan -o pids -c -a 0

Where 0 is the card number

And you’ll get results like in the section scan with an initial tuning file


mumudvb-1.7.1/doc/html/TRANSCODE_CONF.html000066400000000000000000001116761177353207000177460ustar00rootroot00000000000000 MuMuDVB - README for the configuration of the transcoding

1. General information

Transcoding configuration is per channel

To see the installed codecs on your system you can use the ffmpeg -formats command (see man ffmpeg for more information on this command)

2. Examples

See the examples in the doc/transcode/examples directory

3. Options

3.1. transcode_enable

Type: <int>

Description: enables or disables transcoding

Possible Values: 0 - disable (default); 1 - enable.

3.2. transcode_video_codec

Type: <string>

Description: video codec for encoding

Possible Values: mpeg4 (for MPEG-4), libx264 (for H.264) etc.

3.3. transcode_audio_codec

Type: <string>

Description: audio codec for encoding

Possible Values: libmp3lame (for MP3), libfaac (for AAC) etc.

3.4. transcode_streaming_type

Type: <string>

Description: streaming type

Possible Values:

  • mpegts - for MPEG-2 TS streaming.

  • rtp - for RTP streaming.

  • ffm - FFM feed to ffserver

3.5. transcode_ffm_url

Type: <string>

Description: URL of FFM feed (required for FFM streaming)

3.6. transcode_rtp_port

Type: <int>

Description: base port for RTP streaming

Each RTP stream (audio or video) must go on an even port. Mumudvb will took for each media stream next even port starting from value specified in this option.

3.7. transcode_sdp_filename

Type: <string>

Description: path to generated SDP file (for RTP streaming)

3.8. transcode_video_scale

Type: <float>

Description: factor for video scaling

3.9. transcode_video_frames_per_second

Type: <int>

Description: FPS of output video

3.10. transcode_audio_channels

Type: <int>

Description: number of output audio channels

Common values are: 1 - mono 2 - stereo

3.11. transcode_audio_sample_rate

Type: <int>

Description: output audio sample rate

Common values are: 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350

3.12. transcode_aac_latm

Type: <int>

Description: enable LATM payload type for AAC streams while RTP streaming

Possible Values:

  • 0 - disable (default)

  • 1 - enable

3.13. transcode_aac_profile

Type: <string>

Description: profile in case of AAC audio encoding

Possible Values:

  • low - Low Complexity (LC) - the simplest and most widely used and supported.

  • main - Main Profile (MAIN) - like the LC profile, with the addition of backwards prediction.

  • ssl - Sample-Rate Scalable (SRS) - a.k.a. Scalable Sample Rate (MPEG-4 AAC-SSR).

  • ltp - Long Term Prediction (LTP) - added in the MPEG-4 standard an improvement of the MAIN profile using a forward predictor with lower computational complexity.

3.14. transcode_video_bitrate

Type: <string>

Description: set video bitrate (int bits/s)

Enables target bitrate mode for video. Attempts to reach a specific bitrate. Bitrate mode is generally the worst ratecontrol mode H.264 has.

3.15. transcode_audio_bitrate

Type: <int>

Description: set audio bitrate (int bits/s)

Enables target bitrate mode for audio.

3.16. transcode_x264_profile

Type: <int>

Description: set H.264 encoding profile

Possible Values:

  • baseline - Baseline Profile

  • main - Main Profile

  • high - High Profile

Note
Specify different video encoding options after declaration of transcode_x264_profile may change profile to higher one. For example option "enable_8x8dct=1" will enable 8x8 transform that is supported only by High Profile.

3.17. transcode_level

Type: <int>

Description: set level of encoding

Example values: 10 for level 1.0 11 for level 1.1 12 for level 1.2 20 for level 2.0 21 for level 2.1 30 for level 3.0 etc.

3.18. transcode_x264_partitions

Type: <int>

Description: enables best use of partitions for H.264

Possible Values:

  • 0 - disable

  • 1 - enable

Reccomended default to enable it for H.264.

FFmpeg equivalent: partitions +parti4x4+parti8x8+partp8x8+partb8x8

One of H.264’s most useful features is the ability to choose among many combinations of inter and intra partitions. P-macroblocks can be subdivided into 16x8, 8x16, 8x8, 4x8, 8x4, and 4x4 partitions. B-macroblocks can be divided into 16x8, 8x16, and 8x8 partitions. I-macroblocks can be divided into 4x4 or 8x8 partitions. Analyzing more partition options improves quality at the cost of speed. The default is to analyze all partitions except p4x4 (p8x8, i8x8, i4x4, b8x8), since p4x4 is not particularly useful except at high bitrates and lower resolutions. Note that i8x8 requires 8x8dct, and is therefore a High Profile-only partition. p8x8 is the most costly, speed-wise, of the partitions, but also gives the most benefit. Generally, whenever possible, all partition types except p4x4 should be used.

3.19. transcode_loop_filter

Type: <int>

Description: enables loop filter

Possible Values:

  • 0 - disable

  • 1 - enable

Reccomended default to enable it for H.264.

3.20. transcode_mixed_refs

Type: <int>

Description: one reference per partition, as opposed to one reference per macroblock

Possible Values:

  • 0 - disable

  • 1 - enable

H.264 allows p8x8 blocks to select different references for each p8x8 block. This option allows this analysis to be done, and boosts quality with little speed impact. It should generally be used, though it obviously has no effect with only one reference frame.

3.21. enable_8x8dct

Type: <int>

Description: high profile 8x8 transform (H.264)

Possible Values:

  • 0 - disable

  • 1 - enable

Gives a notable quality boost by allowing x264 to choose between 8x8 and 4x4 frequency transform size. Required for i8x8 partitions. Speed cost for this option is near-zero both for encoding and decoding; the only reason to disable it is when one needs support on a device not compatible with High Profile.

3.22. transcode_gop

Type: <int>

Description: set the group of picture size

Keyframe interval, also known as GOP length. This determines the maximum distance between I-frames. Very high GOP lengths will result in slightly more efficient compression, but will make seeking in the video somewhat more difficult. For H.264 recommended default: 250.

3.23. transcode_b_frames

Type: <int>

Description: use frames B frames

B-frames are a core element of H.264 and are more efficient in H.264 than any previous standard. Some specific targets, such as HD-DVD and Blu-Ray, have limitations on the number of consecutive B-frames. Most, however, do not; as a result, there is rarely any negative effect to setting this to the maximum (16) since x264 will, if B-adapt is used, automatically choose the best number of B-frames anyways. This parameter simply serves to limit the max number of B-frames. Note that Baseline Profile, such as that used by iPods, does not support B-frames. Recommended default for H.264: 16.

3.24. transcode_mbd

Type: <int>

Description: macroblock decision algorithm (high quality mode)

Possible Values:

  • 0 - simple - use mbcmp (default)

  • 1 - bits - use fewest bits

  • 2 - rd - use best rate distortion

FIXME enables high quality mode for MPEG-4 compression.

3.25. transcode_cmp

Type: <int>

Description: full pel me compare function

Possible Values:

  • 0 - sad - sum of absolute differences, fast (default)

  • 1 - sse - sum of squared errors

  • 2 - satd - sum of absolute Hadamard transformed differences

  • 3 - dct - sum of absolute DCT transformed differences

  • 4 - psnr - sum of squared quantization errors (avoid, low quality)

  • 5 - bit - number of bits needed for the block

  • 6 - rd - rate distortion optimal, slow

  • 7 - zero - 0

  • 8 - vsad - sum of absolute vertical differences

  • 9 - vsse - sum of squared vertical differences

  • 10 - nsse - noise preserving sum of squared differences

  • 11 - w53 - 5/3 wavelet, only used in snow

  • 12 - w97 - 9/7 wavelet, only used in snow

  • 13 - dctmax -

  • 14 - dct264 -

  • 256 - chroma -

FIXME Used in MPEG-4 compression

3.26. transcode_subcmp

Type: <int>

Description: sub pel me compare function

Possible Values:

  • 0 - sad - sum of absolute differences, fast (default)

  • 1 - sse - sum of squared errors

  • 2 - satd - sum of absolute Hadamard transformed differences

  • 3 - dct - sum of absolute DCT transformed differences

  • 4 - psnr - sum of squared quantization errors (avoid, low quality)

  • 5 - bit - number of bits needed for the block

  • 6 - rd - rate distortion optimal, slow

  • 7 - zero - 0

  • 8 - vsad - sum of absolute vertical differences

  • 9 - vsse - sum of squared vertical differences

  • 10 - nsse - noise preserving sum of squared differences

  • 11 - w53 - 5/3 wavelet, only used in snow

  • 12 - w97 - 9/7 wavelet, only used in snow

  • 13 - dctmax -

  • 14 - dct264 -

  • 256 - chroma -

FIXME Used in MPEG-4 compression

3.27. transcode_crf

Type: <float>

Description: enables constant quality mode, and selects the quality (H.264 only)

Constant quality mode (also known as constant ratefactor). Bitrate corresponds approximately to that of constant quantizer, but gives better quality overall at little speed cost. The best one-pass option in H.264.

3.28. transcode_refs

Type: <int>

Description: reference frames to consider for motion compensation (H.264 only)

One of H.264’s most useful features is the abillity to reference frames other than the one immediately prior to the current frame. This parameter lets one specify how many references can be used, through a maximum of 16. Increasing the number of refs increases the DPB (Decoded Picture Buffer) requirement, which means hardware playback devices will often have strict limits to the number of refs they can handle. In live-action sources, more reference have limited use beyond 4-8, but in cartoon sources up to the maximum value of 16 is often useful. More reference frames require more processing power because every frame is searched by the motion search (except when an early skip decision is made). The slowdown is especially apparent with slower motion estimation methods. Recommended default for H.264: 6.

3.29. transcode_b_strategy

Type: <int>

Description: strategy to choose between I/P/B-frames

libx264, by default, adaptively decides through a low-resolution lookahead the best number of B-frames to use. It is possible to disable this adaptivity; this is not recommended. Recommended default for H.264: 1 0: Very fast, but not recommended. Does not work with pre-scenecut (scenecut must be off to force off b-adapt). 1: Fast, default mode in libx264. A good balance between speed and quality. 2: A much slower but more accurate B-frame decision mode that correctly detects fades and generally gives considerably better quality. Its speed gets considerably slower at high bframes values, so its recommended to keep bframes relatively low (perhaps around 3) when using this option. It also may slow down the first pass of libx264 when in threaded mode.

3.30. transcode_coder_type

Type: <int>

Possible Values:

  • 0 = vlc variable length coder / huffman coder

  • 1 = ac/CABAC arithmetic coder

  • 2 = raw raw (no encoding)

  • 3 = rle run-length coder

  • 4 = deflate deflate-based coder

CABAC is the default entropy encoder used by x264. Though somewhat slower on both the decoding and encoding end, it offers 10-15% improved compression on live-action sources and considerably higher improvements on animated sources, especially at low bitrates. It is also required for the use of trellis quantization. Disabling CABAC may somewhat improve decoding performance, especially at high bitrates. CABAC is not allowed in Baseline Profile.

3.31. transcode_me_method

Type: <int>

Description: set motion estimation method

Possible Values:

  • 1 - zero - zero motion estimation (fastest)

  • 2 - full/esa - full motion estimation (slowest)

  • 3 - log - log motion estimation

  • 4 - phods - phods motion estimation

  • 5 - epzs/dia - EPZS motion estimation (default)

  • 6 - x1 - X1 motion estimation

  • 7 - hex - hex motion estimation (x264 specific)

  • 8 - umh - umh motion estimation (x264 specific)

  • 9 - iter - iter motion estimation (snow specific)

  • 10 - tesa - tesa motion estimation (x264 specific)

One of the most important settings for x264, both speed and quality-wise.

epzs - is the simplest search, consisting of starting at the best predictor, checking the motion vectors at one pixel upwards, left, down, and to the right, picking the best, and repeating the process until it no longer finds any better motion vector.

hex - consists of a similar strategy, except it uses a range-2 search of 6 surrounding points, thus the name. It is considerably more efficient than DIA and hardly any slower, and therefore makes a good choice for general-use encoding.

umh - is considerably slower than HEX, but searches a complex multi-hexagon pattern in order to avoid missing harder-to-find motion vectors. Unlike HEX and DIA, the merange parameter directly controls UMH’s search radius, allowing one to increase or decrease the size of the wide search.

full - is a highly optimized intelligent search of the entire motion search space within merange of the best predictor. It is mathematically equivalent to the bruteforce method of searching every single motion vector in that area, though faster. However, it is still considerably slower than UMH, with not too much benefit, so is not particularly useful for everyday encoding.

3.32. transcode_me_range

Type: <int>

Description: limit motion vectors range

MErange controls the max range of the motion search. For HEX and DIA, this is clamped to between 4 and 16, with a recommended of 16. For UMH and ESA, it can be increased beyond the 16 to allow for a wider-range motion search, which is useful on HD footage and for high-motion footage. Note that for UMH and ESA, increasing MErange will significantly slow down encoding.

3.33. transcode_subq

Type: <int>

Description: sub pel motion estimation quality

An extremely important encoding parameter for H.264 which determines what algorithms are used for both subpixel motion searching and partition decision.

1: Fastest, but extremely low quality. Should be avoided except on first pass encoding. 2-5: Progressively better and slower, 5 serves as a good medium for higher speed encoding. 6-7: 6 is the default. Activates rate-distortion optimization for partition decision. This can considerably improve efficiency, though it has a notable speed cost. 6 activates it in I/P frames, and subme7 activates it in B frames. 8-9: Activates rate-distortion refinement, which uses RDO to refine both motion vectors and intra prediction modes. Slower than subme 6, but again, more efficient.

3.34. transcode_trellis

Type: <int>

Description: rate-distortion optimal quantization

Possible Values:

  • 0 - disabled

  • 1 - enabled only on the final encode of a MB

  • 2 - enabled on all mode decisions

The main decision made in quantization is which coefficients to round up and which to round down. Trellis chooses the optimal rounding choices for the maximum rate-distortion score, to maximize PSNR relative to bitrate. This generally increases quality relative to bitrate by about 5% for a somewhat small speed cost. It should generally be enabled. Note that trellis requires CABAC.

3.35. transcode_sc_threshold

Type: <int>

Description: scene change threshold

Adjusts the sensitivity of x264’s scenecut detection. Rarely needs to be adjusted. Recommended default for H.264: 40.

3.36. transcode_rc_eq

Type: <string>

Description: set rate control equation

Ratecontrol equation. Recommended default for H.264: blurCplx^(1-qComp).

3.37. transcode_qcomp

Type: <float>

Description: video quantizer scale compression

QP curve compression: 0.0 ⇒ CBR, 1.0 ⇒ CQP. Recommended default for H.264: 0.60.

3.38. transcode_qmin

Type: <int>

Description: min video quantizer scale

Minimum quantizer. Recommended default for H.264: 10.

3.39. transcode_qmax

Type: <int>

Description: max video quantizer scale

Maximum quantizer. Recommended default for H.264: 51.

3.40. transcode_qdiff

Type: <int>

Description: max difference between the quantizer scale

Set max QP step. Recommended default: 4.

3.41. transcode_keyint_min

Type: <int>

Description: key interval

mumudvb-1.7.1/doc/html/WEBSERVICES.html000066400000000000000000000622521177353207000173730ustar00rootroot00000000000000 Webservices

To activate the webservices, just enable the unicast mode with something like that:

unicast=1         : Activate the internal webserver
ip_http=127.0.0.1 : IP address for accepting the HTTP requests
port_http=8005    : Listening port

The webservices responses are not SOAP compliant, but formatted in simple XML documents (UTF-8). The output can be easily parsed in PHP for example.

1. Status monitoring :

There is no input parameters. URL : http://ip_http:port_http/monitor/state.xml

Example of response with comments:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mumudvb card="5" frontend="0">                                          => adapter and frontend devices
        <global_version><![CDATA[1.6.1b_20101101]]></global_version>         => MuMuDVB version
        <global_pid>19574</global_pid>                                       => process PID
        <global_uptime>45</global_uptime>                                    => process uptime in seconds
        <frontend_name><![CDATA[ST STV0299 DVB-S]]></frontend_name>          => frontend name
        <frontend_tuned>1</frontend_tuned>                                   => 0 if adapter not tuned, 1 if adapter is tuned
        <frontend_frequency>11856000</frontend_frequency>                    => tuning frequency (always in kHz)
        <frontend_polarization><![CDATA[V]]></frontend_polarization>         => "-" if polarization isn't applicable, or "V" (Vertical), "H" (Horizontal", "L" (Left), "R" (Right)
        <frontend_symbolrate>27500000</frontend_symbolrate>                  => Satellite symbole rate in symbols per second (or 0 if not applicable)
        <frontend_system><![CDATA[DVB-S]]></frontend_system>                 => System used : "DVB-C", "DVB-T", "DVB-S", "DVB-S2", "ATSC"
        <frontend_status><![CDATA[SCVYL]]></frontend_status>                 => Tuner lock status: "S"/"-" (Signal), "C"/"-" (Carrier), "V"/"-" (Viterbi), "Y"/"-" (Synchro), "L"/"-" (Locked)
        <frontend_ber>0</frontend_ber>                                       => RAW BER value from driver (unsigned 16-bits integer)
        <frontend_signal>56955</frontend_signal>                             => RAW Signal level value from driver (unsigned 16-bits integer)
        <frontend_snr>54759</frontend_snr>                                   => RAW Signal to noise ratio from driver (unsigned 16-bits integer)
        <autoconf_end>1</autoconf_end>                                       => 0 if not autoconfiguration or autoconfiguration in progress, 1 if autoconfiguration is finished
        <cam_support>1</cam_support>                                         => 0 if no CAM support asked, 1 if CAM support was asked
        <cam_number>0</cam_number>                                           => CAM slot number
        <cam_menustring><![CDATA[Not retrieved]]></cam_menustring>           => When CAM is initialized, CAM model
        <cam_initialized>0</cam_initialized>                                 => 0 if CAM isn't initialized, 1 if CAM is initialized

        <channel number="1">                                                 => Loop over channels, one node per channel, with MuMuDVB internal id (starting at 1)
                <lcn>0</lcn>                                                     => If present, Channel Logical Number (Channel number)
                <name><![CDATA[CANAL+]]></name>                                  => Channel name
                <service_type type="1"><![CDATA[Television]]></service_type>     => See function "service_type_to_str" in "log.c" file for complete description
                <ip_multicast><![CDATA[0.0.0.0]]></ip_multicast>                 => Multicast IP address (0.0.0.0 if multicast is disabled)
                <port_multicast>0</port_multicast>                               => Multicast UDP port (0 if multicast is disabled)
                <is_up>0</is_up>                                                 => 0 if channel is not streamed, 1 if channel is streamed
                <traffic>7</traffic>                                             => Channel streamed IP bandwidth in kB (kilo-Bytes) per second
                <ratio_scrambled>99</ratio_scrambled>                            => Percentage of scrambled packets received
                <service_id>8201</service_id>                                    => Service ID of channel
                <pmt_pid>1280</pmt_pid>                                          => PMT PID of channel
                <unicast_port>0</unicast_port>                                   => Unicast port associated with the channle if unicast is setup by port
                <ca_sys>                                                         => Loop over all the CA systems listed in the PMT for the channel
                        <ca num="256"><![CDATA[Canal Plus]]></ca>                    => CA identifier and description if avaliable
                </ca_sys>                                                        => End of CA systems loop
                <pids>                                                           => Loop over all PID related to the channel and declared in the PMT
                        <pid number="1280" language="---"><![CDATA[PMT]]></pid>      => PID number, Language associated (or "---" if no language associated), PID description if avaliable
                        <pid number="160" language="---"><![CDATA[Video (MPEG2)]]></pid>
                        <pid number="80" language="fra"><![CDATA[Audio (MPEG2)]]></pid>
                        <pid number="81" language="eng"><![CDATA[Audio (MPEG2)]]></pid>
                        <pid number="32" language="---"><![CDATA[Teletext]]></pid>
                        <pid number="82" language="fra"><![CDATA[Audio (AC3)]]></pid>
                        <pid number="83" language="eng"><![CDATA[Audio (AC3)]]></pid>
                </pids>                                                          => End of PID loop
        </channel>                                                           => End of channels loop
</mumudvb>                                                               => End of response

2. Access to the CAM menu:

These two webservices allow for accessing the CAM menu during streaming. This is usefull for checking rights or download status for example.

The file cam_menu.php is a simple demonstration on how to use these webservices in order to make a web interface with AJAX compatible with the most important browsers (Firefox, Chrome, Internet Explorer).

For using it, you just need a webserver (lighttpd, apache, etc.) with PHP activated. The web page accept one GET parameter: port_server. This is the unicast port setup for accessing MuMuDVB webservices.

The CAM menu is refresded every 2 seconds and buttons can be used to navigate in the menus. MENU, LIST and ENQUIRY MMI objects are supported.

Case when the CAM isn’t initialized:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<menu>
        <datetime><![CDATA[Mon Nov  1 22:08:17 2010]]></datetime>  => Last update time/date
        <object><![CDATA[NONE]]></object>                          => No object to show
        <title><![CDATA[CAM not initialized!]]></title>            => Message about CAM not initialized
</menu>

Case when the CAM is initialized but there is no menu to display:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<menu>
        <datetime><![CDATA[Tue Nov  2 22:38:37 2010]]></datetime>       => Last update time/date
        <cammenustring><![CDATA[Aston Module 2.1800]]></cammenustring>  => CAM model
        <object><![CDATA[NONE]]></object>                               => No object to show
        <title><![CDATA[No menu to display]]></title>                   => Message about no menu to display
</menu>

Case when a object is send by the CAM to be displayed:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<menu>
        <datetime><![CDATA[Tue Nov  2 22:39:58 2010]]></datetime>       => When the object was received
        <cammenustring><![CDATA[Aston Module 2.1800]]></cammenustring>  => CAM model
        <object><![CDATA[MENU]]></object>                               => Object: "MENU", "LIST" or "ENQUIRY"
        <title><![CDATA[Module Aston]]></title>                         => Object title
        <subtitle><![CDATA[Carte num ro 544.193.724]]></subtitle>       => Object subtitle (when an "ENQUIRY" object is display, show the number of characters expected in the answer)
        <item num="0"><![CDATA[Return]]></item>                         => For "MENU" and "LIST" objects, contain the lines of information or the items to be choosen. The "num" attribute correspond to the key to press to choose the item.
        <item num="1"><![CDATA[Consultation des droits]]></item>
        <item num="2"><![CDATA[R glages]]></item>
        <item num="3"><![CDATA[Information]]></item>
        <bottom><![CDATA[Votre choix, svp]]></bottom>                   => Object bottom line
</menu>
  • Second webservice allows for sending response to the CAM. There is one integer GET paramter: key. Possible keys: 0 to 9 (numbers), M for asking the CAM menu, C for cancelling an ENQUIRY object. URL : http://ip_http:port_http/cam/action.xml?key=X There are 4 king of responses.

OK:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<action>
        <datetime><![CDATA[Mon Nov  1 22:13:30 2010]]></datetime>
        <key><![CDATA[X]]></key>
        <result><![CDATA[OK]]></result>
</action>

Unknown key:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<action>
        <datetime><![CDATA[Mon Nov  1 22:13:30 2010]]></datetime>
        <key><![CDATA[X]]></key>
        <result><![CDATA[ERROR: Unknown key!]]></result>
</action>

CAM not initialized:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<action>
        <datetime><![CDATA[Mon Nov  1 22:13:30 2010]]></datetime>
        <key><![CDATA[X]]></key>
        <result><![CDATA[ERROR: CAM not initialized!]]></result>
</action>

MuMuDVB compiled without CAM support:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<action>
        <datetime><![CDATA[Mon Nov  1 22:13:30 2010]]></datetime>
        <key><![CDATA[X]]></key>
        <result><![CDATA[Compiled without CAM support]]></result>
</action>

mumudvb-1.7.1/doc/html/index.html000066400000000000000000000416661177353207000167270ustar00rootroot00000000000000 MuMuDVB - Documentation

mumudvb-1.7.1/doc/index.txt000066400000000000000000000005651177353207000156270ustar00rootroot00000000000000MuMuDVB - Documentation ======================= Brice Dubost link:QUICKSTART.html[QUICKSTART guide] link:README.html[README english version] link:README_CONF.html[README concerning the configuration file] link:TRANSCODE.html[Information concerning the transcoding, english] link:WEBSERVICES.html[Information concerning the WEB services, english] mumudvb-1.7.1/doc/logo/000077500000000000000000000000001177353207000147115ustar00rootroot00000000000000mumudvb-1.7.1/doc/logo/logo_mumudvb.png000066400000000000000000000137221177353207000201230ustar00rootroot00000000000000PNG  IHDRG-TsBIT|d pHYs3tEXtSoftwarewww.inkscape.org<OIDATxyxǿܙyC la DEe'hF"iƽV۟ FkUԺu (("Be H䝹&"[6}?sw枹o83X `1p6/" hSY^y"rd7"H1x@ފ@O"M'X `^\ϐ@˿`Q{=ă_b=lO%R 8>t}) 8^uL@o`n\yzgT"jص MIkT"z"hK\ H o89`E;NDAD-t0ADA. z j߉@ < p/ž@pQW8Ddmk\#"|吲"^`gR.*މԢM|2MPǮ-إ \y'S`Pg4aS>f!ܪ )l*(eDrB Dt*U. >oic9jTB8KQ!@1J&pq-ɍ>]9ЍLpD+"Ttad٤Kp0[UVnWloﰒŋg aU;ϿNPkGX66:FD#{s#0T/MZ^fq 3}=?Ę1b{XF/ @{Z3>X5T~+x72 "dDRbyajkPG.Zu$jȵC%<=޿gZ{ h?MPdCTf -^ZF}7x ׭6OPG8-,*ٛnZѿpR_y>¨&A` 0nZ ꅛΉ@#+' u!ʱ}7zkh/A$'de}LPdI~2UȝQwNJtܧJ;J=ƢQҪUNsEحg?Vk]RkQWM]ʠ; i1r'Zv5>Rjb6\ώ:pl˹"7B0[]D`viCk,ͬu/eAӪ2/g+ǛZ8aG9&ԡ @J8}ؒJ(mv +)3/ C!TU0O]vP2B"z"4,jr*c5mhF{6'{Quzq)rDrcU1+KkC3fVW1bs=7Dt^.\31zh@ Gٹ ֕0m|/ndRVUaTÎy*%ԯ`@-ɂ5lbQܸw!4:tX"kh-6uS'޻VrC<"^獋%D,N$aUv fUR?o̩Es3lڏD)KWh=_F'۱k48'neeC, Z&'/?礊`-/Hss;,ޢ/BeEDZ~dr4k;^T&{wڇYDZla-<^VÒgH Q"jGDq>#kR՞hO5`; c1&^?z.]z[),B'KEdYِ^tG7GEY6r zpuHxpiA`lSDrA^"/J/ d>W`}a'Rd͕cVBl|EjVYyŻ- jWEVm")Ա;*Q;:Hb_u[un"cVYOR<aiZ8AێB+i| B`AYpwt͋itg~(3{e9sCNh_F)6FX R#~FySJRCZ@~hF=!H)fƊv7; P磊Mc2e> O.yĿ.\1"uYSdґmGu"yi#.D+I0,".#Xx0 &^"7zo4Ps~ÐoG2}WJ2iépnk1kC,QwPNMG$OO gZQl˪eɶԻ\bwl慿Z,OH9MVFx|ftK^@h *6,;3|0YA(T)ܝ|Wj iǪ3ůb ŎRXʊQ T(efaEu,X R+8{Q]ѫwgS2 4l h,g8,F5vN贎 ijr1u{q+E-/|>ͩϲV_YB-L;ߍ~q:\jvs9-$FYeTkDzacjG1[!# -ֲUXo,.+'.J[WŠyʲB^kEJeabE[%l;8mӶ AB3v9^c:$/f?:0IF#T9T@_{4 ~a-lgY1VV`VG*l+ֻoO1E rP|e/_cMFm޴?;dDXWlež[ pȜ \؛Ed ^9BrxE)tV gIڴ{=1T+Tf,oeǔG^ٷ:R_H|0[FVXʶ^7`ϻK+ʓf]ːesC c! 8t E+^'y= :Na ~Vvqa jBcm|b6Y+b2a+,[=aRjิ޵os!e ~*;-ǂqZM{Bx2)B%mUeţ7*$ . [bv QPSr+RfìRdTGI+"1sF:_XNE)ׯRQWd~$d:oD4JDD@"y \=.7r\D` DWu4l bQqìٰRaҊQDkQUܓ91vXV onvʑ 3?/t9En} n270D ѥtt.H'Jw:`S(_XM;usyCѦq#Ʊ\y7S*p+娆 3 ,+Hw@ø0VFZ{ZQ+mƞu4YU9lC`: ֋FF{/:I`*:k!A]]kK t=iIENDB`mumudvb-1.7.1/doc/logo/logo_mumudvb.svg000066400000000000000000000244571177353207000201450ustar00rootroot00000000000000 image/svg+xml DVB IP MuMuDVB IP IP IP mumudvb-1.7.1/doc/logo/logo_mumudvb_32x32.png000066400000000000000000000016011177353207000207550ustar00rootroot00000000000000PNG  IHDR sRGB pHYs3tIME  (WIDATHVKLQ3i>( 2@)PZCD&&H;F7.ܸsAt ?i•k @ |JKwfJ₻s{/"aY.˲CCC^wttrqgX+2Ƙ(:h٪A88.KE t"R2ƒ$|H4VV Zs" (v/y@O%`qhFgd$-s {Ñh\٬QDz4@"pZFUU1n*g=ls--Ҍ:;j^##o*M_B?`Wsn,]GwO޼} xŽSPT%W,B 5X!i dssd2= {8w\X%8"N?ղ4q{EI.؂VK_ *lW o813D[JBȇ^ș=cԬ$f$P\џ̃WST2`Iοch |iEٮ)!LqIQUFa @&uo'=(VVV9^ʓ}9tZR. B:MMVEB(r8(Ly(IXf4g f&a  93 ,ұt;2BJMy `R*TUem ?}*8C8Zf(euD$xQIENDB`mumudvb-1.7.1/doc/mumudvb.8000066400000000000000000000047701177353207000155310ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH MUMUDVB 8 "13 November 2011" "MuMuDVB v1.7" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME MuMuDVB \- Multicast a DVB transponder over multiples ip addresses .SH SYNOPSIS .B mumudvb .RI [ options ] .B -c conf_file .br .B mumudvb .RI [ options ] \-\-config conf_file .SH DESCRIPTION \fBMuMuDVB\fP is a program who can redistribute stream from DVB on a network, in multicast or in HTTP unicast. It's main feature is to take a whole transponder and put each channel on a different multicast IP. Website : http://mumudvb.braice.net/ .SH OPTIONS The following options are provided by MuMuDVB : .TP .B \-c, \-\-config conf_file Path to the config file .TP .B \-s, \-\-signal Display signal power .TP .B \-t, \-\-traffic Display channels traffic .TP .B \-l, \-\-list\-cards List the DVB cards and exit .TP .B \-\-cards The DVB card to use (overrided by the configuration file) .TP .B \-\-server_id The server id (for autoconfiguration, overrided by the configuration file) .TP .B \-d, \-\-debug Don't deamonize .TP .B \-h, \-\-help Display Help .TP .B \-v More Verbose .TP .B \-q More quiet .TP .B \-\-dumpfile Debug option : Dump the stream into the specified file .SH SEE ALSO The program is documented in README and for french speaking people in README-fr. .SH AUTHOR Upstream author: .br Brice DUBOST .br Contributors: .br Stéphane Glondu (makefile cleaning, man page, debian package) .br Manuel SABBAN (use of getopt) .br Sébastien Raillard .br Pierre Gronlier .br Ludovic Boué .br Utelisys Communications B.V. (transcoding) .br Acknowledgements: .br Dave CHAPMAN (for writing dvbstream and contributions), Pierre Gronlier, Sébastien Raillard, Utelisys Communications B.V. (transcoding), Romolo Manfredini, Ludovic Boué .PP This manual page was written by Stephane Glondu and Brice DUBOST . mumudvb-1.7.1/doc/transcode/000077500000000000000000000000001177353207000157335ustar00rootroot00000000000000mumudvb-1.7.1/doc/transcode/examples/000077500000000000000000000000001177353207000175515ustar00rootroot00000000000000mumudvb-1.7.1/doc/transcode/examples/test-h.264-2.conf000066400000000000000000000013341177353207000222760ustar00rootroot00000000000000cam_support=1 freq=12574 pol=h srate=22000 card=0 multicast_ttl=16 timeout_accord=20 timeout_no_diff=60 #sap_sending_ip=217.117.229.229 #sap=1 #sap_organisation=iptv #sap_interval=5 #sap_group=UT TV common_port=0 #Forth ip=239.100.0.3 port=1234 name=Jetix/Veronica cam_pmt_pid=2220 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9948 transcode_sdp_filename=/var/lib/dss/media/mumudvb4.sdp transcode_video_codec=libx264 transcode_video_scale=0.5 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_bitrate=1024000 transcode_audio_codec=mp2 #transcode_aac_latm=1 pids=2220 92 518 8190 38mumudvb-1.7.1/doc/transcode/examples/test-h.264-3.conf000066400000000000000000000014011177353207000222720ustar00rootroot00000000000000cam_support=1 freq=12574 pol=h srate=22000 card=0 multicast_ttl=16 timeout_accord=20 timeout_no_diff=60 #sap_sending_ip=217.117.229.229 #sap=1 #sap_organisation=iptv #sap_interval=5 #sap_group=UT TV common_port=0 #1st channel ip=239.100.0.0 port=1234 name=NET5 cam_pmt_pid=2204 transcode_enable=1 transcode_streaming_type=ffm transcode_ffm_url=http://127.0.0.1:8090/feed1.ffm pids=2204 100 513 8190 37 #Second ip=239.100.0.1 port=1234 name=SBS6 cam_pmt_pid=2205 transcode_enable=1 transcode_streaming_type=ffm transcode_ffm_url=http://127.0.0.1:8090/feed2.ffm pids=2205 80 514 8190 32 #Third ip=239.100.0.2 port=1234 name=TMF cam_pmt_pid=2215 transcode_enable=1 transcode_streaming_type=ffm transcode_ffm_url=http://127.0.0.1:8090/feed3.ffm pids=2215 88 516 8190 34 mumudvb-1.7.1/doc/transcode/examples/test-h.264-4.conf000066400000000000000000000061531177353207000223040ustar00rootroot00000000000000cam_support=1 freq=12574 pol=h srate=22000 card=0 multicast_ttl=16 timeout_accord=20 timeout_no_diff=60 #sap_sending_ip=217.117.229.229 #sap=1 #sap_organisation=iptv #sap_interval=5 #sap_group=UT TV common_port=0 #1st channel ip=239.100.0.0 port=1234 name=NET5 cam_pmt_pid=2204 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9918 transcode_sdp_filename=/var/lib/dss/media/mumudvb1.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_scale=0.5 transcode_video_bitrate=512000 transcode_audio_codec=mp2 pids=2204 100 513 8190 37 #Second ip=239.100.0.1 port=1234 name=SBS6 cam_pmt_pid=2205 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9928 transcode_sdp_filename=/var/lib/dss/media/mumudvb2.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_scale=0.5 transcode_video_bitrate=512000 transcode_audio_codec=mp2 pids=2205 80 514 8190 32 #Third ip=239.100.0.2 port=1234 name=TMF-1 cam_pmt_pid=2215 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9938 transcode_sdp_filename=/var/lib/dss/media/mumudvb3.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_scale=0.5 transcode_video_bitrate=512000 transcode_audio_codec=mp2 pids=2215 88 516 8190 34 #Forth ip=239.100.0.3 port=1234 name=Jetix/Veronica cam_pmt_pid=2220 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9948 transcode_sdp_filename=/var/lib/dss/media/mumudvb4.sdp transcode_video_codec=libx264 #transcode_video_scale=0.25 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_scale=0.5 transcode_video_bitrate=512000 transcode_audio_codec=mp2 pids=2220 92 518 8190 38 #Sixt ip=239.100.0.5 port=1234 name=BVN cam_pmt_pid=2225 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9968 transcode_sdp_filename=/var/lib/dss/media/mumudvb6.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_scale=0.5 transcode_video_bitrate=512000 transcode_audio_codec=mp2 pids=2225 96 515 36 8190 #TMF2 ip=239.100.0.6 port=1235 name=TMF cam_pmt_pid=2215 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9978 transcode_sdp_filename=/var/lib/dss/media/mumudvb7.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_scale=0.5 transcode_video_bitrate=512000 transcode_audio_codec=mp2 pids=2215 88 516 8190 34 mumudvb-1.7.1/doc/transcode/examples/test-h.264.conf000066400000000000000000000062171177353207000221440ustar00rootroot00000000000000cam_support=1 freq=12574 pol=h srate=22000 card=0 multicast_ttl=16 timeout_accord=20 timeout_no_diff=60 #sap_sending_ip=217.117.229.229 #sap=1 #sap_organisation=iptv #sap_interval=5 #sap_group=UT TV common_port=0 #1st channel ip=239.100.0.0 port=1234 name=NET5 cam_pmt_pid=2204 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9918 transcode_sdp_filename=/var/lib/dss/media/mumudvb1.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_bitrate=1024000 transcode_audio_codec=mp2 transcode_audio_bitrate=128000 pids=2204 100 513 8190 37 #Second ip=239.100.0.1 port=1234 name=SBS6 cam_pmt_pid=2205 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9928 transcode_sdp_filename=/var/lib/dss/media/mumudvb2.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_bitrate=1024000 transcode_audio_codec=mp2 transcode_audio_bitrate=128000 pids=2205 80 514 8190 32 #Third ip=239.100.0.2 port=1234 name=TMF-1 cam_pmt_pid=2215 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9938 transcode_sdp_filename=/var/lib/dss/media/mumudvb3.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_bitrate=1024000 transcode_audio_codec=mp2 transcode_audio_bitrate=128000 pids=2215 88 516 8190 34 #Forth ip=239.100.0.3 port=1234 name=Jetix/Veronica cam_pmt_pid=2220 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9948 transcode_sdp_filename=/var/lib/dss/media/mumudvb4.sdp transcode_video_codec=libx264 #transcode_video_scale=0.25 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_bitrate=1024000 transcode_audio_codec=mp2 transcode_audio_bitrate=128000 pids=2220 92 518 8190 38 #Sixt ip=239.100.0.5 port=1234 name=BVN cam_pmt_pid=2225 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9968 transcode_sdp_filename=/var/lib/dss/media/mumudvb6.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_bitrate=1024000 transcode_audio_codec=mp2 transcode_audio_bitrate=128000 pids=2225 96 515 36 8190 #TMF2 ip=239.100.0.6 port=1235 name=TMF cam_pmt_pid=2215 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9978 transcode_sdp_filename=/var/lib/dss/media/mumudvb7.sdp transcode_video_codec=libx264 transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_enable_8x8dct=1 transcode_gop=250 transcode_keyint_min=25 transcode_coder_type=0 transcode_subq=1 transcode_video_bitrate=1024000 transcode_audio_codec=mp2 transcode_audio_bitrate=128000 pids=2215 88 516 8190 34 mumudvb-1.7.1/doc/transcode/examples/test.conf000066400000000000000000000064621177353207000214070ustar00rootroot00000000000000cam_support=1 freq=12574 pol=h srate=22000 card=0 multicast_ttl=16 timeout_accord=20 timeout_no_diff=60 #sap_sending_ip=217.117.229.229 #sap=1 #sap_organisation=iptv #sap_interval=5 #sap_group=UT TV common_port=0 #1st channel ip=239.100.0.0 port=1234 name=NET5 cam_pmt_pid=2204 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9918 transcode_sdp_filename=/var/lib/dss/media/mumudvb1.sdp transcode_video_codec=mpeg4 transcode_gop=12 transcode_keyint_min=12 transcode_mbd=2 transcode_video_bitrate=2000000 transcode_audio_codec=libfaac pids=2204 100 513 8190 37 #Second ip=239.100.0.1 port=1234 name=SBS6 cam_pmt_pid=2205 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9928 transcode_sdp_filename=/var/lib/dss/media/mumudvb2.sdp transcode_video_codec=mpeg4 transcode_gop=12 transcode_keyint_min=12 transcode_mbd=2 transcode_video_bitrate=2000000 transcode_audio_codec=libfaac pids=2205 80 514 8190 32 #Third ip=239.100.0.2 port=1234 name=TMF-1 cam_pmt_pid=2215 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9938 transcode_sdp_filename=/var/lib/dss/media/mumudvb3.sdp #transcode_video_codec=libx264 #transcode_video_scale=0.25 #transcode_x264_profile=high #transcode_loop_filter=1 #transcode_x264_partitions=1 #transcode_mixed_refs=1 #transcode_enable_8x8dct=1 #transcode_gop=250 #transcode_keyint_min=25 #transcode_mbd=0 #transcode_cmp=0 #transcode_subcmp=0 #transcode_refs=6 #transcode_b_strategy=0 #transcode_coder_type=1 #transcode_me_method=1 #transcode_me_range=0 #transcode_subq=1 #transcode_trellis=0 #transcode_crf=0 #transcode_level=30 transcode_video_codec=mpeg4 transcode_gop=12 transcode_keyint_min=12 transcode_mbd=2 transcode_video_bitrate=2000000 transcode_audio_codec=libfaac pids=2215 88 516 8190 34 #Forth ip=239.100.0.3 port=1234 name=Jetix/Veronica cam_pmt_pid=2220 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9948 transcode_sdp_filename=/var/lib/dss/media/mumudvb4.sdp transcode_video_codec=mpeg4 transcode_gop=12 transcode_keyint_min=12 transcode_mbd=2 transcode_video_bitrate=2000000 transcode_audio_codec=libfaac pids=2220 92 518 8190 38 #Five ip=239.100.0.5 port=1234 name=Jetix/Veronica cam_pmt_pid=2220 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9958 transcode_sdp_filename=/var/lib/dss/media/mumudvb5.sdp transcode_video_codec=mpeg4 transcode_gop=12 transcode_keyint_min=12 transcode_mbd=2 transcode_video_bitrate=2000000 transcode_audio_codec=libfaac pids=2220 92 518 8190 38 #Sixt ip=239.100.0.5 port=1234 name=BVN cam_pmt_pid=2225 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9968 transcode_sdp_filename=/var/lib/dss/media/mumudvb6.sdp transcode_video_codec=mpeg4 transcode_gop=12 transcode_keyint_min=12 transcode_mbd=2 transcode_video_bitrate=2000000 transcode_audio_codec=libfaac pids=2225 96 515 36 8190 #TMF2 ip=239.100.0.6 port=1235 name=TMF cam_pmt_pid=2215 transcode_enable=1 transcode_streaming_type=rtp transcode_rtp_port=9978 transcode_sdp_filename=/var/lib/dss/media/mumudvb7.sdp transcode_video_codec=mpeg4 transcode_gop=12 transcode_keyint_min=12 transcode_mbd=2 transcode_video_bitrate=2000000 transcode_audio_codec=libfaac pids=2215 88 516 8190 34 #Radio #ip=239.100.0.7 #port=1234 #name=3FM #cam_pmt_pid=2233 #pids=2233 233 8190 #radio #ip=239.100.0.8 #port=1234 #name=Caz #pids=2250 222 8190 mumudvb-1.7.1/doc/transcode/examples/test2.conf000066400000000000000000000031621177353207000214630ustar00rootroot00000000000000cam_support=1 cam_number=0 freq=12343 pol=h srate=27500 card=1 multicast_ttl=16 timeout_accord=20 timeout_no_diff=60 #sap_sending_ip=217.117.229.229 #sap=1 #sap_organisation=iptv #sap_interval=5 #sap_group=UT TV common_port=0 #1st channel #ip=239.100.1.0 #port=1234 #name=RTL4 #cam_pmt_pid=2004 #name=TV Oranje #cam_pmt_pid=2010 #pids=2004 80 512 8190 32 #Second ip=239.100.1.1 port=1234 name=RTL5 cam_pmt_pid=2005 transcode_enable=1 #transcode_streaming_type=ffm #transcode_ffm_url=http://localhost:8091/feed1.ffm transcode_streaming_type=rtp transcode_rtp_port=2255 transcode_video_codec=libx264 transcode_video_scale=0.25 transcode_video_frames_per_second=15 transcode_gop=250 transcode_subq=1 transcode_audio_codec=libfaac transcode_audio_channels=2 transcode_audio_sample_rate=44100 transcode_aac_latm=1 transcode_sdp_filename=/var/lib/dss/media/andriy.sdp pids=2005 92 513 8190 33 #Third #ip=239.100.1.2 #port=1234 #name=RTL7 #cam_pmt_pid=2006 #pids=2006 90 518 8190 38 #Forth #ip=239.100.1.3 #port=1234 #name=TV Oranje #cam_pmt_pid=2010 #pids=2010 84 516 8190 #Fifth #ip=239.100.1.4 #port=1234 #name=Discovery Channel #cam_pmt_pid=2015 #pids=2015 88 515 8190 34 #Sixt #ip=239.100.1.5 #port=1234 #name=Animal Planet #cam_pmt_pid=2020 #pids=2020 96 514 8190 35 #Seven #ip=239.100.1.6 #port=1234 #name=Eurosport #cam_pmt_pid=2025 #pids=2025 112 517 8190 36 #Eight #ip=239.100.1.7 #port=1234 #name=Cartoon Network #cam_pmt_pid=2030 #pids=2030 116 520 8190 37 #Nine #ip=239.100.1.8 #port=1234 #name=RTL8 #cam_pmt_pid=2035 #pids=2035 108 519 8190 39 #Ten #ip=239.100.1.9 #port=1234 #name=Hallmark #cam_pmt_pid=2041 #pids=2041 118 8190 523 mumudvb-1.7.1/doc/transcode/transcode_configuration.txt000066400000000000000000000423121177353207000234070ustar00rootroot00000000000000transcode_enable - enables or disables transcoding 0 - disable (default); 1 - enable. ---------------------------------------------------------------------------- transcode_video_codec - video codec for encoding mpeg4 (for MPEG-4), libx264 (for H.264) etc. ---------------------------------------------------------------------------- transcode_audio_codec - audio codec for encoding libmp3lame (for MP3), libfaac (for AAC) etc. ---------------------------------------------------------------------------- transcode_streaming_type - streaming type mpegts - for MPEG-2 TS streaming. rtp - for RTP streaming. ffm - FFM feed to ffserver ---------------------------------------------------------------------------- transcode_ffm_url - URL of FFM feed (required for FFM streaming) ---------------------------------------------------------------------------- transcode_rtp_port - base port for RTP streaming Each RTP stream (audio or video) must go on an even port. Mumudvb will took for each media stream next even port starting from value specified in this option. ---------------------------------------------------------------------------- transcode_sdp_filename - path to generated SDP file (for RTP streaming) ---------------------------------------------------------------------------- transcode_video_scale - factor for video scaling ---------------------------------------------------------------------------- transcode_video_frames_per_second - FPS of output video ---------------------------------------------------------------------------- transcode_audio_channels - number of output audio channels Common values are: 1 - mono 2 - stereo ---------------------------------------------------------------------------- transcode_audio_sample_rate - output audio sample rate Common values are: 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 ---------------------------------------------------------------------------- transcode_aac_latm - enable LATM payload type for AAC streams while RTP streaming 0 - disable (default) 1 - enable ---------------------------------------------------------------------------- transcode_aac_profile - profile in case of AAC audio encoding low - Low Complexity (LC) - the simplest and most widely used and supported. main - Main Profile (MAIN) - like the LC profile, with the addition of backwards prediction. ssl - Sample-Rate Scalable (SRS) - a.k.a. Scalable Sample Rate (MPEG-4 AAC-SSR). ltp - Long Term Prediction (LTP) - added in the MPEG-4 standard an improvement of the MAIN profile using a forward predictor with lower computational complexity. ---------------------------------------------------------------------------- transcode_video_bitrate - set video bitrate (int bits/s) Enables target bitrate mode for video. Attempts to reach a specific bitrate. Bitrate mode is generally the worst ratecontrol mode H.264 has. ---------------------------------------------------------------------------- transcode_audio_bitrate - set audio bitrate (int bits/s) Enables target bitrate mode for audio. ---------------------------------------------------------------------------- transcode_x264_profile - set H.264 encoding profile Supported values: baseline - Baseline Profile main - Main Profile high - High Profile Note: specify different video encoding options after declaration of transcode_x264_profile may change profile to higher one. For example option "enable_8x8dct=1" will enable 8x8 transform that is supported only by High Profile. ---------------------------------------------------------------------------- transcode_level - set level of encoding Example values: 10 for level 1.0 11 for level 1.1 12 for level 1.2 20 for level 2.0 21 for level 2.1 30 for level 3.0 etc. ---------------------------------------------------------------------------- transcode_x264_partitions - enables best use of partitions for H.264 0 - disable 1 - enable Reccomended default to enable it for H.264. FFmpeg equivalent: partitions +parti4x4+parti8x8+partp8x8+partb8x8 One of H.264's most useful features is the ability to choose among many combinations of inter and intra partitions. P-macroblocks can be subdivided into 16x8, 8x16, 8x8, 4x8, 8x4, and 4x4 partitions. B-macroblocks can be divided into 16x8, 8x16, and 8x8 partitions. I-macroblocks can be divided into 4x4 or 8x8 partitions. Analyzing more partition options improves quality at the cost of speed. The default is to analyze all partitions except p4x4 (p8x8, i8x8, i4x4, b8x8), since p4x4 is not particularly useful except at high bitrates and lower resolutions. Note that i8x8 requires 8x8dct, and is therefore a High Profile-only partition. p8x8 is the most costly, speed-wise, of the partitions, but also gives the most benefit. Generally, whenever possible, all partition types except p4x4 should be used. ---------------------------------------------------------------------------- transcode_loop_filter - enables loop filter 0 - disable 1 - enable Reccomended default to enable it for H.264. ---------------------------------------------------------------------------- transcode_mixed_refs - one reference per partition, as opposed to one reference per macroblock 0 - disable 1 - enable H.264 allows p8x8 blocks to select different references for each p8x8 block. This option allows this analysis to be done, and boosts quality with little speed impact. It should generally be used, though it obviously has no effect with only one reference frame. ---------------------------------------------------------------------------- enable_8x8dct - high profile 8x8 transform (H.264) 0 - disable 1 - enable Gives a notable quality boost by allowing x264 to choose between 8x8 and 4x4 frequency transform size. Required for i8x8 partitions. Speed cost for this option is near-zero both for encoding and decoding; the only reason to disable it is when one needs support on a device not compatible with High Profile. ---------------------------------------------------------------------------- transcode_gop - set the group of picture size Keyframe interval, also known as GOP length. This determines the maximum distance between I-frames. Very high GOP lengths will result in slightly more efficient compression, but will make seeking in the video somewhat more difficult. For H.264 recommended default: 250. ---------------------------------------------------------------------------- transcode_b_frames - use 'frames' B frames B-frames are a core element of H.264 and are more efficient in H.264 than any previous standard. Some specific targets, such as HD-DVD and Blu-Ray, have limitations on the number of consecutive B-frames. Most, however, do not; as a result, there is rarely any negative effect to setting this to the maximum (16) since x264 will, if B-adapt is used, automatically choose the best number of B-frames anyways. This parameter simply serves to limit the max number of B-frames. Note that Baseline Profile, such as that used by iPods, does not support B-frames. Recommended default for H.264: 16. ---------------------------------------------------------------------------- transcode_mbd - macroblock decision algorithm (high quality mode) 0 - simple - use mbcmp (default) 1 - bits - use fewest bits 2 - rd - use best rate distortion *FIXME* enables high quality mode for MPEG-4 compression. ---------------------------------------------------------------------------- transcode_cmp - full pel me compare function 0 - sad - sum of absolute differences, fast (default) 1 - sse - sum of squared errors 2 - satd - sum of absolute Hadamard transformed differences 3 - dct - sum of absolute DCT transformed differences 4 - psnr - sum of squared quantization errors (avoid, low quality) 5 - bit - number of bits needed for the block 6 - rd - rate distortion optimal, slow 7 - zero - 0 8 - vsad - sum of absolute vertical differences 9 - vsse - sum of squared vertical differences 10 - nsse - noise preserving sum of squared differences 11 - w53 - 5/3 wavelet, only used in snow 12 - w97 - 9/7 wavelet, only used in snow 13 - dctmax - 14 - dct264 - 256 - chroma - *FIXME* Used in MPEG-4 compression ---------------------------------------------------------------------------- transcode_subcmp - sub pel me compare function 0 - sad - sum of absolute differences, fast (default) 1 - sse - sum of squared errors 2 - satd - sum of absolute Hadamard transformed differences 3 - dct - sum of absolute DCT transformed differences 4 - psnr - sum of squared quantization errors (avoid, low quality) 5 - bit - number of bits needed for the block 6 - rd - rate distortion optimal, slow 7 - zero - 0 8 - vsad - sum of absolute vertical differences 9 - vsse - sum of squared vertical differences 10 - nsse - noise preserving sum of squared differences 11 - w53 - 5/3 wavelet, only used in snow 12 - w97 - 9/7 wavelet, only used in snow 13 - dctmax - 14 - dct264 - 256 - chroma - *FIXME* Used in MPEG-4 compression ---------------------------------------------------------------------------- transcode_crf - enables constant quality mode, and selects the quality (H.264 only) Constant quality mode (also known as constant ratefactor). Bitrate corresponds approximately to that of constant quantizer, but gives better quality overall at little speed cost. The best one-pass option in H.264. ---------------------------------------------------------------------------- transcode_refs - reference frames to consider for motion compensation (H.264 only) One of H.264's most useful features is the abillity to reference frames other than the one immediately prior to the current frame. This parameter lets one specify how many references can be used, through a maximum of 16. Increasing the number of refs increases the DPB (Decoded Picture Buffer) requirement, which means hardware playback devices will often have strict limits to the number of refs they can handle. In live-action sources, more reference have limited use beyond 4-8, but in cartoon sources up to the maximum value of 16 is often useful. More reference frames require more processing power because every frame is searched by the motion search (except when an early skip decision is made). The slowdown is especially apparent with slower motion estimation methods. Recommended default for H.264: 6. ---------------------------------------------------------------------------- transcode_b_strategy - strategy to choose between I/P/B-frames libx264, by default, adaptively decides through a low-resolution lookahead the best number of B-frames to use. It is possible to disable this adaptivity; this is not recommended. Recommended default for H.264: 1 0: Very fast, but not recommended. Does not work with pre-scenecut (scenecut must be off to force off b-adapt). 1: Fast, default mode in libx264. A good balance between speed and quality. 2: A much slower but more accurate B-frame decision mode that correctly detects fades and generally gives considerably better quality. Its speed gets considerably slower at high bframes values, so its recommended to keep bframes relatively low (perhaps around 3) when using this option. It also may slow down the first pass of libx264 when in threaded mode. ---------------------------------------------------------------------------- transcode_coder_type 0 = vlc variable length coder / huffman coder 1 = ac/CABAC arithmetic coder 2 = raw raw (no encoding) 3 = rle run-length coder 4 = deflate deflate-based coder CABAC is the default entropy encoder used by x264. Though somewhat slower on both the decoding and encoding end, it offers 10-15% improved compression on live-action sources and considerably higher improvements on animated sources, especially at low bitrates. It is also required for the use of trellis quantization. Disabling CABAC may somewhat improve decoding performance, especially at high bitrates. CABAC is not allowed in Baseline Profile. ---------------------------------------------------------------------------- transcode_me_method - set motion estimation method 1 - zero - zero motion estimation (fastest) 2 - full/esa - full motion estimation (slowest) 3 - log - log motion estimation 4 - phods - phods motion estimation 5 - epzs/dia - EPZS motion estimation (default) 6 - x1 - X1 motion estimation 7 - hex - hex motion estimation (x264 specific) 8 - umh - umh motion estimation (x264 specific) 9 - iter - iter motion estimation (snow specific) 10 - tesa - tesa motion estimation (x264 specific) One of the most important settings for x264, both speed and quality-wise. epzs - is the simplest search, consisting of starting at the best predictor, checking the motion vectors at one pixel upwards, left, down, and to the right, picking the best, and repeating the process until it no longer finds any better motion vector. hex - consists of a similar strategy, except it uses a range-2 search of 6 surrounding points, thus the name. It is considerably more efficient than DIA and hardly any slower, and therefore makes a good choice for general-use encoding. umh - is considerably slower than HEX, but searches a complex multi-hexagon pattern in order to avoid missing harder-to-find motion vectors. Unlike HEX and DIA, the merange parameter directly controls UMH's search radius, allowing one to increase or decrease the size of the wide search. full - is a highly optimized intelligent search of the entire motion search space within merange of the best predictor. It is mathematically equivalent to the bruteforce method of searching every single motion vector in that area, though faster. However, it is still considerably slower than UMH, with not too much benefit, so is not particularly useful for everyday encoding. ---------------------------------------------------------------------------- transcode_me_range - limit motion vectors range) MErange controls the max range of the motion search. For HEX and DIA, this is clamped to between 4 and 16, with a recommended of 16. For UMH and ESA, it can be increased beyond the 16 to allow for a wider-range motion search, which is useful on HD footage and for high-motion footage. Note that for UMH and ESA, increasing MErange will significantly slow down encoding. ---------------------------------------------------------------------------- transcode_subq - sub pel motion estimation quality An extremely important encoding parameter for H.264 which determines what algorithms are used for both subpixel motion searching and partition decision. 1: Fastest, but extremely low quality. Should be avoided except on first pass encoding. 2-5: Progressively better and slower, 5 serves as a good medium for higher speed encoding. 6-7: 6 is the default. Activates rate-distortion optimization for partition decision. This can considerably improve efficiency, though it has a notable speed cost. 6 activates it in I/P frames, and subme7 activates it in B frames. 8-9: Activates rate-distortion refinement, which uses RDO to refine both motion vectors and intra prediction modes. Slower than subme 6, but again, more efficient. ---------------------------------------------------------------------------- transcode_trellis - rate-distortion optimal quantization 0 - disabled 1 - enabled only on the final encode of a MB 2 - enabled on all mode decisions The main decision made in quantization is which coefficients to round up and which to round down. Trellis chooses the optimal rounding choices for the maximum rate-distortion score, to maximize PSNR relative to bitrate. This generally increases quality relative to bitrate by about 5% for a somewhat small speed cost. It should generally be enabled. Note that trellis requires CABAC. ---------------------------------------------------------------------------- transcode_sc_threshold - scene change threshold Adjusts the sensitivity of x264's scenecut detection. Rarely needs to be adjusted. Recommended default for H.264: 40. ---------------------------------------------------------------------------- transcode_rc_eq - set rate control equation Ratecontrol equation. Recommended default for H.264: 'blurCplx^(1-qComp)'. ---------------------------------------------------------------------------- transcode_qcomp - video quantizer scale compression QP curve compression: 0.0 => CBR, 1.0 => CQP. Recommended default for H.264: 0.60. ---------------------------------------------------------------------------- transcode_qmin - min video quantizer scale Minimum quantizer. Recommended default for H.264: 10. ---------------------------------------------------------------------------- transcode_qmax - max video quantizer scale Maximum quantizer. Recommended default for H.264: 51. ---------------------------------------------------------------------------- transcode_qdiff - max difference between the quantizer scale Set max QP step. Recommended default: 4. ---------------------------------------------------------------------------- transcode_keyint_min - key interval ----------------------------------------------------------------------------mumudvb-1.7.1/doxygen/000077500000000000000000000000001177353207000146615ustar00rootroot00000000000000mumudvb-1.7.1/doxygen/mumudvb.dox000066400000000000000000001740761177353207000170730ustar00rootroot00000000000000# Doxyfile 1.5.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = mumudvb # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.6 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doxygen/ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, # Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = doxygen/warnings.log #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = src/ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c \ *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to FRAME, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. Other possible values # for this tag are: HIERARCHIES, which will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list; # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which # disables this behavior completely. For backwards compatibility with previous # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = FRAME # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = ENABLE_CAM_SUPPORT \ HAVE_LIBUCSI # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Options related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO mumudvb-1.7.1/install-sh000077500000000000000000000332561177353207000152210ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mumudvb-1.7.1/missing000077500000000000000000000241521177353207000146070ustar00rootroot00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mumudvb-1.7.1/openwrt/000077500000000000000000000000001177353207000147025ustar00rootroot00000000000000mumudvb-1.7.1/openwrt/generate_dvbmk.py000077500000000000000000000255321177353207000202430ustar00rootroot00000000000000#!/usr/bin/env python """ This script is a generator of OpenWRT's Makefile for DVB USB devices This script uses the sources of the linux kernel to find what are the different supported DVB USB devices and the kernel parameters needed to compile them. In more details it is able to find * the module description * the module dependancies * the frontends needed and the tuner needed * the module generated files (including the frontend and the tuners) * the firmware needed by the module And it will generate a dvb.mk file with all these informations """ KERNEL_PATH = "/usr/src/linux-2.6.32/" DEST_DIR = "/tmp/" DEST_FILE = "dvb.2.6.32.mk" _NEXT_LINE = """ \\ """ CONFIG_FILE_HEADER = """ # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \\ CONFIG_MEDIA_SUPPORT \\ CONFIG_DVB_CORE \\ CONFIG_DVB_CAPTURE_DRIVERS=y \\ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \\ CONFIG_DVB_FE_CUSTOMISE=y \\ CONFIG_DVB_DYNAMIC_MINORS=n \\ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \\ CONFIG_DVB_USB \\ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # """ def find_module_files(pre, filename, module): """This function is intended to act like a special grep in a Makefile""" makefile = open(filename,'r') lines_makefile = makefile.readlines() makefile.close() module_files = [] for index, line in enumerate(lines_makefile): if module in line: for module_object in lines_makefile[index].strip().split('=')[1].split(' '): #we remove thing without sence if len(module_object) <3 : continue module_files.append(pre + module_object) return module_files def deal_config(config, filedvbmk): """This function is called when the user wants to add a new module""" firmware_pattern = """%(name)s_FW_%(number)d:=%(filename)s """ firmware_install_pattern = """ $(INSTALL_DATA) $(DL_DIR)/$(%(name)s_FW_%(number)d) $(1)/lib/firmware/ """ firmware_install_main = """define KernelPackage/%(module_name)s/install $(INSTALL_DIR) $(1)/lib/firmware %(firmware_install)s endef """ device_structure = """ define KernelPackage/%(module_name)s SUBMENU:=$(DVB_MENU) TITLE:=%(module_title)s KCONFIG:= %(kconfig)s DEPENDS:=%(depends)s FILES:= %(module_files)s endef define KernelPackage/%(module_name)s/description Say Y here to support the %(module_title)s. The following modules will be compiled for this device : %(module_list)s %(firmware_files)s endef %(firmware_list)s %(firmware_install)s $(eval $(call KernelPackage,%(module_name)s)) """ #We search for the generated files in the main Makefile config["files"] = find_module_files("drivers/media/dvb/dvb-usb/", \ KERNEL_PATH + "drivers/media/dvb/dvb-usb/Makefile", \ config["name"]) config["files"] = [item[:-2] for item in config["files"]] print " * We search the needed source files for searching for a firmware" config["source_files"] = [] for obj in config["files"]: obj = obj.split('/')[-1]+'-objs' config["source_files"] += find_module_files("drivers/media/dvb/dvb-usb/", KERNEL_PATH + "drivers/media/dvb/dvb-usb/Makefile", obj) #We replace the .o by a .c config["source_files"] = [item[:-2] + ".c" for item in config["source_files"]] config["firmwares"] = [] temp_config_firmwares = [] for sourcefile in config["source_files"]: temp_config_firmwares += find_module_files("", KERNEL_PATH+sourcefile, ".firmware") #We remove the probable comma temp_config_firmwares = [item.replace(",",'') for item in temp_config_firmwares] #Dirty hack, since we don't completely parse the C code, we exclude false positive searching for .fw" in the name for item in temp_config_firmwares: if ".fw\"" in item and item.replace("\"", "") not in config["firmwares"]: config["firmwares"].append(item.replace("\"", "")) print " ** This object needs the firmwares : " + str(config["firmwares"]) firmware_list = "" firmware_install = "" for index, firmware in enumerate(config["firmwares"]): firmware_list += firmware_pattern % {"name" : config["name"], "number" : index, "filename" : firmware} firmware_install += firmware_install_pattern % {"name" : config["name"], "number" : index} #we look on the files needed by the tuners/ frontends if len(config["select"]): print " * We loop on the selected modules " for module in config["select"]: print " Module : " + module if(module.find("MEDIA")==0): new_files = find_module_files("drivers/media/common/tuners/", KERNEL_PATH+"drivers/media/common/tuners/Makefile", "CONFIG_" + module) config["files"] += [item[:-2] for item in new_files] elif(module.find("DVB")==0): new_files = find_module_files("drivers/media/dvb/frontends/", KERNEL_PATH+"drivers/media/dvb/frontends/Makefile", "CONFIG_" + module) config["files"] += [item[:-2] for item in new_files] print " New files : " + str(new_files) if len(config["select"]): print " * Final module files : " print config["files"] print " * Depends : " print config["depends"] #--------------- GENERATED device dvb.mk part --------------" #We have now all the needed information, we generate the config for the mk depends = ' '.join(['+kmod-' + item.lower().replace('_','-') for item in config["depends"]]) kconfig = "CONFIG_"+config["name"] if len(config["select"]): kconfig += _NEXT_LINE + _NEXT_LINE.join(["CONFIG_" + item for item in config["select"]]) if(len(config["firmwares"])): firmware_files = \ "You have to put the firmware files in the download dir : " + \ ' '.join(config["firmwares"]) + \ "\nThey can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware ." firmware_install = firmware_install_main % {"module_name" : config["name"].lower().replace('_','-'),"firmware_install" : firmware_install[:-1]} else: firmware_files = "" firmware_install = "" device_mk = device_structure % {"module_name_orig" : config["name"], \ "module_name" : config["name"].lower().replace('_', '-'), \ "module_title" : config["description"].replace('"', '')[:50], \ "kconfig" : kconfig, \ "module_files" : _NEXT_LINE.join(["$(LINUX_DIR)/" + item + ".$(LINUX_KMOD_SUFFIX)" for item in config["files"]]), \ "module_list" : ' '.join([item.split('/')[-1] for item in config["files"]]), \ "firmware_list" : firmware_list, \ "firmware_install" : firmware_install, \ "firmware_files" : firmware_files, \ "depends" : depends} #print device_mk print filedvbmk.write(device_mk) filedvbmk.flush() if __name__ == "__main__" : print "Openning of Kconfig" dvb_usb_kconfig = open(KERNEL_PATH+"drivers/media/dvb/dvb-usb/Kconfig",'r') print "The generated file will be put in : " + DEST_DIR + DEST_FILE dvb_mk = open(DEST_DIR + DEST_FILE,'w') #we write the header dvb_mk.write(CONFIG_FILE_HEADER) haveconfig = False current_config = {"name" : ""} #We loop on the lines of the Kconfig to find new devices characterized by the keyword "config" for line_Kconfig in dvb_usb_kconfig.readlines(): if(line_Kconfig.find("config")==0): if(haveconfig and current_config["name"] != "DVB_USB"): #We found a new "config" keyword, we parse the previous one print "We found config " + current_config["name"] print current_config["description"] answer = raw_input( "Do you want it (Y/n) ? ") if(answer.lower().find('y')==0 or len(answer)==0): deal_config(current_config, dvb_mk) print haveconfig = False current_config = {"name" : "","select" : [], "depends" : []} current_config["name"] = line_Kconfig.split(' ')[1].strip() #"real" modules are characterized by a tristate keyword if "tristate" in line_Kconfig: #Here we get the main CONFIG_ and the module description haveconfig = True current_config["description"] = line_Kconfig.split("tristate ")[1].strip().replace("support","") #We remove stuff between () to shorten the description while(current_config["description"].find('(') != -1 and current_config["description"].find(')') != -1): current_config["description"] = current_config["description"][:current_config["description"].find('(')] + \ current_config["description"][current_config["description"].find(')')+1:] #The select keyword allow us to find the tuners and frontends if "select" in line_Kconfig: current_config["select"].append(line_Kconfig.split("select ")[1].split(' ')[0].strip()) #We add the module dependancies if "depends on" in line_Kconfig: if line_Kconfig.split("depends on ")[1].split(' ')[0].strip() not in ['EXPERIMENTAL']: current_config["depends"].append(line_Kconfig.split("depends on ")[1].split(' ')[0].strip()) #We deal with the last one if(haveconfig and current_config["name"] != "DVB_USB"): #We found a new "config" keyword, we parse the previous one print "We found config " + current_config["name"] print current_config["description"] answer = raw_input( "Do you want it (Y/n) ? ") if(answer.lower().find('y')==0 or len(answer)==0): deal_config(current_config, dvb_mk) dvb_mk.close() dvb_usb_kconfig.close() mumudvb-1.7.1/openwrt/package/000077500000000000000000000000001177353207000162755ustar00rootroot00000000000000mumudvb-1.7.1/openwrt/package/kernel/000077500000000000000000000000001177353207000175555ustar00rootroot00000000000000mumudvb-1.7.1/openwrt/package/kernel/modules/000077500000000000000000000000001177353207000212255ustar00rootroot00000000000000mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.21.7.mk000066400000000000000000000461031177353207000232270ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB=y \ CONFIG_DVB_CAPTURE_DRIVERS=y \ MEDIA_TUNER_CUSTOMIZE=y \ DVB_FE_CUSTOMISE=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/input/input-core.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_DIB3000MB \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dib0700-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-01.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_TUNER_LGH06XF \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgh06xf.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb cx22702 lgdt330x lgh06xf mt352 zl10353 You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 qt1010 You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.22.19.mk000066400000000000000000000511231177353207000233110ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dib0700-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-01.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 qt1010 You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.23.17.mk000066400000000000000000000550221177353207000233120ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dib0700-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-01.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 qt1010 You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.24.7.mk000066400000000000000000000556011177353207000232350ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_TUNER_MT2266 \ CONFIG_DVB_TUNER_DIB0070 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common mt2060 mt2266 dib0070 You have to put the firmware files in the download dir : dvb-usb-dib0700-1.10.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.10.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 qt1010 You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.25.20.mk000066400000000000000000000560071177353207000233120ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_TUNER_MT2266 \ CONFIG_DVB_TUNER_DIB0070 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common mt2060 mt2266 dib0070 You have to put the firmware files in the download dir : dvb-usb-dib0700-1.10.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.10.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw dvb-usb-bluebird-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw DVB_USB_CXUSB_FW_1:=dvb-usb-bluebird-02.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 qt1010 You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_DVB_TUNER_MT2060 \ CONFIG_DVB_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.26.8.mk000066400000000000000000000565701177353207000232460ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_MT2266 \ CONFIG_DVB_TUNER_DIB0070 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common mt2060 mt2266 dib0070 You have to put the firmware files in the download dir : dvb-usb-dib0700-1.10.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.10.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_SIMPLE DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-simple.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-types.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 tuner-simple tuner-types You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw dvb-usb-bluebird-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw DVB_USB_CXUSB_FW_1:=dvb-usb-bluebird-02.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 qt1010 You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw dvb-usb-tt-s2400-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw DVB_USB_TTUSB2_FW_1:=dvb-usb-tt-s2400-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.27.41.mk000066400000000000000000000634661177353207000233260ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_MT2266 \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_DVB_TUNER_DIB0070 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common mt2060 mt2266 tuner-xc2028 dib0070 You have to put the firmware files in the download dir : dvb-usb-dib0700-1.10.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.10.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_SIMPLE \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-simple.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-types.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 tuner-simple tuner-types tuner-xc2028 mxl5005s You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw dvb-usb-bluebird-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw DVB_USB_CXUSB_FW_1:=dvb-usb-bluebird-02.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA827X \ CONFIG_DVB_TDA1004X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda827x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda1004x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 qt1010 tda827x tda1004x You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common mt2060 dvb-pll You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw dvb-usb-tt-s2400-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw DVB_USB_TTUSB2_FW_1:=dvb-usb-tt-s2400-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) define KernelPackage/dvb-usb-dw2102 SUBMENU:=$(DVB_MENU) TITLE:=DvbWorld 2102 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_DW2102 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dw2102.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dw2102/description Say Y here to support the DvbWorld 2102 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-dw2102 stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-dw2102.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DW2102_FW_0:=dvb-usb-dw2102.fw define KernelPackage/dvb-usb-dw2102/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dw2102)) define KernelPackage/dvb-usb-anysee SUBMENU:=$(DVB_MENU) TITLE:=Anysee DVB-T/C USB2.0 KCONFIG:= CONFIG_DVB_USB_ANYSEE \ CONFIG_DVB_PLL \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TDA10023 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-anysee.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10023.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-anysee/description Say Y here to support the Anysee DVB-T/C USB2.0 . The following modules will be compiled for this device : dvb-usb-anysee dvb-pll mt352 zl10353 tda10023 endef $(eval $(call KernelPackage,dvb-usb-anysee)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.28.10.mk000066400000000000000000000727301177353207000233150ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_S5H1411 \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_MT2266 \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_XC5000 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/s5h1411.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/xc5000.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common s5h1411 dib0070 mt2060 mt2266 tuner-xc2028 xc5000 You have to put the firmware files in the download dir : dvb-usb-dib0700-1.20.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.20.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_SIMPLE \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-simple.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-types.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 dib7000p dibx000_common dib0070 tuner-simple tuner-types tuner-xc2028 mxl5005s You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw dvb-usb-bluebird-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw DVB_USB_CXUSB_FW_1:=dvb-usb-bluebird-02.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TDA1004X \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA827X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda1004x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda827x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 tda1004x qt1010 tda827x You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw dvb-usb-tt-s2400-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw DVB_USB_TTUSB2_FW_1:=dvb-usb-tt-s2400-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) define KernelPackage/dvb-usb-dw2102 SUBMENU:=$(DVB_MENU) TITLE:=DvbWorld DVB-S/S2 USB2.0 KCONFIG:= CONFIG_DVB_USB_DW2102 \ CONFIG_DVB_PLL \ CONFIG_DVB_STV0299 \ CONFIG_DVB_STV0288 \ CONFIG_DVB_STB6000 \ CONFIG_DVB_CX24116 \ CONFIG_DVB_SI21XX DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dw2102.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0288.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stb6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx24116.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/si21xx.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dw2102/description Say Y here to support the DvbWorld DVB-S/S2 USB2.0 . The following modules will be compiled for this device : dvb-usb-dw2102 dvb-pll stv0299 stv0288 stb6000 cx24116 si21xx You have to put the firmware files in the download dir : dvb-usb-dw2102.fw dvb-usb-dw2104.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DW2102_FW_0:=dvb-usb-dw2102.fw DVB_USB_DW2102_FW_1:=dvb-usb-dw2104.fw define KernelPackage/dvb-usb-dw2102/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dw2102)) define KernelPackage/dvb-usb-cinergy-t2 SUBMENU:=$(DVB_MENU) TITLE:=Terratec CinergyT2/qanu USB 2.0 DVB-T receiver KCONFIG:= CONFIG_DVB_USB_CINERGY_T2 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cinergyT2.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cinergy-t2/description Say Y here to support the Terratec CinergyT2/qanu USB 2.0 DVB-T receiver. The following modules will be compiled for this device : dvb-usb-cinergyT2 endef $(eval $(call KernelPackage,dvb-usb-cinergy-t2)) define KernelPackage/dvb-usb-anysee SUBMENU:=$(DVB_MENU) TITLE:=Anysee DVB-T/C USB2.0 KCONFIG:= CONFIG_DVB_USB_ANYSEE \ CONFIG_DVB_PLL \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TDA10023 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-anysee.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10023.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-anysee/description Say Y here to support the Anysee DVB-T/C USB2.0 . The following modules will be compiled for this device : dvb-usb-anysee dvb-pll mt352 zl10353 tda10023 endef $(eval $(call KernelPackage,dvb-usb-anysee)) define KernelPackage/dvb-usb-dtv5100 SUBMENU:=$(DVB_MENU) TITLE:=AME DTV-5100 USB2.0 DVB-T KCONFIG:= CONFIG_DVB_USB_DTV5100 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtv5100.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtv5100/description Say Y here to support the AME DTV-5100 USB2.0 DVB-T . The following modules will be compiled for this device : dvb-usb-dtv5100 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-dtv5100)) define KernelPackage/dvb-usb-af9015 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9015 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_AF9015 \ CONFIG_DVB_AF9013 \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA18271 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9015.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/af9013.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda18271.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9015/description Say Y here to support the Afatech AF9015 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-af9015 af9013 dvb-pll mt2060 qt1010 tda18271 mxl5005s You have to put the firmware files in the download dir : dvb-usb-af9015.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9015_FW_0:=dvb-usb-af9015.fw define KernelPackage/dvb-usb-af9015/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9015_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9015)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.29.6.mk000066400000000000000000000727671177353207000232550ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_DVB_DYNAMIC_MINORS=n \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_S5H1411 \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_MT2266 \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_XC5000 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/s5h1411.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/xc5000.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common s5h1411 dib0070 mt2060 mt2266 tuner-xc2028 xc5000 You have to put the firmware files in the download dir : dvb-usb-dib0700-1.20.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.20.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_SIMPLE \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-simple.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-types.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 dib7000p dibx000_common dib0070 tuner-simple tuner-types tuner-xc2028 mxl5005s You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw dvb-usb-bluebird-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw DVB_USB_CXUSB_FW_1:=dvb-usb-bluebird-02.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TDA1004X \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA827X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda1004x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda827x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 tda1004x qt1010 tda827x You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw dvb-usb-tt-s2400-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw DVB_USB_TTUSB2_FW_1:=dvb-usb-tt-s2400-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) define KernelPackage/dvb-usb-dw2102 SUBMENU:=$(DVB_MENU) TITLE:=DvbWorld DVB-S/S2 USB2.0 KCONFIG:= CONFIG_DVB_USB_DW2102 \ CONFIG_DVB_PLL \ CONFIG_DVB_STV0299 \ CONFIG_DVB_STV0288 \ CONFIG_DVB_STB6000 \ CONFIG_DVB_CX24116 \ CONFIG_DVB_SI21XX DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dw2102.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0288.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stb6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx24116.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/si21xx.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dw2102/description Say Y here to support the DvbWorld DVB-S/S2 USB2.0 . The following modules will be compiled for this device : dvb-usb-dw2102 dvb-pll stv0299 stv0288 stb6000 cx24116 si21xx You have to put the firmware files in the download dir : dvb-usb-dw2102.fw dvb-usb-dw2104.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DW2102_FW_0:=dvb-usb-dw2102.fw DVB_USB_DW2102_FW_1:=dvb-usb-dw2104.fw define KernelPackage/dvb-usb-dw2102/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dw2102)) define KernelPackage/dvb-usb-cinergy-t2 SUBMENU:=$(DVB_MENU) TITLE:=Terratec CinergyT2/qanu USB 2.0 DVB-T receiver KCONFIG:= CONFIG_DVB_USB_CINERGY_T2 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cinergyT2.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cinergy-t2/description Say Y here to support the Terratec CinergyT2/qanu USB 2.0 DVB-T receiver. The following modules will be compiled for this device : dvb-usb-cinergyT2 endef $(eval $(call KernelPackage,dvb-usb-cinergy-t2)) define KernelPackage/dvb-usb-anysee SUBMENU:=$(DVB_MENU) TITLE:=Anysee DVB-T/C USB2.0 KCONFIG:= CONFIG_DVB_USB_ANYSEE \ CONFIG_DVB_PLL \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TDA10023 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-anysee.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10023.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-anysee/description Say Y here to support the Anysee DVB-T/C USB2.0 . The following modules will be compiled for this device : dvb-usb-anysee dvb-pll mt352 zl10353 tda10023 endef $(eval $(call KernelPackage,dvb-usb-anysee)) define KernelPackage/dvb-usb-dtv5100 SUBMENU:=$(DVB_MENU) TITLE:=AME DTV-5100 USB2.0 DVB-T KCONFIG:= CONFIG_DVB_USB_DTV5100 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtv5100.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtv5100/description Say Y here to support the AME DTV-5100 USB2.0 DVB-T . The following modules will be compiled for this device : dvb-usb-dtv5100 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-dtv5100)) define KernelPackage/dvb-usb-af9015 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9015 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_AF9015 \ CONFIG_DVB_AF9013 \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA18271 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9015.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/af9013.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda18271.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9015/description Say Y here to support the Afatech AF9015 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-af9015 af9013 dvb-pll mt2060 qt1010 tda18271 mxl5005s You have to put the firmware files in the download dir : dvb-usb-af9015.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9015_FW_0:=dvb-usb-af9015.fw define KernelPackage/dvb-usb-af9015/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9015_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9015)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.30.8.mk000066400000000000000000000753041177353207000232350ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_DVB_DYNAMIC_MINORS=n \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_S5H1411 \ CONFIG_DVB_LGDT3305 \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_MT2266 \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_XC5000 \ CONFIG_MEDIA_TUNER_MXL5007T DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/s5h1411.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt3305.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/xc5000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5007t.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common s5h1411 lgdt3305 dib0070 mt2060 mt2266 tuner-xc2028 xc5000 mxl5007t You have to put the firmware files in the download dir : dvb-usb-dib0700-1.20.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.20.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 mt352 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_LGS8GL5 \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_SIMPLE \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgs8gl5.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-simple.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-types.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 dib7000p dibx000_common lgs8gl5 dib0070 tuner-simple tuner-types tuner-xc2028 mxl5005s You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw dvb-usb-bluebird-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw DVB_USB_CXUSB_FW_1:=dvb-usb-bluebird-02.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TDA1004X \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA827X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda1004x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda827x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 tda1004x qt1010 tda827x You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw dvb-usb-tt-s2400-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw DVB_USB_TTUSB2_FW_1:=dvb-usb-tt-s2400-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) define KernelPackage/dvb-usb-dw2102 SUBMENU:=$(DVB_MENU) TITLE:=DvbWorld DVB-S/S2 USB2.0 KCONFIG:= CONFIG_DVB_USB_DW2102 \ CONFIG_DVB_PLL \ CONFIG_DVB_STV0299 \ CONFIG_DVB_STV0288 \ CONFIG_DVB_STB6000 \ CONFIG_DVB_CX24116 \ CONFIG_DVB_SI21XX DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dw2102.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0288.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stb6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx24116.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/si21xx.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dw2102/description Say Y here to support the DvbWorld DVB-S/S2 USB2.0 . The following modules will be compiled for this device : dvb-usb-dw2102 dvb-pll stv0299 stv0288 stb6000 cx24116 si21xx You have to put the firmware files in the download dir : dvb-usb-dw2102.fw dvb-usb-dw2104.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DW2102_FW_0:=dvb-usb-dw2102.fw DVB_USB_DW2102_FW_1:=dvb-usb-dw2104.fw define KernelPackage/dvb-usb-dw2102/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dw2102)) define KernelPackage/dvb-usb-cinergy-t2 SUBMENU:=$(DVB_MENU) TITLE:=Terratec CinergyT2/qanu USB 2.0 DVB-T receiver KCONFIG:= CONFIG_DVB_USB_CINERGY_T2 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cinergyT2.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cinergy-t2/description Say Y here to support the Terratec CinergyT2/qanu USB 2.0 DVB-T receiver. The following modules will be compiled for this device : dvb-usb-cinergyT2 endef $(eval $(call KernelPackage,dvb-usb-cinergy-t2)) define KernelPackage/dvb-usb-anysee SUBMENU:=$(DVB_MENU) TITLE:=Anysee DVB-T/C USB2.0 KCONFIG:= CONFIG_DVB_USB_ANYSEE \ CONFIG_DVB_PLL \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TDA10023 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-anysee.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10023.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-anysee/description Say Y here to support the Anysee DVB-T/C USB2.0 . The following modules will be compiled for this device : dvb-usb-anysee dvb-pll mt352 zl10353 tda10023 endef $(eval $(call KernelPackage,dvb-usb-anysee)) define KernelPackage/dvb-usb-dtv5100 SUBMENU:=$(DVB_MENU) TITLE:=AME DTV-5100 USB2.0 DVB-T KCONFIG:= CONFIG_DVB_USB_DTV5100 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtv5100.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtv5100/description Say Y here to support the AME DTV-5100 USB2.0 DVB-T . The following modules will be compiled for this device : dvb-usb-dtv5100 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-dtv5100)) define KernelPackage/dvb-usb-af9015 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9015 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_AF9015 \ CONFIG_DVB_AF9013 \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA18271 \ CONFIG_MEDIA_TUNER_MXL5005S \ CONFIG_MEDIA_TUNER_MC44S803 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9015.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/af9013.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda18271.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mc44s803.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9015/description Say Y here to support the Afatech AF9015 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-af9015 af9013 dvb-pll mt2060 qt1010 tda18271 mxl5005s mc44s803 You have to put the firmware files in the download dir : dvb-usb-af9015.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9015_FW_0:=dvb-usb-af9015.fw define KernelPackage/dvb-usb-af9015/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9015_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9015)) define KernelPackage/dvb-usb-ce6230 SUBMENU:=$(DVB_MENU) TITLE:=Intel CE6230 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_CE6230 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ce6230.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ce6230/description Say Y here to support the Intel CE6230 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-ce6230 zl10353 mxl5005s endef $(eval $(call KernelPackage,dvb-usb-ce6230)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.31.6.mk000066400000000000000000000757041177353207000232400ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_MEDIA_SUPPORT \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_DVB_DYNAMIC_MINORS=n \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_S5H1411 \ CONFIG_DVB_LGDT3305 \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_MT2266 \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_XC5000 \ CONFIG_MEDIA_TUNER_MXL5007T DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/s5h1411.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt3305.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/xc5000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5007t.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib3000mc dibx000_common s5h1411 lgdt3305 dib0070 mt2060 mt2266 tuner-xc2028 xc5000 mxl5007t You have to put the firmware files in the download dir : dvb-usb-dib0700-1.20.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.20.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 mt352 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_LGS8GL5 \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_SIMPLE \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgs8gl5.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-simple.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-types.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 dib7000p dibx000_common lgs8gl5 dib0070 tuner-simple tuner-types tuner-xc2028 mxl5005s You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw dvb-usb-bluebird-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw DVB_USB_CXUSB_FW_1:=dvb-usb-bluebird-02.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TDA1004X \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA827X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda1004x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda827x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 tda1004x qt1010 tda827x You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw dvb-usb-tt-s2400-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw DVB_USB_TTUSB2_FW_1:=dvb-usb-tt-s2400-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) define KernelPackage/dvb-usb-dw2102 SUBMENU:=$(DVB_MENU) TITLE:=DvbWorld DVB-S/S2 USB2.0 KCONFIG:= CONFIG_DVB_USB_DW2102 \ CONFIG_DVB_PLL \ CONFIG_DVB_STV0299 \ CONFIG_DVB_STV0288 \ CONFIG_DVB_STB6000 \ CONFIG_DVB_CX24116 \ CONFIG_DVB_SI21XX \ CONFIG_DVB_TDA10021 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dw2102.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0288.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stb6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx24116.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/si21xx.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10021.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dw2102/description Say Y here to support the DvbWorld DVB-S/S2 USB2.0 . The following modules will be compiled for this device : dvb-usb-dw2102 dvb-pll stv0299 stv0288 stb6000 cx24116 si21xx tda10021 You have to put the firmware files in the download dir : dvb-usb-dw2102.fw dvb-usb-dw2104.fw dvb-usb-dw3101.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DW2102_FW_0:=dvb-usb-dw2102.fw DVB_USB_DW2102_FW_1:=dvb-usb-dw2104.fw DVB_USB_DW2102_FW_2:=dvb-usb-dw3101.fw define KernelPackage/dvb-usb-dw2102/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_2) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dw2102)) define KernelPackage/dvb-usb-cinergy-t2 SUBMENU:=$(DVB_MENU) TITLE:=Terratec CinergyT2/qanu USB 2.0 DVB-T receiver KCONFIG:= CONFIG_DVB_USB_CINERGY_T2 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cinergyT2.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cinergy-t2/description Say Y here to support the Terratec CinergyT2/qanu USB 2.0 DVB-T receiver. The following modules will be compiled for this device : dvb-usb-cinergyT2 endef $(eval $(call KernelPackage,dvb-usb-cinergy-t2)) define KernelPackage/dvb-usb-anysee SUBMENU:=$(DVB_MENU) TITLE:=Anysee DVB-T/C USB2.0 KCONFIG:= CONFIG_DVB_USB_ANYSEE \ CONFIG_DVB_PLL \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TDA10023 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-anysee.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10023.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-anysee/description Say Y here to support the Anysee DVB-T/C USB2.0 . The following modules will be compiled for this device : dvb-usb-anysee dvb-pll mt352 zl10353 tda10023 endef $(eval $(call KernelPackage,dvb-usb-anysee)) define KernelPackage/dvb-usb-dtv5100 SUBMENU:=$(DVB_MENU) TITLE:=AME DTV-5100 USB2.0 DVB-T KCONFIG:= CONFIG_DVB_USB_DTV5100 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtv5100.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtv5100/description Say Y here to support the AME DTV-5100 USB2.0 DVB-T . The following modules will be compiled for this device : dvb-usb-dtv5100 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-dtv5100)) define KernelPackage/dvb-usb-af9015 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9015 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_AF9015 \ CONFIG_DVB_AF9013 \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA18271 \ CONFIG_MEDIA_TUNER_MXL5005S \ CONFIG_MEDIA_TUNER_MC44S803 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9015.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/af9013.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda18271.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mc44s803.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9015/description Say Y here to support the Afatech AF9015 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-af9015 af9013 dvb-pll mt2060 qt1010 tda18271 mxl5005s mc44s803 You have to put the firmware files in the download dir : dvb-usb-af9015.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9015_FW_0:=dvb-usb-af9015.fw define KernelPackage/dvb-usb-af9015/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9015_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9015)) define KernelPackage/dvb-usb-ce6230 SUBMENU:=$(DVB_MENU) TITLE:=Intel CE6230 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_CE6230 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ce6230.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ce6230/description Say Y here to support the Intel CE6230 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-ce6230 zl10353 mxl5005s endef $(eval $(call KernelPackage,dvb-usb-ce6230)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.2.6.32.mk000066400000000000000000000776721177353207000231030ustar00rootroot00000000000000 # # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # # # !!!! This is a generated file !!!! # DVB_MENU:=DVB support # # General section # define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_MEDIA_SUPPORT \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_MEDIA_TUNER_CUSTOMIZE=y \ CONFIG_DVB_FE_CUSTOMISE=y \ CONFIG_DVB_DYNAMIC_MINORS=n \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select at least a device. endef $(eval $(call KernelPackage,dvb-usb)) # # Devices section # define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 KCONFIG:= CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-a800 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-avertv-a800-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_A800_FW_0:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_A800_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mb/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mb dvb-pll dib3000mb mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-5.0.0.11.fw dvb-usb-dibusb-an2235-01.fw dvb-usb-adstech-usb2-02.fw dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MB_FW_0:=dvb-usb-dibusb-5.0.0.11.fw DVB_USB_DIBUSB_MB_FW_1:=dvb-usb-dibusb-an2235-01.fw DVB_USB_DIBUSB_MB_FW_2:=dvb-usb-adstech-usb2-02.fw DVB_USB_DIBUSB_MB_FW_3:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MB_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T devices KCONFIG:= CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dibusb-mc/description Say Y here to support the DiBcom USB DVB-T devices . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-dibusb-mc dib3000mc dibx000_common mt2060 You have to put the firmware files in the download dir : dvb-usb-dibusb-6.0.0.8.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIBUSB_MC_FW_0:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIBUSB_MC_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dib0700 SUBMENU:=$(DVB_MENU) TITLE:=DiBcom DiB0700 USB DVB devices KCONFIG:= CONFIG_DVB_USB_DIB0700 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_DIB7000M \ CONFIG_DVB_DIB8000 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_S5H1411 \ CONFIG_DVB_LGDT3305 \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_MT2266 \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_XC5000 \ CONFIG_MEDIA_TUNER_MXL5007T DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dib0700.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000m.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib8000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/s5h1411.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt3305.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2266.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/xc5000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5007t.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dib0700/description Say Y here to support the DiBcom DiB0700 USB DVB devices . The following modules will be compiled for this device : dvb-usb-dib0700 dib7000p dibx000_common dib7000m dibx000_common dib8000 dibx000_common dib3000mc dibx000_common s5h1411 lgdt3305 dib0070 mt2060 mt2266 tuner-xc2028 xc5000 mxl5007t You have to put the firmware files in the download dir : dvb-usb-dib0700-1.20.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIB0700_FW_0:=dvb-usb-dib0700-1.20.fw define KernelPackage/dvb-usb-dib0700/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIB0700_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dib0700)) define KernelPackage/dvb-usb-umt-010 SUBMENU:=$(DVB_MENU) TITLE:=HanfTek UMT-010 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_UMT_010 \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-umt-010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-umt-010/description Say Y here to support the HanfTek UMT-010 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-umt-010 dvb-pll dib3000mc dibx000_common mt2060 mt352 You have to put the firmware files in the download dir : dvb-usb-umt-010-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_UMT_010_FW_0:=dvb-usb-umt-010-02.fw define KernelPackage/dvb-usb-umt-010/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_UMT_010_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-umt-010)) define KernelPackage/dvb-usb-cxusb SUBMENU:=$(DVB_MENU) TITLE:=Conexant USB2.0 hybrid reference design KCONFIG:= CONFIG_DVB_USB_CXUSB \ CONFIG_DVB_PLL \ CONFIG_DVB_CX22702 \ CONFIG_DVB_LGDT330X \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_DIB7000P \ CONFIG_DVB_LGS8GL5 \ CONFIG_DVB_TUNER_DIB0070 \ CONFIG_MEDIA_TUNER_SIMPLE \ CONFIG_MEDIA_TUNER_XC2028 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cxusb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx22702.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgdt330x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib7000p.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lgs8gl5.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib0070.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-simple.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-types.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tuner-xc2028.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cxusb/description Say Y here to support the Conexant USB2.0 hybrid reference design . The following modules will be compiled for this device : dvb-usb-cxusb dvb-pll cx22702 lgdt330x mt352 zl10353 dib7000p dibx000_common lgs8gl5 dib0070 tuner-simple tuner-types tuner-xc2028 mxl5005s You have to put the firmware files in the download dir : dvb-usb-bluebird-01.fw dvb-usb-bluebird-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_CXUSB_FW_0:=dvb-usb-bluebird-01.fw DVB_USB_CXUSB_FW_1:=dvb-usb-bluebird-02.fw define KernelPackage/dvb-usb-cxusb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_CXUSB_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-cxusb)) define KernelPackage/dvb-usb-m920x SUBMENU:=$(DVB_MENU) TITLE:=Uli m920x DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_M920X \ CONFIG_DVB_MT352 \ CONFIG_DVB_TDA1004X \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA827X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-m920x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda1004x.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda827x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-m920x/description Say Y here to support the Uli m920x DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-m920x mt352 tda1004x qt1010 tda827x You have to put the firmware files in the download dir : dvb-usb-megasky-02.fw dvb-usb-digivox-02.fw dvb-usb-tvwalkert.fw dvb-usb-dposh-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_M920X_FW_0:=dvb-usb-megasky-02.fw DVB_USB_M920X_FW_1:=dvb-usb-digivox-02.fw DVB_USB_M920X_FW_2:=dvb-usb-tvwalkert.fw DVB_USB_M920X_FW_3:=dvb-usb-dposh-01.fw define KernelPackage/dvb-usb-m920x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_M920X_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-m920x)) define KernelPackage/dvb-usb-gl861 SUBMENU:=$(DVB_MENU) TITLE:=Genesys Logic GL861 USB2.0 KCONFIG:= CONFIG_DVB_USB_GL861 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gl861.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gl861/description Say Y here to support the Genesys Logic GL861 USB2.0 . The following modules will be compiled for this device : dvb-usb-gl861 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-gl861)) define KernelPackage/dvb-usb-au6610 SUBMENU:=$(DVB_MENU) TITLE:=Alcor Micro AU6610 USB2.0 KCONFIG:= CONFIG_DVB_USB_AU6610 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-au6610.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-au6610/description Say Y here to support the Alcor Micro AU6610 USB2.0 . The following modules will be compiled for this device : dvb-usb-au6610 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-au6610)) define KernelPackage/dvb-usb-digitv SUBMENU:=$(DVB_MENU) TITLE:=Nebula Electronics uDigiTV DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DIGITV \ CONFIG_DVB_PLL \ CONFIG_DVB_NXT6000 \ CONFIG_DVB_MT352 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-digitv.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/nxt6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-digitv/description Say Y here to support the Nebula Electronics uDigiTV DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-digitv dvb-pll nxt6000 mt352 You have to put the firmware files in the download dir : dvb-usb-digitv-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DIGITV_FW_0:=dvb-usb-digitv-02.fw define KernelPackage/dvb-usb-digitv/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DIGITV_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-digitv)) define KernelPackage/dvb-usb-vp7045 SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle KCONFIG:= CONFIG_DVB_USB_VP7045 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp7045.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp7045/description Say Y here to support the TwinhanDTV Alpha/MagicBoxII, DNTV tinyUSB2, Beetle. The following modules will be compiled for this device : dvb-usb-vp7045 You have to put the firmware files in the download dir : dvb-usb-vp7045-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP7045_FW_0:=dvb-usb-vp7045-01.fw define KernelPackage/dvb-usb-vp7045/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP7045_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp7045)) define KernelPackage/dvb-usb-vp702x SUBMENU:=$(DVB_MENU) TITLE:=TwinhanDTV StarBox and clones DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_VP702X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-vp702x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-vp702x/description Say Y here to support the TwinhanDTV StarBox and clones DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-vp702x You have to put the firmware files in the download dir : dvb-usb-vp702x-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_VP702X_FW_0:=dvb-usb-vp702x-02.fw define KernelPackage/dvb-usb-vp702x/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_VP702X_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-vp702x)) define KernelPackage/dvb-usb-gp8psk SUBMENU:=$(DVB_MENU) TITLE:=GENPIX 8PSK->USB module KCONFIG:= CONFIG_DVB_USB_GP8PSK DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-gp8psk.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-gp8psk/description Say Y here to support the GENPIX 8PSK->USB module . The following modules will be compiled for this device : dvb-usb-gp8psk You have to put the firmware files in the download dir : dvb-usb-gp8psk-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_GP8PSK_FW_0:=dvb-usb-gp8psk-01.fw define KernelPackage/dvb-usb-gp8psk/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_GP8PSK_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-gp8psk)) define KernelPackage/dvb-usb-nova-t-usb2 SUBMENU:=$(DVB_MENU) TITLE:=Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_NOVA_T_USB2 \ CONFIG_DVB_DIB3000MC \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-nova-t-usb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-nova-t-usb2/description Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dibusb-common dvb-usb-nova-t-usb2 dib3000mc dibx000_common dvb-pll mt2060 You have to put the firmware files in the download dir : dvb-usb-nova-t-usb2-02.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_NOVA_T_USB2_FW_0:=dvb-usb-nova-t-usb2-02.fw define KernelPackage/dvb-usb-nova-t-usb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_NOVA_T_USB2_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-nova-t-usb2)) define KernelPackage/dvb-usb-ttusb2 SUBMENU:=$(DVB_MENU) TITLE:=Pinnacle 400e DVB-S USB2.0 KCONFIG:= CONFIG_DVB_USB_TTUSB2 \ CONFIG_DVB_TDA10086 \ CONFIG_DVB_LNBP21 \ CONFIG_DVB_TDA826X DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ttusb2.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10086.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/lnbp21.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda826x.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ttusb2/description Say Y here to support the Pinnacle 400e DVB-S USB2.0 . The following modules will be compiled for this device : dvb-usb-ttusb2 tda10086 lnbp21 tda826x You have to put the firmware files in the download dir : dvb-usb-pctv-400e-01.fw dvb-usb-tt-s2400-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_TTUSB2_FW_0:=dvb-usb-pctv-400e-01.fw DVB_USB_TTUSB2_FW_1:=dvb-usb-tt-s2400-01.fw define KernelPackage/dvb-usb-ttusb2/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_TTUSB2_FW_1) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-ttusb2)) define KernelPackage/dvb-usb-dtt200u SUBMENU:=$(DVB_MENU) TITLE:=WideView WT-200U and WT-220U DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_DTT200U DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtt200u.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtt200u/description Say Y here to support the WideView WT-200U and WT-220U DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-dtt200u You have to put the firmware files in the download dir : dvb-usb-dtt200u-01.fw dvb-usb-wt220u-02.fw dvb-usb-wt220u-fc03.fw dvb-usb-wt220u-zl0353-01.fw dvb-usb-wt220u-miglia-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DTT200U_FW_0:=dvb-usb-dtt200u-01.fw DVB_USB_DTT200U_FW_1:=dvb-usb-wt220u-02.fw DVB_USB_DTT200U_FW_2:=dvb-usb-wt220u-fc03.fw DVB_USB_DTT200U_FW_3:=dvb-usb-wt220u-zl0353-01.fw DVB_USB_DTT200U_FW_4:=dvb-usb-wt220u-miglia-01.fw define KernelPackage/dvb-usb-dtt200u/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_3) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DTT200U_FW_4) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dtt200u)) define KernelPackage/dvb-usb-opera1 SUBMENU:=$(DVB_MENU) TITLE:=Opera1 DVB-S USB2.0 receiver KCONFIG:= CONFIG_DVB_USB_OPERA1 \ CONFIG_DVB_STV0299 \ CONFIG_DVB_PLL DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-opera.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-opera1/description Say Y here to support the Opera1 DVB-S USB2.0 receiver. The following modules will be compiled for this device : dvb-usb-opera stv0299 dvb-pll You have to put the firmware files in the download dir : dvb-usb-opera-01.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_OPERA1_FW_0:=dvb-usb-opera-01.fw define KernelPackage/dvb-usb-opera1/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_OPERA1_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-opera1)) define KernelPackage/dvb-usb-af9005 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 DVB-T USB1.1 KCONFIG:= CONFIG_DVB_USB_AF9005 \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005/description Say Y here to support the Afatech AF9005 DVB-T USB1.1 . The following modules will be compiled for this device : dvb-usb-af9005 dvb-usb-af9005-remote mt2060 qt1010 You have to put the firmware files in the download dir : af9005.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9005_FW_0:=af9005.fw define KernelPackage/dvb-usb-af9005/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9005_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9005)) define KernelPackage/dvb-usb-af9005-remote SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9005 default remote control KCONFIG:= CONFIG_DVB_USB_AF9005_REMOTE DEPENDS:=+kmod-dvb-usb-af9005 FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9005-remote.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9005-remote/description Say Y here to support the Afatech AF9005 default remote control . The following modules will be compiled for this device : dvb-usb-af9005-remote endef $(eval $(call KernelPackage,dvb-usb-af9005-remote)) define KernelPackage/dvb-usb-dw2102 SUBMENU:=$(DVB_MENU) TITLE:=DvbWorld & TeVii DVB-S/S2 USB2.0 KCONFIG:= CONFIG_DVB_USB_DW2102 \ CONFIG_DVB_PLL \ CONFIG_DVB_STV0299 \ CONFIG_DVB_STV0288 \ CONFIG_DVB_STB6000 \ CONFIG_DVB_CX24116 \ CONFIG_DVB_SI21XX \ CONFIG_DVB_TDA10021 \ CONFIG_DVB_MT312 \ CONFIG_DVB_ZL10039 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dw2102.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0299.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stv0288.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/stb6000.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/cx24116.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/si21xx.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10021.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt312.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10039.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dw2102/description Say Y here to support the DvbWorld & TeVii DVB-S/S2 USB2.0 . The following modules will be compiled for this device : dvb-usb-dw2102 dvb-pll stv0299 stv0288 stb6000 cx24116 si21xx tda10021 mt312 zl10039 You have to put the firmware files in the download dir : dvb-usb-dw2102.fw dvb-usb-dw2104.fw dvb-usb-dw3101.fw dvb-usb-s630.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_DW2102_FW_0:=dvb-usb-dw2102.fw DVB_USB_DW2102_FW_1:=dvb-usb-dw2104.fw DVB_USB_DW2102_FW_2:=dvb-usb-dw3101.fw DVB_USB_DW2102_FW_3:=dvb-usb-s630.fw define KernelPackage/dvb-usb-dw2102/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_0) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_2) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_DW2102_FW_3) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-dw2102)) define KernelPackage/dvb-usb-cinergy-t2 SUBMENU:=$(DVB_MENU) TITLE:=Terratec CinergyT2/qanu USB 2.0 DVB-T receiver KCONFIG:= CONFIG_DVB_USB_CINERGY_T2 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-cinergyT2.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-cinergy-t2/description Say Y here to support the Terratec CinergyT2/qanu USB 2.0 DVB-T receiver. The following modules will be compiled for this device : dvb-usb-cinergyT2 endef $(eval $(call KernelPackage,dvb-usb-cinergy-t2)) define KernelPackage/dvb-usb-anysee SUBMENU:=$(DVB_MENU) TITLE:=Anysee DVB-T/C USB2.0 KCONFIG:= CONFIG_DVB_USB_ANYSEE \ CONFIG_DVB_PLL \ CONFIG_DVB_MT352 \ CONFIG_DVB_ZL10353 \ CONFIG_DVB_TDA10023 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-anysee.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/mt352.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/tda10023.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-anysee/description Say Y here to support the Anysee DVB-T/C USB2.0 . The following modules will be compiled for this device : dvb-usb-anysee dvb-pll mt352 zl10353 tda10023 endef $(eval $(call KernelPackage,dvb-usb-anysee)) define KernelPackage/dvb-usb-dtv5100 SUBMENU:=$(DVB_MENU) TITLE:=AME DTV-5100 USB2.0 DVB-T KCONFIG:= CONFIG_DVB_USB_DTV5100 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_QT1010 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dtv5100.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-dtv5100/description Say Y here to support the AME DTV-5100 USB2.0 DVB-T . The following modules will be compiled for this device : dvb-usb-dtv5100 zl10353 qt1010 endef $(eval $(call KernelPackage,dvb-usb-dtv5100)) define KernelPackage/dvb-usb-af9015 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9015 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_AF9015 \ CONFIG_DVB_AF9013 \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA18271 \ CONFIG_MEDIA_TUNER_MXL5005S \ CONFIG_MEDIA_TUNER_MC44S803 DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9015.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/af9013.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda18271.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mc44s803.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-af9015/description Say Y here to support the Afatech AF9015 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-af9015 af9013 dvb-pll mt2060 qt1010 tda18271 mxl5005s mc44s803 You have to put the firmware files in the download dir : dvb-usb-af9015.fw They can be found in the package http://packages.ubuntu.com/jaunty/linux-firmware . endef DVB_USB_AF9015_FW_0:=dvb-usb-af9015.fw define KernelPackage/dvb-usb-af9015/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DVB_USB_AF9015_FW_0) $(1)/lib/firmware/ endef $(eval $(call KernelPackage,dvb-usb-af9015)) define KernelPackage/dvb-usb-ce6230 SUBMENU:=$(DVB_MENU) TITLE:=Intel CE6230 DVB-T USB2.0 KCONFIG:= CONFIG_DVB_USB_CE6230 \ CONFIG_DVB_ZL10353 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-ce6230.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/zl10353.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-ce6230/description Say Y here to support the Intel CE6230 DVB-T USB2.0 . The following modules will be compiled for this device : dvb-usb-ce6230 zl10353 mxl5005s endef $(eval $(call KernelPackage,dvb-usb-ce6230)) define KernelPackage/dvb-usb-friio SUBMENU:=$(DVB_MENU) TITLE:=Friio ISDB-T USB2.0 Receiver KCONFIG:= CONFIG_DVB_USB_FRIIO DEPENDS:=+kmod-dvb-usb FILES:= $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-friio.$(LINUX_KMOD_SUFFIX) endef define KernelPackage/dvb-usb-friio/description Say Y here to support the Friio ISDB-T USB2.0 Receiver . The following modules will be compiled for this device : dvb-usb-friio endef $(eval $(call KernelPackage,dvb-usb-friio)) mumudvb-1.7.1/openwrt/package/kernel/modules/dvb.mk000066400000000000000000000205231177353207000223330ustar00rootroot00000000000000# # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # DVB_MENU:=DVB support define KernelPackage/dvb-core SUBMENU:=$(DVB_MENU) TITLE:=DVB core support DEPENDS:=@LINUX_2_6 +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_CORE \ CONFIG_DVB_CAPTURE_DRIVERS=y \ CONFIG_CRC32 FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-core/dvb-core.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,50,dvb-core) endef define KernelPackage/dvb-core/description Kernel module for DVB support endef $(eval $(call KernelPackage,dvb-core)) define KernelPackage/dvb-usb SUBMENU:=$(DVB_MENU) TITLE:=DVB USB Support DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-usb-core +kmod-i2c-core KCONFIG:= \ CONFIG_DVB_USB \ CONFIG_INPUT=y FILES:=$(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call AutoLoad,55,dvb-usb) endef define KernelPackage/dvb-usb/description Kernel module for DVB USB devices. Note you have to select a device. endef $(eval $(call KernelPackage,dvb-usb)) define KernelPackage/dvb-usb-a800 SUBMENU:=$(DVB_MENU) TITLE:=AVerMedia AverTV DVB-T USB 2.0 (A800) receiver KCONFIG:= \ CONFIG_DVB_USB_A800 \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-dvb-usb +kmod-usb-core +kmod-i2c-core FILES:= \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-a800.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) # AUTOLOAD:=$(call Autoload,60, \ # dvb-pll \ # dibx000_common \ # dib3000mc \ # mt2060 \ # dvb-usb-dibusb-common \ # dvb-usb-a800 \ # ) endef A800_FW:=dvb-usb-avertv-a800-02.fw define KernelPackage/dvb-usb-a800/description Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 (A800) receiver. The firmware will be downloaded from http://www.linuxtv.org/downloads/firmware/ If the download fail put the firmware $(A800_FW) in the openwrt download directory. endef define Download/dvb-usb-a800 FILE:=$(A800_FW) URL:=http://www.linuxtv.org/downloads/firmware/ endef define KernelPackage/dvb-usb-a800/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(A800_FW) $(1)/lib/firmware/ endef $(eval $(call Download,dvb-usb-a800)) $(eval $(call KernelPackage,dvb-usb-a800)) define KernelPackage/dvb-usb-af9015 SUBMENU:=$(DVB_MENU) TITLE:=Afatech AF9015 DVB-T USB2.0 support KCONFIG:= \ CONFIG_DVB_USB_AF9015 \ CONFIG_DVB_AF9013 \ CONFIG_DVB_PLL \ CONFIG_MEDIA_TUNER_MT2060 \ CONFIG_MEDIA_TUNER_QT1010 \ CONFIG_MEDIA_TUNER_TDA18271 \ CONFIG_MEDIA_TUNER_MXL5005S DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-dvb-usb +kmod-usb-core +kmod-i2c-core FILES:= \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-af9015.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/af9013.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/qt1010.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/tda18271.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mxl5005s.$(LINUX_KMOD_SUFFIX) endef AF9015_FW:=dvb-usb-af9015.fw define KernelPackage/dvb-usb-af9015/description Supported devices : * Afatech AF9015 DVB-T USB2.0 stick * Leadtek WinFast DTV Dongle Gold * Pinnacle PCTV 71e * KWorld PlusTV Dual DVB-T Stick (DVB-T 399U) * DigitalNow TinyTwin DVB-T Receiver * TwinHan AzureWave AD-TU700(704J) * TerraTec Cinergy T USB XE * KWorld PlusTV Dual DVB-T PCI (DVB-T PC160-2T) * AVerMedia AVerTV DVB-T Volar X * Xtensions XD-380 * MSI DIGIVOX Duo * Fujitsu-Siemens Slim Mobile USB DVB-T * Telestar Starstick 2 * AVerMedia A309 * MSI Digi VOX mini III The firmware will be downloaded from http://www.otit.fi/~crope/v4l-dvb/, version 4.65.0 If the download fail put the firmware $(AF9015_FW) in the openwrt download directory. endef define Download/dvb-usb-af9015 FILE:=$(AF9015_FW) URL:=http://www.otit.fi/~crope/v4l-dvb/af9015/af9015_firmware_cutter/firmware_files/4.65.0/ MD5SUM:=532b8e1eabd3b4e9f8ca084b767e4470 endef define KernelPackage/dvb-usb-af9015/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(AF9015_FW) $(1)/lib/firmware/ endef $(eval $(call Download,dvb-usb-af9015)) $(eval $(call KernelPackage,dvb-usb-af9015)) define KernelPackage/dvb-usb-dibusb-mc SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T (DiB3000M-C/P based devices) KCONFIG:= \ CONFIG_DVB_USB_DIBUSB_MC \ CONFIG_DVB_DIB3000MC \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-dvb-usb +kmod-usb-core +kmod-i2c-core FILES:= \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dibx000_common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mc.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef DIBUSB-MC_FW:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mc/description Supported devices : * DiBcom USB2.0 DVB-T reference design (MOD3000P) * Artec T1 USB2.0 TVBOX (please check the warm ID) * LITE-ON USB2.0 DVB-T Tuner * MSI Digivox Mini SL * GRAND - USB2.0 DVB-T adapter * Artec T14 - USB2.0 DVB-T * Leadtek - USB2.0 Winfast DTV dongle The firmware will be downloaded from http://www.linuxtv.org/downloads/firmware/ If the download fail put the firmware $(DIBUSB-MC_FW) in the openwrt download directory. endef define Download/dvb-usb-dibusb-mc FILE:=$(DIBUSB-MC_FW) URL:=http://www.linuxtv.org/downloads/firmware/ endef define KernelPackage/dvb-usb-dibusb-mc/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DIBUSB-MC_FW) $(1)/lib/firmware/ endef $(eval $(call Download,dvb-usb-dibusb-mc)) $(eval $(call KernelPackage,dvb-usb-dibusb-mc)) define KernelPackage/dvb-usb-dibusb-mb SUBMENU:=$(DVB_MENU) TITLE:=DiBcom USB DVB-T (DiB3000M-B based devices) KCONFIG:= \ CONFIG_DVB_USB_DIBUSB_MB \ CONFIG_DVB_PLL \ CONFIG_DVB_DIB3000MB \ CONFIG_MEDIA_TUNER_MT2060 DEPENDS:=@USB_SUPPORT +kmod-dvb-core +kmod-dvb-usb +kmod-usb-core +kmod-i2c-core FILES:= \ $(LINUX_DIR)/drivers/media/dvb/frontends/dvb-pll.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-dibusb-common.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/dvb-usb/dvb-usb-mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/dvb/frontends/dib3000mb.$(LINUX_KMOD_SUFFIX) \ $(LINUX_DIR)/drivers/media/common/tuners/mt2060.$(LINUX_KMOD_SUFFIX) endef DIBUSB-MB_FW1:=dvb-usb-dibusb-5.0.0.11.fw DIBUSB-MB_FW2:=dvb-usb-dibusb-6.0.0.8.fw define KernelPackage/dvb-usb-dibusb-mb/description Supported devices : * AVerMedia AverTV DVBT USB1.1 * Compro Videomate DVB-U2000 - DVB-T USB1.1 (please confirm to linux-dvb) * DiBcom USB1.1 DVB-T reference design (MOD3000) * KWorld V-Stream XPERT DTV - DVB-T USB1.1 * Grandtec USB1.1 DVB-T * TwinhanDTV USB-Ter USB1.1 / Magic Box I / HAMA USB1.1 DVB-T device * Artec T1 USB1.1 TVBOX with AN2135 * VideoWalker DVB-T USB * Artec T1 USB2.0 Supported but you have to add the firmware by hand : * KWorld Xpert DVB-T USB2.0 * KWorld/ADSTech Instant DVB-T USB2.0 * Artec T1 USB1.1 TVBOX with AN2235 The firmware will be downloaded from http://www.linuxtv.org/downloads/firmware/ If the download fail put the firmware $(DIBUSB-MB_FW1) $(DIBUSB-MB_FW2) in the openwrt download directory. endef define Download/dvb-usb-dibusb-mb1 FILE:=$(DIBUSB-MB_FW1) URL:=http://www.linuxtv.org/downloads/firmware/ endef define Download/dvb-usb-dibusb-mb2 FILE:=$(DIBUSB-MB_FW2) URL:=http://www.linuxtv.org/downloads/firmware/ endef define KernelPackage/dvb-usb-dibusb-mb/install $(INSTALL_DIR) $(1)/lib/firmware $(INSTALL_DATA) $(DL_DIR)/$(DIBUSB-MB_FW1) $(1)/lib/firmware/ $(INSTALL_DATA) $(DL_DIR)/$(DIBUSB-MB_FW2) $(1)/lib/firmware/ endef $(eval $(call Download,dvb-usb-dibusb-mb1)) $(eval $(call Download,dvb-usb-dibusb-mb2)) $(eval $(call KernelPackage,dvb-usb-dibusb-mb)) mumudvb-1.7.1/openwrt/packages/000077500000000000000000000000001177353207000164605ustar00rootroot00000000000000mumudvb-1.7.1/openwrt/packages/mumudvb/000077500000000000000000000000001177353207000201375ustar00rootroot00000000000000mumudvb-1.7.1/openwrt/packages/mumudvb/Makefile000066400000000000000000000017201177353207000215770ustar00rootroot00000000000000# # Copyright (C) 2009 Brice DUBOST # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mumudvb PKG_VERSION:=1.6.1-openwrt PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=http://mumudvb.braice.net/mumudvb/mumudvb-beta PKG_BUILD_DIR:=$(BUILD_DIR)/mumudvb EXTRA_CPPFLAGS+=-std=gnu99 include $(INCLUDE_DIR)/package.mk define Package/mumudvb SECTION:=utils CATEGORY:=Utilities DEFAULT:=n TITLE:=MuMuDVB streaming software URL:=http://mumudvb.braice.net/ endef define Package/mumudvb/description MuMuDVB streaming software endef define Build/Configure $(call Build/Configure/Default,--with-linux-headers=$(LINUX_DIR)) endef define Package/mumudvb/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mumudvb $(1)/usr/bin/mumudvb endef $(eval $(call BuildPackage,mumudvb)) mumudvb-1.7.1/scripts/000077500000000000000000000000001177353207000146735ustar00rootroot00000000000000mumudvb-1.7.1/scripts/debian/000077500000000000000000000000001177353207000161155ustar00rootroot00000000000000mumudvb-1.7.1/scripts/debian/README000066400000000000000000000003441177353207000167760ustar00rootroot00000000000000Startup scripts for mumudvb (Debian flavour) This script expects to find /etc/default/mumudvb, with the syntax specified in the example file These scripts can be used to use monit to monitor mumudvb (http://mmonit.com/monit/) mumudvb-1.7.1/scripts/debian/etc/000077500000000000000000000000001177353207000166705ustar00rootroot00000000000000mumudvb-1.7.1/scripts/debian/etc/default/000077500000000000000000000000001177353207000203145ustar00rootroot00000000000000mumudvb-1.7.1/scripts/debian/etc/default/mumudvb000066400000000000000000000011721177353207000217170ustar00rootroot00000000000000#Mumudvb init config file # # This file is used to specify the locations of mumudvb config files for each card # #If you don't want to automatically start mumudvb, uncomment this line #DONTSTARTMUMU=true #If you want to launch a command before mumudvb (for example for automatic configuration generation) #LAUNCH_BEFORE_MUMU="" #Options for mumudvb DAEMON_OPTS="" #The user to launch mumudvb DAEMONUSER=_mumudvb #Change this line to reflect your configuration #Ex : ADAPTERS="0 1 2 4" ADAPTERS="0" #Location of the config files #Ex : MUMUDVB_CONF_1="/etc/mumudvb/card1.conf" MUMUDVB_CONF_0="/etc/mumudvb/to_be_configured.conf" mumudvb-1.7.1/scripts/debian/etc/init.d/000077500000000000000000000000001177353207000200555ustar00rootroot00000000000000mumudvb-1.7.1/scripts/debian/etc/init.d/mumudvb000077500000000000000000000045401177353207000214650ustar00rootroot00000000000000#!/bin/sh ### BEGIN INIT INFO # Provides: mumudvb # Required-Start: $remote_fs $network $syslog # Required-Stop: $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: mumudvb # Description: Digital television streaming program ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/bin/mumudvb PIDDIR=/var/run/mumudvb DEFAULT_FILE=/etc/default/mumudvb NAME=mumudvb DESC="television streaming program" #Reading of the config file if [ -f "$DEFAULT_FILE" ] ; then . "$DEFAULT_FILE" fi if [ "$DONTSTARTMUMU" = "true" ]; then exit 0; fi . /lib/lsb/init-functions test -x $DAEMON || exit 5 set -e do_start() { if [ ! -d $PIDDIR ]; then mkdir -p $PIDDIR fi chown $DAEMONUSER $PIDDIR if [ -x "$LAUNCH_BEFORE_MUMU" ]; then log_daemon_msg "Launching pre script ..." eval $LAUNCH_BEFORE_MUMU log_daemon_msg "Done." fi for ADAPTER in $ADAPTERS; do #Todo : fails if all card fails log_daemon_msg " Starting card $ADAPTER" eval CONFIG_FILE=\$MUMUDVB_CONF_$ADAPTER if [ ! -f $CONFIG_FILE ]; then log_warning_msg " Card $ADAPTER: Config file $CONFIG_FILE not found." else start-stop-daemon --start --oknodo --pidfile "$PIDDIR/mumudvb_carte$ADAPTER.pid"\ --chuid $DAEMONUSER --exec $DAEMON -- $DAEMON_OPTS --card $ADAPTER -c $CONFIG_FILE fi done } do_stop() { for PIDFILE in `ls $PIDDIR/mumudvb_carte*.pid 2> /dev/null`; do start-stop-daemon --stop --oknodo --pidfile "$PIDFILE" \ --exec $DAEMON done } case "$1" in start) if [ ! -f "$DEFAULT_FILE" ]; then log_failure_msg "$DEFAULT_FILE not found, Can't start $NAME" exit 6 fi log_daemon_msg "Starting $DESC: $NAME" do_start log_end_msg $? ;; stop) log_daemon_msg "Stopping $DESC: $NAME" do_stop log_end_msg $? ;; restart|force-reload) log_daemon_msg "Restarting $DESC: $NAME" do_stop sleep 1 do_start log_end_msg $? ;; status) status_of_proc "$DAEMON" "$DESC: $NAME" && exit 0 || exit $? ;; *) log_success_msg "Usage: $0 {start|stop|restart|force-reload|status}" >&2 exit 1 ;; esac exit 0 mumudvb-1.7.1/src/000077500000000000000000000000001177353207000137735ustar00rootroot00000000000000mumudvb-1.7.1/src/Makefile.am000066400000000000000000000025501177353207000160310ustar00rootroot00000000000000# what flags you want to pass to the C compiler & linker AM_CFLAGS = -Wall -Wextra AM_LDFLAGS = check_PROGRAMS = mumudvb_test mumudvb_test_SOURCES = mumudvb_test.c autoconf.c crc32.c dvb.h log.c log.h multicast.c mumudvb.h network.h rewrite.h \ rtp.h sap.h ts.h tune.h unicast_http.h autoconf.h dvb.c errors.h \ mumudvb_common.c network.c pat_rewrite.c rewrite.c sdt_rewrite.c \ rtp.c sap.c ts.c tune.c unicast_http.c unicast_queue.c autoconf_sdt.c autoconf_atsc.c \ autoconf_pmt.c autoconf_nit.c unicast_clients.c bin_PROGRAMS = mumudvb mumudvb_SOURCES = autoconf.c crc32.c dvb.h log.c log.h multicast.c mumudvb.h network.h rewrite.h \ rtp.h sap.h ts.h tune.h unicast_http.h autoconf.h dvb.c errors.h \ mumudvb.c mumudvb_common.c network.c pat_rewrite.c rewrite.c sdt_rewrite.c \ rtp.c sap.c ts.c tune.c unicast_http.c unicast_queue.c autoconf_sdt.c autoconf_atsc.c \ autoconf_pmt.c autoconf_nit.c unicast_clients.c if BUILD_CAMSUPPORT mumudvb_SOURCES += $(SOURCES_camsupport) endif SOURCES_camsupport = \ cam.c \ cam.h \ $(NULL) if BUILD_TRANSCODING mumudvb_SOURCES += $(SOURCES_transcoding) endif SOURCES_transcoding = \ transcode.c \ transcode.h \ transcode_common.c \ transcode_common.h \ transcode_avlib.c \ transcode_avlib.h \ transcode_queues.c \ transcode_queues.h \ $(NULL) mumudvb-1.7.1/src/Makefile.in000066400000000000000000000501451177353207000160450ustar00rootroot00000000000000# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = mumudvb_test$(EXEEXT) bin_PROGRAMS = mumudvb$(EXEEXT) @BUILD_CAMSUPPORT_TRUE@am__append_1 = $(SOURCES_camsupport) @BUILD_TRANSCODING_TRUE@am__append_2 = $(SOURCES_transcoding) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__mumudvb_SOURCES_DIST = autoconf.c crc32.c dvb.h log.c log.h \ multicast.c mumudvb.h network.h rewrite.h rtp.h sap.h ts.h \ tune.h unicast_http.h autoconf.h dvb.c errors.h mumudvb.c \ mumudvb_common.c network.c pat_rewrite.c rewrite.c \ sdt_rewrite.c rtp.c sap.c ts.c tune.c unicast_http.c \ unicast_queue.c autoconf_sdt.c autoconf_atsc.c autoconf_pmt.c \ autoconf_nit.c unicast_clients.c cam.c cam.h transcode.c \ transcode.h transcode_common.c transcode_common.h \ transcode_avlib.c transcode_avlib.h transcode_queues.c \ transcode_queues.h am__objects_1 = cam.$(OBJEXT) @BUILD_CAMSUPPORT_TRUE@am__objects_2 = $(am__objects_1) am__objects_3 = transcode.$(OBJEXT) transcode_common.$(OBJEXT) \ transcode_avlib.$(OBJEXT) transcode_queues.$(OBJEXT) @BUILD_TRANSCODING_TRUE@am__objects_4 = $(am__objects_3) am_mumudvb_OBJECTS = autoconf.$(OBJEXT) crc32.$(OBJEXT) log.$(OBJEXT) \ multicast.$(OBJEXT) dvb.$(OBJEXT) mumudvb.$(OBJEXT) \ mumudvb_common.$(OBJEXT) network.$(OBJEXT) \ pat_rewrite.$(OBJEXT) rewrite.$(OBJEXT) sdt_rewrite.$(OBJEXT) \ rtp.$(OBJEXT) sap.$(OBJEXT) ts.$(OBJEXT) tune.$(OBJEXT) \ unicast_http.$(OBJEXT) unicast_queue.$(OBJEXT) \ autoconf_sdt.$(OBJEXT) autoconf_atsc.$(OBJEXT) \ autoconf_pmt.$(OBJEXT) autoconf_nit.$(OBJEXT) \ unicast_clients.$(OBJEXT) $(am__objects_2) $(am__objects_4) mumudvb_OBJECTS = $(am_mumudvb_OBJECTS) mumudvb_LDADD = $(LDADD) am_mumudvb_test_OBJECTS = mumudvb_test.$(OBJEXT) autoconf.$(OBJEXT) \ crc32.$(OBJEXT) log.$(OBJEXT) multicast.$(OBJEXT) \ dvb.$(OBJEXT) mumudvb_common.$(OBJEXT) network.$(OBJEXT) \ pat_rewrite.$(OBJEXT) rewrite.$(OBJEXT) sdt_rewrite.$(OBJEXT) \ rtp.$(OBJEXT) sap.$(OBJEXT) ts.$(OBJEXT) tune.$(OBJEXT) \ unicast_http.$(OBJEXT) unicast_queue.$(OBJEXT) \ autoconf_sdt.$(OBJEXT) autoconf_atsc.$(OBJEXT) \ autoconf_pmt.$(OBJEXT) autoconf_nit.$(OBJEXT) \ unicast_clients.$(OBJEXT) mumudvb_test_OBJECTS = $(am_mumudvb_test_OBJECTS) mumudvb_test_LDADD = $(LDADD) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(mumudvb_SOURCES) $(mumudvb_test_SOURCES) DIST_SOURCES = $(am__mumudvb_SOURCES_DIST) $(mumudvb_test_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # what flags you want to pass to the C compiler & linker AM_CFLAGS = -Wall -Wextra AM_LDFLAGS = mumudvb_test_SOURCES = mumudvb_test.c autoconf.c crc32.c dvb.h log.c log.h multicast.c mumudvb.h network.h rewrite.h \ rtp.h sap.h ts.h tune.h unicast_http.h autoconf.h dvb.c errors.h \ mumudvb_common.c network.c pat_rewrite.c rewrite.c sdt_rewrite.c \ rtp.c sap.c ts.c tune.c unicast_http.c unicast_queue.c autoconf_sdt.c autoconf_atsc.c \ autoconf_pmt.c autoconf_nit.c unicast_clients.c mumudvb_SOURCES = autoconf.c crc32.c dvb.h log.c log.h multicast.c \ mumudvb.h network.h rewrite.h rtp.h sap.h ts.h tune.h \ unicast_http.h autoconf.h dvb.c errors.h mumudvb.c \ mumudvb_common.c network.c pat_rewrite.c rewrite.c \ sdt_rewrite.c rtp.c sap.c ts.c tune.c unicast_http.c \ unicast_queue.c autoconf_sdt.c autoconf_atsc.c autoconf_pmt.c \ autoconf_nit.c unicast_clients.c $(am__append_1) \ $(am__append_2) SOURCES_camsupport = \ cam.c \ cam.h \ $(NULL) SOURCES_transcoding = \ transcode.c \ transcode.h \ transcode_common.c \ transcode_common.h \ transcode_avlib.c \ transcode_avlib.h \ transcode_queues.c \ transcode_queues.h \ $(NULL) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) clean-checkPROGRAMS: -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) mumudvb$(EXEEXT): $(mumudvb_OBJECTS) $(mumudvb_DEPENDENCIES) $(EXTRA_mumudvb_DEPENDENCIES) @rm -f mumudvb$(EXEEXT) $(LINK) $(mumudvb_OBJECTS) $(mumudvb_LDADD) $(LIBS) mumudvb_test$(EXEEXT): $(mumudvb_test_OBJECTS) $(mumudvb_test_DEPENDENCIES) $(EXTRA_mumudvb_test_DEPENDENCIES) @rm -f mumudvb_test$(EXEEXT) $(LINK) $(mumudvb_test_OBJECTS) $(mumudvb_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autoconf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autoconf_atsc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autoconf_nit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autoconf_pmt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/autoconf_sdt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cam.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multicast.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mumudvb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mumudvb_common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mumudvb_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pat_rewrite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rewrite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdt_rewrite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transcode.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transcode_avlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transcode_common.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transcode_queues.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ts.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tune.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unicast_clients.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unicast_http.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unicast_queue.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-am all-am: Makefile $(PROGRAMS) config.h installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-checkPROGRAMS clean-generic ctags distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mumudvb-1.7.1/src/autoconf.c000066400000000000000000001346621177353207000157710ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * File for Autoconfiguration * * (C) 2008-2010 Brice DUBOST * * Parts of this code come from libdvb, modified for mumudvb * by Brice DUBOST * Libdvb part : Copyright (C) 2000 Klaus Schmidinger * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief This file contain the code related to the autoconfiguration of mumudvb * * It contains the functions to extract the relevant informations from the PAT,PMT,SDT pids and from ATSC PSIP table * * The PAT contains the list of the channels in the actual stream, their service number and the PMT pid * * The SDT contains the name of the channels associated to a certain service number and the type of service * * The PSIP (ATSC only) table contains the same kind of information as the SDT * * The pmt contains the Pids (audio video etc ...) of the channels, * * The idea is the following (for full autoconf), * once we find a sdt, we add the service to a service list (ie we add the name and the service number) * if we find a pat, we check if we have seen the services before, if no we skip, if yes we update the pmt pids * * Once we updated all the services or reach the timeout we create a channel list from the services list and we go * in the autoconf=partial mode (and we add the filters for the new pmt pids) * * In partial autoconf, we read the pmt pids to find the other pids of the channel. We add only pids wich seems relevant * ie : audio, video, pcr, teletext, subtitle * * once it's finished, we add the new filters */ #include #include #include #include #include #include #include #include #include #include #include #include #include "errors.h" #include "ts.h" #include "mumudvb.h" #include "dvb.h" #include "network.h" #include "autoconf.h" #include "rtp.h" #include "log.h" #ifdef ENABLE_TRANSCODING #include "transcode.h" #endif extern int Interrupted; static char *log_module="Autoconf: "; #ifdef ENABLE_TRANSCODING extern transcode_options_t global_transcode_opt; #endif mumudvb_service_t *autoconf_find_service_for_add(mumudvb_service_t *services,int service_id); mumudvb_service_t *autoconf_find_service_for_modify(mumudvb_service_t *services,int service_id); void autoconf_free_services(mumudvb_service_t *services); int autoconf_read_sdt(unsigned char *buf,int len, mumudvb_service_t *services); int autoconf_read_psip(autoconf_parameters_t *parameters); int autoconf_read_pmt(mumudvb_ts_packet_t *pmt, mumudvb_channel_t *channel, char *card_base_path, int tuner, uint8_t *asked_pid, uint8_t *number_chan_asked_pid,fds_t *fds); void autoconf_sort_services(mumudvb_service_t *services); int autoconf_read_nit(autoconf_parameters_t *parameters, mumudvb_channel_t *channels, int number_of_channels); /** @brief Read a line of the configuration file to check if there is a autoconf parameter * * @param autoconf_vars the autoconfiguration parameters * @param substring The currrent line */ int read_autoconfiguration_configuration(autoconf_parameters_t *autoconf_vars, char *substring) { char delimiteurs[] = CONFIG_FILE_SEPARATOR; if (!strcmp (substring, "autoconf_scrambled")) { substring = strtok (NULL, delimiteurs); autoconf_vars->autoconf_scrambled = atoi (substring); } else if (!strcmp (substring, "autoconf_pid_update")) { substring = strtok (NULL, delimiteurs); autoconf_vars->autoconf_pid_update = atoi (substring); } else if (!strcmp (substring, "autoconfiguration")) { substring = strtok (NULL, delimiteurs); if(atoi (substring)==2) autoconf_vars->autoconfiguration = AUTOCONF_MODE_FULL; else if(atoi (substring)==1) autoconf_vars->autoconfiguration = AUTOCONF_MODE_PIDS; else if (!strcmp (substring, "full")) autoconf_vars->autoconfiguration = AUTOCONF_MODE_FULL; else if (!strcmp (substring, "partial")) autoconf_vars->autoconfiguration = AUTOCONF_MODE_PIDS; else if (!strcmp (substring, "none")) autoconf_vars->autoconfiguration = AUTOCONF_MODE_NONE; if(!((autoconf_vars->autoconfiguration==AUTOCONF_MODE_PIDS)||(autoconf_vars->autoconfiguration==AUTOCONF_MODE_FULL)||(autoconf_vars->autoconfiguration==AUTOCONF_MODE_NONE))) { log_message( log_module, MSG_WARN, "Bad value for autoconfiguration, autoconfiguration will not be run\n"); autoconf_vars->autoconfiguration=AUTOCONF_MODE_NONE; } } else if (!strcmp (substring, "autoconf_radios")) { substring = strtok (NULL, delimiteurs); autoconf_vars->autoconf_radios = atoi (substring); if(!(autoconf_vars->autoconfiguration==AUTOCONF_MODE_FULL)) { log_message( log_module, MSG_INFO, "You have to set autoconfiguration in full mode to use autoconf of the radios\n"); } } else if( (!strcmp (substring, "autoconf_ip_header")) || (!strcmp (substring, "autoconf_ip4_header"))) { if(!strcmp (substring, "autoconf_ip_header")) { log_message( log_module, MSG_WARN, "autoconf_ip_header is deprecated, please use autoconf_ip4_header instead"); } substring = strtok (NULL, delimiteurs); if(strlen(substring)>8) { log_message( log_module, MSG_ERROR, "The autoconf ip header is too long\n"); return -1; } snprintf(autoconf_vars->autoconf_ip4,79,"%s.%%card.%%number",substring); } else if ((!strcmp (substring, "autoconf_ip"))||(!strcmp (substring, "autoconf_ip4"))) { if(!strcmp (substring, "autoconf_ip")) { log_message( log_module, MSG_WARN, "autoconf_ip is deprecated, please use autoconf_ip4 instead"); } substring = strtok (NULL, delimiteurs); if(strlen(substring)>79) { log_message( log_module, MSG_ERROR, "The autoconf ip v4 is too long\n"); return -1; } sscanf (substring, "%s\n", autoconf_vars->autoconf_ip4); } else if (!strcmp (substring, "autoconf_ip6")) { substring = strtok (NULL, delimiteurs); if(strlen(substring)>79) { log_message( log_module, MSG_ERROR, "The autoconf ip v6 is too long\n"); return -1; } sscanf (substring, "%s\n", autoconf_vars->autoconf_ip6); } /** option for the starting http unicast port (for autoconf full)*/ else if (!strcmp (substring, "autoconf_unicast_start_port")) { substring = strtok (NULL, delimiteurs); sprintf(autoconf_vars->autoconf_unicast_port,"%d +%%number",atoi (substring)); } /** option for the http unicast port (for autoconf full) parsed version*/ else if (!strcmp (substring, "autoconf_unicast_port")) { substring = strtok (NULL, "="); if(strlen(substring)>255) { log_message( log_module, MSG_ERROR, "The autoconf_unicast_port is too long\n"); return -1; } strcpy(autoconf_vars->autoconf_unicast_port,substring); } /** option for the http multicast port (for autoconf full) parsed version*/ else if (!strcmp (substring, "autoconf_multicast_port")) { substring = strtok (NULL, "="); if(strlen(substring)>255) { log_message( log_module, MSG_ERROR, "The autoconf_multicast_port is too long\n"); return -1; } strcpy(autoconf_vars->autoconf_multicast_port,substring); } else if ((!strcmp (substring, "autoconf_tsid_list"))||(!strcmp (substring, "autoconf_sid_list"))) { if(!strcmp (substring, "autoconf_tsid_list")) log_message( log_module, MSG_WARN, "Warning: The option autoconf_tsid_list is deprecated, use autoconf_sid_list instead\n"); while ((substring = strtok (NULL, delimiteurs)) != NULL) { if (autoconf_vars->num_service_id >= MAX_CHANNELS) { log_message( log_module, MSG_ERROR, "Autoconfiguration : Too many ts id : %d\n", autoconf_vars->num_service_id); return -1; } autoconf_vars->service_id_list[autoconf_vars->num_service_id] = atoi (substring); autoconf_vars->num_service_id++; } } else if (!strcmp (substring, "autoconf_name_template")) { // other substring extraction method in order to keep spaces substring = strtok (NULL, "="); if (!(strlen (substring) >= MAX_NAME_LEN - 1)) strcpy(autoconf_vars->name_template,strtok(substring,"\n")); else { log_message( log_module, MSG_WARN,"Autoconfiguration: Channel name template too long\n"); strncpy(autoconf_vars->name_template,strtok(substring,"\n"),MAX_NAME_LEN-1); autoconf_vars->name_template[MAX_NAME_LEN-1]='\0'; } } else return 0; //Nothing concerning autoconfiguration, we return 0 to explore the other possibilities return 1;//We found something for autoconfiguration, we tell main to go for the next line } /** @brief initialize the autoconfiguration : alloc the memory etc... * */ int autoconf_init(autoconf_parameters_t *autoconf_vars, mumudvb_channel_t *channels,int number_of_channels) { int curr_channel; if(autoconf_vars->autoconfiguration==AUTOCONF_MODE_FULL) { autoconf_vars->autoconf_temp_pat=malloc(sizeof(mumudvb_ts_packet_t)); if(autoconf_vars->autoconf_temp_pat==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } memset (autoconf_vars->autoconf_temp_pat, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&autoconf_vars->autoconf_temp_pat->packetmutex,NULL); autoconf_vars->autoconf_temp_sdt=malloc(sizeof(mumudvb_ts_packet_t)); if(autoconf_vars->autoconf_temp_sdt==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } memset (autoconf_vars->autoconf_temp_sdt, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&autoconf_vars->autoconf_temp_sdt->packetmutex,NULL); autoconf_vars->autoconf_temp_psip=malloc(sizeof(mumudvb_ts_packet_t)); if(autoconf_vars->autoconf_temp_psip==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } memset (autoconf_vars->autoconf_temp_psip, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&autoconf_vars->autoconf_temp_psip->packetmutex,NULL); autoconf_vars->services=malloc(sizeof(mumudvb_service_t)); if(autoconf_vars->services==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } memset (autoconf_vars->services, 0, sizeof( mumudvb_service_t));//we clear it } if (autoconf_vars->autoconfiguration==AUTOCONF_MODE_PIDS) for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) { //If there is more than one pid in one channel we mark it //For no autoconfiguration if(channels[curr_channel].num_pids>1) { log_message( log_module, MSG_DETAIL, "Autoconfiguration deactivated for channel \"%s\" \n", channels[curr_channel].name); channels[curr_channel].autoconfigurated=1; } else if (channels[curr_channel].num_pids==1) { //Only one pid with autoconfiguration=partial, it's the PMT pid channels[curr_channel].pmt_pid=channels[curr_channel].pids[0]; channels[curr_channel].pids_type[0]=PID_PMT; snprintf(channels[curr_channel].pids_language[0],4,"%s","---"); } } if (autoconf_vars->autoconfiguration) { autoconf_vars->autoconf_temp_nit=malloc(sizeof(mumudvb_ts_packet_t)); if(autoconf_vars->autoconf_temp_nit==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } memset (autoconf_vars->autoconf_temp_nit, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&autoconf_vars->autoconf_temp_nit->packetmutex,NULL); } return 0; } /****************************************************************************/ //Parts of this code (read of the pmt and read of the pat) // from libdvb, strongly modified, with commentaries added /****************************************************************************/ /** @brief read the PAT for autoconfiguration * This function extract the pmt from the pat * before doing so it checks if the service is already initialised (sdt packet) * * @param autoconf_vars The autoconfiguration structure, containing all we need */ int autoconf_read_pat(autoconf_parameters_t *autoconf_vars) { mumudvb_ts_packet_t *pat_mumu; mumudvb_service_t *services; unsigned char *buf=NULL; mumudvb_service_t *actual_service=NULL; pat_mumu=autoconf_vars->autoconf_temp_pat; services=autoconf_vars->services; buf=pat_mumu->data_full; pat_t *pat=(pat_t*)(buf); pat_prog_t *prog; int delta=PAT_LEN; int section_length=0; int number_of_services=0; int channels_missing=0; int new_services=0; log_message( log_module, MSG_DEBUG,"---- New PAT ----\n"); //we display the contents ts_display_pat(log_module,buf); //PAT reading section_length=HILO(pat->section_length); /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(pat->current_next_indicator == 0) { log_message( log_module, MSG_DEBUG,"The current_next_indicator is set to 0, this PAT is not valid for the current stream\n"); return 0; } //We store the transport stream ID autoconf_vars->transport_stream_id=HILO(pat->transport_stream_id); //We loop over the different programs included in the pat while((delta+PAT_PROG_LEN)<(section_length)) { prog=(pat_prog_t*)((char*)buf+delta); if(HILO(prog->program_number)!=0) { //Do we have already this program in the service list ? //Ie : do we already know the channel name/type ? actual_service=autoconf_find_service_for_modify(services,HILO(prog->program_number)); if(actual_service) { if(!actual_service->pmt_pid) { //We found a new service without the PMT, pid, we update this service new_services=1; actual_service->pmt_pid=HILO(prog->network_pid); log_message( log_module, MSG_DETAIL,"service updated PMT PID : %d\t id 0x%x\t name \"%s\"\n", actual_service->pmt_pid, actual_service->id, actual_service->name); } } else { log_message( log_module, MSG_DEBUG,"service missing PMT PID : %d\t id 0x%x %d\n", HILO(prog->network_pid), HILO(prog->program_number), HILO(prog->program_number)); channels_missing++; } number_of_services++; } delta+=PAT_PROG_LEN; } if(channels_missing) { if(new_services) log_message( log_module, MSG_DETAIL,"PAT read %d channels on %d are missing, we wait for others SDT/PSIP for the moment.\n",channels_missing,number_of_services); return 0; } return 1; } /** @brief Try to find the service specified by id, if not found create a new one. * if the service is not foud, it returns a pointer to the new service, and NULL if * the service is found or run out of memory. * * @param services the chained list of services * @param service_id the identifier/program number of the searched service */ mumudvb_service_t *autoconf_find_service_for_add(mumudvb_service_t *services,int service_id) { int found=0; mumudvb_service_t *actual_service; actual_service=services; if(actual_service->id==service_id) found=1; while(found==0 && actual_service->next!=NULL) { actual_service=actual_service->next; if(actual_service->id==service_id) found=1; } if(found) return NULL; actual_service->next=malloc(sizeof(mumudvb_service_t)); if(actual_service->next==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return NULL; } memset (actual_service->next, 0, sizeof( mumudvb_service_t));//we clear it return actual_service->next; } /** @brief try to find the service specified by id * if not found return NULL, otherwise return the service * * @param services the chained list of services * @param service_id the identifier of the searched service */ mumudvb_service_t *autoconf_find_service_for_modify(mumudvb_service_t *services,int service_id) { mumudvb_service_t *found=NULL; mumudvb_service_t *actual_service; actual_service=services; while(found==NULL && actual_service!=NULL) { if(actual_service->id==service_id) found=actual_service; actual_service=actual_service->next; } if(found) return found; return NULL; } /**@brief Free the autoconf parameters. * * @param autoconf_vars pointer to the autoconf structure */ void autoconf_freeing(autoconf_parameters_t *autoconf_vars) { if(autoconf_vars->autoconf_temp_sdt) { free(autoconf_vars->autoconf_temp_sdt); autoconf_vars->autoconf_temp_sdt=NULL; } if(autoconf_vars->autoconf_temp_psip) { free(autoconf_vars->autoconf_temp_psip); autoconf_vars->autoconf_temp_psip=NULL; } if(autoconf_vars->autoconf_temp_pat) { free(autoconf_vars->autoconf_temp_pat); autoconf_vars->autoconf_temp_pat=NULL; } if(autoconf_vars->services) { autoconf_free_services(autoconf_vars->services); autoconf_vars->services=NULL; } } /**@brief Free the chained list of services. * * @param services the chained list of services */ void autoconf_free_services(mumudvb_service_t *services) { mumudvb_service_t *actual_service; mumudvb_service_t *next_service; for(actual_service=services;actual_service != NULL; actual_service=next_service) { next_service= actual_service->next; free(actual_service); } } /**@brief Sort the chained list of services. * * This function sort the services using their service_id, this service doesn't sort the first one :( (but I think it's empty) * Unefficient sorting : O(n^2) but the number of services is never big and this function is called once * @param services the chained list of services */ void autoconf_sort_services(mumudvb_service_t *services) { mumudvb_service_t *actual_service; mumudvb_service_t *next_service; mumudvb_service_t *actual_service_int; mumudvb_service_t *next_service_int; mumudvb_service_t *prev_service_int; mumudvb_service_t *temp_service_int; prev_service_int=NULL; log_message( log_module, MSG_DEBUG,"Service sorting\n"); log_message( log_module, MSG_FLOOD,"Service sorting BEFORE\n"); for(actual_service=services;actual_service != NULL; actual_service=next_service) { log_message( log_module, MSG_FLOOD,"Service sorting, id %d\t service : %s \n", actual_service->id, actual_service->name); next_service= actual_service->next; } for(actual_service=services;actual_service != NULL; actual_service=next_service) { for(actual_service_int=services;actual_service_int != NULL; actual_service_int=next_service_int) { next_service_int= actual_service_int->next; if((prev_service_int != NULL) &&(next_service_int != NULL) &&(next_service_int->id)&&(actual_service_int->id) && next_service_int->id < actual_service_int->id) { prev_service_int->next=next_service_int; actual_service_int->next=next_service_int->next; next_service_int->next=actual_service_int; if(actual_service_int==actual_service) actual_service=next_service_int; temp_service_int=next_service_int; next_service_int=actual_service_int; actual_service_int=temp_service_int; } prev_service_int=actual_service_int; } next_service= actual_service->next; } log_message( log_module, MSG_FLOOD,"Service sorting AFTER\n"); for(actual_service=services;actual_service != NULL; actual_service=next_service) { log_message( log_module, MSG_FLOOD,"Service sorting, id %d\t service : %s \n", actual_service->id, actual_service->name); next_service= actual_service->next; } } /** @brief Convert the chained list of services into channels * * This function is called when We've got all the services, we now fill the channels structure * After that we go in AUTOCONF_MODE_PIDS to get audio and video pids * @param parameters The autoconf parameters * @param channels Chained list of channels * @param port The mulicast port * @param card The card number for the ip address * @param unicast_vars The unicast parameters * @param fds The file descriptors (for filters and unicast) */ int autoconf_services_to_channels(autoconf_parameters_t parameters, mumudvb_channel_t *channels, int port, int card, int tuner, unicast_parameters_t *unicast_vars, multicast_parameters_t *multicast_vars, int server_id) { mumudvb_service_t *actual_service; int channel_number=0; int found_in_service_id_list; int unicast_port_per_channel; char tempstring[256]; actual_service=parameters.services; unicast_port_per_channel=strlen(parameters.autoconf_unicast_port)?1:0; do { if(parameters.autoconf_scrambled && actual_service->free_ca_mode) log_message( log_module, MSG_DETAIL,"Service scrambled. Name \"%s\"\n", actual_service->name); //If there is a service_id list we look if we find it (option autoconf_sid_list) if(parameters.num_service_id) { int actual_service_id; found_in_service_id_list=0; for(actual_service_id=0;actual_service_idid) { found_in_service_id_list=1; log_message( log_module, MSG_DEBUG,"Service found in the service_id list. Name \"%s\"\n", actual_service->name); } } } else //No ts id list so it is found found_in_service_id_list=1; if(!parameters.autoconf_scrambled && actual_service->free_ca_mode) log_message( log_module, MSG_DETAIL,"Service scrambled, no CAM support and no autoconf_scrambled, we skip. Name \"%s\"\n", actual_service->name); else if(!actual_service->pmt_pid) log_message( log_module, MSG_DETAIL,"Service without a PMT pid, we skip. Name \"%s\"\n", actual_service->name); else if(!found_in_service_id_list) log_message( log_module, MSG_DETAIL,"Service NOT in the service_id list, we skip. Name \"%s\", id %d\n", actual_service->name, actual_service->id); else //service is ok, we make it a channel { //Cf EN 300 468 v1.9.1 Table 81 if((actual_service->type==0x01|| actual_service->type==0x11|| actual_service->type==0x16|| actual_service->type==0x19)|| ((actual_service->type==0x02|| actual_service->type==0x0a)&¶meters.autoconf_radios)) { log_message( log_module, MSG_DETAIL,"We convert a new service into a channel, sid %d pmt_pid %d name \"%s\" \n", actual_service->id, actual_service->pmt_pid, actual_service->name); display_service_type(actual_service->type, MSG_DETAIL, log_module); channels[channel_number].channel_type=actual_service->type; channels[channel_number].num_packet = 0; channels[channel_number].num_scrambled_packets = 0; channels[channel_number].scrambled_channel = 0; channels[channel_number].streamed_channel = 1; channels[channel_number].nb_bytes=0; channels[channel_number].pids[0]=actual_service->pmt_pid; channels[channel_number].pids_type[0]=PID_PMT; channels[channel_number].num_pids=1; snprintf(channels[channel_number].pids_language[0],4,"%s","---"); if(strlen(parameters.name_template)) { strcpy(channels[channel_number].name,parameters.name_template); int len=MAX_NAME_LEN; char number[10]; mumu_string_replace(channels[channel_number].name,&len,0,"%name",actual_service->name); sprintf(number,"%d",channel_number+1); mumu_string_replace(channels[channel_number].name,&len,0,"%number",number); //put LCN here } else strcpy(channels[channel_number].name,actual_service->name); if(multicast_vars->multicast) { char number[10]; char ip[80]; int len=80; if(strlen(parameters.autoconf_multicast_port)) { strcpy(tempstring,parameters.autoconf_multicast_port); sprintf(number,"%d",channel_number); mumu_string_replace(tempstring,&len,0,"%number",number); sprintf(number,"%d",card); mumu_string_replace(tempstring,&len,0,"%card",number); sprintf(number,"%d",tuner); mumu_string_replace(tempstring,&len,0,"%tuner",number); sprintf(number,"%d",server_id); mumu_string_replace(tempstring,&len,0,"%server",number); channels[channel_number].portOut=string_comput(tempstring); } else { channels[channel_number].portOut=port;//do here the job for evaluating the string } if(multicast_vars->multicast_ipv4) { strcpy(ip,parameters.autoconf_ip4); sprintf(number,"%d",channel_number); mumu_string_replace(ip,&len,0,"%number",number); sprintf(number,"%d",card); mumu_string_replace(ip,&len,0,"%card",number); sprintf(number,"%d",tuner); mumu_string_replace(ip,&len,0,"%tuner",number); sprintf(number,"%d",server_id); mumu_string_replace(ip,&len,0,"%server",number); // Compute the string, ex: 239.255.130+0*10+2.1 log_message( log_module, MSG_DEBUG,"Computing expressions in string \"%s\"\n",ip); //Splitting and computing. use of strtok_r because it's safer int tn[4]; char *sptr; tn[0]=string_comput(strtok_r (ip,".",&sptr)); tn[1]=string_comput(strtok_r (NULL,".",&sptr)); tn[2]=string_comput(strtok_r (NULL,".",&sptr)); tn[3]=string_comput(strtok_r (NULL,".",&sptr)); sprintf(channels[channel_number].ip4Out,"%d.%d.%d.%d",tn[0],tn[1],tn[2],tn[3]); // In C the evalutation order of arguments in a fct is undefined, no more easy factoring log_message( log_module, MSG_DEBUG,"Channel IPv4 : \"%s\" port : %d\n",channels[channel_number].ip4Out,channels[channel_number].portOut); } if(multicast_vars->multicast_ipv6) { strcpy(ip,parameters.autoconf_ip6); sprintf(number,"%d",channel_number); mumu_string_replace(ip,&len,0,"%number",number); sprintf(number,"%d",card); mumu_string_replace(ip,&len,0,"%card",number); sprintf(number,"%d",tuner); mumu_string_replace(ip,&len,0,"%tuner",number); sprintf(number,"%d",server_id); mumu_string_replace(ip,&len,0,"%server",number); strcpy(channels[channel_number].ip6Out,ip); log_message( log_module, MSG_DEBUG,"Channel IPv6 : \"%s\" port : %d\n",channels[channel_number].ip6Out,channels[channel_number].portOut); } } //This is a scrambled channel, we will have to ask the cam for descrambling it if(parameters.autoconf_scrambled && actual_service->free_ca_mode) channels[channel_number].need_cam_ask=CAM_NEED_ASK; //We store the PMT and the service id in the channel channels[channel_number].pmt_pid=actual_service->pmt_pid; channels[channel_number].service_id=actual_service->id; init_rtp_header(&channels[channel_number]); //We init the rtp header in all cases if(channels[channel_number].pmt_packet==NULL) { channels[channel_number].pmt_packet=malloc(sizeof(mumudvb_ts_packet_t)); if(channels[channel_number].pmt_packet==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } memset (channels[channel_number].pmt_packet, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&channels[channel_number].pmt_packet->packetmutex,NULL); } #ifdef ENABLE_CAM_SUPPORT //We allocate the packet for storing the PMT for CAM purposes if(channels[channel_number].cam_pmt_packet==NULL) { channels[channel_number].cam_pmt_packet=malloc(sizeof(mumudvb_ts_packet_t)); if(channels[channel_number].cam_pmt_packet==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } memset (channels[channel_number].cam_pmt_packet, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&channels[channel_number].cam_pmt_packet->packetmutex,NULL); } #endif //We update the unicast port, the connection will be created in autoconf_finish_full if(unicast_port_per_channel && unicast_vars->unicast) { strcpy(tempstring,parameters.autoconf_unicast_port); int len;len=256; char number[10]; sprintf(number,"%d",channel_number); mumu_string_replace(tempstring,&len,0,"%number",number); sprintf(number,"%d",card); mumu_string_replace(tempstring,&len,0,"%card",number); sprintf(number,"%d",tuner); mumu_string_replace(tempstring,&len,0,"%tuner",number); sprintf(number,"%d",server_id); mumu_string_replace(tempstring,&len,0,"%server",number); channels[channel_number].unicast_port=string_comput(tempstring); log_message( log_module, MSG_DEBUG,"Channel (direct) unicast port %d\n",channels[channel_number].unicast_port); } #ifdef ENABLE_TRANSCODING //We copy the common transcode options to the new channel transcode_copy_options(&global_transcode_opt,&channels[channel_number].transcode_options); transcode_options_apply_templates(&channels[channel_number].transcode_options,card,tuner,server_id,channel_number); #endif channel_number++; } else if(actual_service->type==0x02||actual_service->type==0x0a) //service_type digital radio sound service log_message( log_module, MSG_DETAIL,"Service type digital radio sound service, no autoconfigure. (if you want add autoconf_radios=1 to your configuration file) Name \"%s\"\n",actual_service->name); else if(actual_service->type!=0) //0 is an empty service { //We show the service type log_message( log_module, MSG_DETAIL,"No autoconfigure due to service type : %s. Name \"%s\"\n",service_type_to_str(actual_service->type),actual_service->name); } } actual_service=actual_service->next; } while(actual_service && channel_numberservices); chan_and_pids->number_of_channels=autoconf_services_to_channels(*autoconf_vars, chan_and_pids->channels, multicast_vars->common_port, tuneparams->card, tuneparams->tuner, unicast_vars, multicast_vars, server_id); //Convert the list of services into channels //we got the pmt pids for the channels, we open the filters for (curr_channel = 0; curr_channel < chan_and_pids->number_of_channels; curr_channel++) { for (curr_pid = 0; curr_pid < chan_and_pids->channels[curr_channel].num_pids; curr_pid++) { if(chan_and_pids->asked_pid[chan_and_pids->channels[curr_channel].pids[curr_pid]]==PID_NOT_ASKED) chan_and_pids->asked_pid[chan_and_pids->channels[curr_channel].pids[curr_pid]]=PID_ASKED; chan_and_pids->number_chan_asked_pid[chan_and_pids->channels[curr_channel].pids[curr_pid]]++; } } // we open the file descriptors if (create_card_fd (tuneparams->card_dev_path, tuneparams->tuner, chan_and_pids->asked_pid, fds) < 0) { log_message( log_module, MSG_ERROR,"ERROR : CANNOT open the new descriptors. Some channels will probably not work\n"); } // we set the new filters set_filters( chan_and_pids->asked_pid, fds); //Networking for (curr_channel = 0; curr_channel < chan_and_pids->number_of_channels; curr_channel++) { /** open the unicast listening connections fo the channels */ if(chan_and_pids->channels[curr_channel].unicast_port && unicast_vars->unicast) { log_message( log_module, MSG_INFO,"Unicast : We open the channel %d http socket address %s:%d\n", curr_channel, unicast_vars->ipOut, chan_and_pids->channels[curr_channel].unicast_port); unicast_create_listening_socket(UNICAST_LISTEN_CHANNEL, curr_channel, unicast_vars->ipOut, chan_and_pids->channels[curr_channel].unicast_port, &chan_and_pids->channels[curr_channel].sIn, &chan_and_pids->channels[curr_channel].socketIn, fds, unicast_vars); } //Open the multicast socket for the new channel if(multicast_vars->multicast_ipv4) { if(multicast_vars->multicast && multicast_vars->auto_join) //See the README for the reason of this option chan_and_pids->channels[curr_channel].socketOut4 = makeclientsocket (chan_and_pids->channels[curr_channel].ip4Out, chan_and_pids->channels[curr_channel].portOut, multicast_vars->ttl, multicast_vars->iface4, &chan_and_pids->channels[curr_channel].sOut4); else if(multicast_vars->multicast) chan_and_pids->channels[curr_channel].socketOut4 = makesocket (chan_and_pids->channels[curr_channel].ip4Out, chan_and_pids->channels[curr_channel].portOut, multicast_vars->ttl, multicast_vars->iface4, &chan_and_pids->channels[curr_channel].sOut4); } if(multicast_vars->multicast_ipv6) { if(multicast_vars->multicast && multicast_vars->auto_join) //See the README for the reason of this option chan_and_pids->channels[curr_channel].socketOut6 = makeclientsocket6 (chan_and_pids->channels[curr_channel].ip6Out, chan_and_pids->channels[curr_channel].portOut, multicast_vars->ttl, multicast_vars->iface6, &chan_and_pids->channels[curr_channel].sOut6); else if(multicast_vars->multicast) chan_and_pids->channels[curr_channel].socketOut6 = makesocket6 (chan_and_pids->channels[curr_channel].ip6Out, chan_and_pids->channels[curr_channel].portOut, multicast_vars->ttl, multicast_vars->iface6, &chan_and_pids->channels[curr_channel].sOut6); } } log_message( log_module, MSG_DEBUG,"Step TWO, we get the video and audio PIDs\n"); //We free autoconf memort autoconf_freeing(autoconf_vars); autoconf_vars->autoconfiguration=AUTOCONF_MODE_PIDS; //Next step add video and audio pids return 0; } /** @brief Finish autoconf * This function is called when autoconfiguration is finished * It opens what is needed to stream the new channels * It creates the file descriptors for the filters, set the filters * It also generates a config file with the data obtained during autoconfiguration * * @param card the card number * @param number_of_channels the number of channels * @param channels the array of channels * @param asked_pid the array containing the pids already asked * @param number_chan_asked_pid the number of channels who want this pid * @param fds the file descriptors */ void autoconf_set_channel_filt(char *card_base_path, int tuner, mumudvb_chan_and_pids_t *chan_and_pids, fds_t *fds) { int curr_channel; int curr_pid; log_message( log_module, MSG_DETAIL,"Autoconfiguration almost done\n"); log_message( log_module, MSG_DETAIL,"We open the new file descriptors\n"); for (curr_channel = 0; curr_channel < chan_and_pids->number_of_channels; curr_channel++) { for (curr_pid = 0; curr_pid < chan_and_pids->channels[curr_channel].num_pids; curr_pid++) { if(chan_and_pids->asked_pid[chan_and_pids->channels[curr_channel].pids[curr_pid]]==PID_NOT_ASKED) chan_and_pids->asked_pid[chan_and_pids->channels[curr_channel].pids[curr_pid]]=PID_ASKED; chan_and_pids->number_chan_asked_pid[chan_and_pids->channels[curr_channel].pids[curr_pid]]++; } } // we open the file descriptors if (create_card_fd (card_base_path, tuner, chan_and_pids->asked_pid, fds) < 0) { log_message( log_module, MSG_ERROR,"ERROR : CANNOT open the new descriptors. Some channels will probably not work\n"); } log_message( log_module, MSG_DETAIL,"Add the new filters\n"); set_filters(chan_and_pids->asked_pid, fds); } void autoconf_definite_end(int card, int tuner, mumudvb_chan_and_pids_t *chan_and_pids, multicast_parameters_t *multicast_vars, unicast_parameters_t *unicast_vars) { log_message( log_module, MSG_INFO,"Autoconfiguration done\n"); log_streamed_channels(log_module,chan_and_pids->number_of_channels, chan_and_pids->channels, multicast_vars->multicast_ipv4, multicast_vars->multicast_ipv6, unicast_vars->unicast, unicast_vars->portOut, unicast_vars->ipOut); /**@todo : make an option to generate it or not ?*/ char filename_gen_conf[256]; sprintf (filename_gen_conf, GEN_CONF_PATH, card, tuner); gen_config_file(chan_and_pids->number_of_channels, chan_and_pids->channels, filename_gen_conf); } /******************************************************************** * Autoconfiguration new packet and poll functions ********************************************************************/ /** @brief This function is called when a new packet is there and the autoconf is not finished*/ int autoconf_new_packet(int pid, unsigned char *ts_packet, autoconf_parameters_t *autoconf_vars, fds_t *fds, mumudvb_chan_and_pids_t *chan_and_pids, tuning_parameters_t *tuneparams, multicast_parameters_t *multicast_vars, unicast_parameters_t *unicast_vars, int server_id) { if(autoconf_vars->autoconfiguration==AUTOCONF_MODE_FULL) //Full autoconfiguration, we search the channels and their names { if(pid==0) //PAT : contains the services identifiers and the PMT PID for each service { if(get_ts_packet(ts_packet,autoconf_vars->autoconf_temp_pat)) { if(autoconf_read_pat(autoconf_vars)) { log_message( log_module, MSG_DEBUG,"It seems that we have finished to get the services list\n"); //we finish full autoconfiguration autoconf_finish_full(chan_and_pids, autoconf_vars, multicast_vars, tuneparams, fds, unicast_vars, server_id); } } } else if(pid==17) //SDT : contains the names of the services { if(get_ts_packet(ts_packet,autoconf_vars->autoconf_temp_sdt)) { autoconf_read_sdt(autoconf_vars->autoconf_temp_sdt->data_full,autoconf_vars->autoconf_temp_sdt->len_full,autoconf_vars->services); } } else if(pid==PSIP_PID && tuneparams->fe_type==FE_ATSC) //PSIP : contains the names of the services { if(get_ts_packet(ts_packet,autoconf_vars->autoconf_temp_psip)) { autoconf_read_psip(autoconf_vars); } } } else if(autoconf_vars->autoconfiguration==AUTOCONF_MODE_PIDS) //We have the channels and their PMT, we search the other pids { int curr_channel; for(curr_channel=0;curr_channelchannels[curr_channel].autoconfigurated) &&(chan_and_pids->channels[curr_channel].pmt_pid==pid)&& pid) { if(get_ts_packet(ts_packet,chan_and_pids->channels[curr_channel].pmt_packet)) { //Now we have the PMT, we parse it if(autoconf_read_pmt(chan_and_pids->channels[curr_channel].pmt_packet, &chan_and_pids->channels[curr_channel], tuneparams->card_dev_path, tuneparams->tuner, chan_and_pids->asked_pid, chan_and_pids->number_chan_asked_pid, fds)==0) { log_pids(log_module,&chan_and_pids->channels[curr_channel],curr_channel); chan_and_pids->channels[curr_channel].autoconfigurated=1; //We parse the NIT before finishing autoconfiguration autoconf_vars->autoconfiguration=AUTOCONF_MODE_NIT; for (curr_channel = 0; curr_channel < chan_and_pids->number_of_channels; curr_channel++) if(!chan_and_pids->channels[curr_channel].autoconfigurated) autoconf_vars->autoconfiguration=AUTOCONF_MODE_PIDS; //not finished we continue //if it's finished, we open the new descriptors and add the new filters if(autoconf_vars->autoconfiguration!=AUTOCONF_MODE_PIDS) { autoconf_set_channel_filt(tuneparams->card_dev_path, tuneparams->tuner, chan_and_pids, fds); //We free autoconf memory autoconf_freeing(autoconf_vars); if(autoconf_vars->autoconfiguration==AUTOCONF_MODE_NIT) log_message( log_module, MSG_DETAIL,"We search for the NIT\n"); else autoconf_definite_end(tuneparams->card, tuneparams->tuner, chan_and_pids, multicast_vars, unicast_vars); } } } } } } else if(autoconf_vars->autoconfiguration==AUTOCONF_MODE_NIT) //We search the NIT { if(pid==16) //NIT : Network Information Table { if(get_ts_packet(ts_packet,autoconf_vars->autoconf_temp_nit)) { log_message( log_module, MSG_FLOOD,"New NIT\n"); if(autoconf_read_nit(autoconf_vars, chan_and_pids->channels, chan_and_pids->number_of_channels)==0) { autoconf_vars->autoconfiguration=0; int curr_channel; char lcn[4]; int len=MAX_NAME_LEN; for(curr_channel=0;curr_channelchannels[curr_channel].logical_channel_number) { sprintf(lcn,"%03d",chan_and_pids->channels[curr_channel].logical_channel_number); mumu_string_replace(chan_and_pids->channels[curr_channel].name,&len,0,"%lcn",lcn); sprintf(lcn,"%02d",chan_and_pids->channels[curr_channel].logical_channel_number); mumu_string_replace(chan_and_pids->channels[curr_channel].name,&len,0,"%2lcn",lcn); } else { mumu_string_replace(chan_and_pids->channels[curr_channel].name,&len,0,"%lcn",""); mumu_string_replace(chan_and_pids->channels[curr_channel].name,&len,0,"%2lcn",""); } } free(autoconf_vars->autoconf_temp_nit); autoconf_vars->autoconf_temp_nit=NULL; autoconf_definite_end(tuneparams->card, tuneparams->tuner, chan_and_pids, multicast_vars, unicast_vars); } } } } return Interrupted; } /** @brief Autoconf function called periodically * This function check if we reached the timeout * if it's finished, we open the new descriptors and add the new filters */ int autoconf_poll(long now, autoconf_parameters_t *autoconf_vars, mumudvb_chan_and_pids_t *chan_and_pids, tuning_parameters_t *tuneparams, multicast_parameters_t *multicast_vars, fds_t *fds, unicast_parameters_t *unicast_vars, int server_id) { int iRet=0; if(!autoconf_vars->time_start_autoconfiguration) autoconf_vars->time_start_autoconfiguration=now; else if (now-autoconf_vars->time_start_autoconfiguration>AUTOCONFIGURE_TIME) { if(autoconf_vars->autoconfiguration==AUTOCONF_MODE_PIDS) { log_message( log_module, MSG_WARN,"Not all the channels were configured before timeout\n"); autoconf_vars->autoconfiguration=0; autoconf_set_channel_filt(tuneparams->card_dev_path, tuneparams->tuner, chan_and_pids, fds); //We free autoconf memory autoconf_freeing(autoconf_vars); autoconf_vars->autoconfiguration=AUTOCONF_MODE_NIT; autoconf_vars->time_start_autoconfiguration=now; } else if(autoconf_vars->autoconfiguration==AUTOCONF_MODE_FULL) { log_message( log_module, MSG_WARN,"We were not able to get all the services, we continue with the partial service list\n"); //This happend when we are not able to get all the services of the PAT, //We continue with the partial list of services autoconf_vars->time_start_autoconfiguration=now; iRet = autoconf_finish_full(chan_and_pids, autoconf_vars, multicast_vars, tuneparams, fds, unicast_vars, server_id); } else if(autoconf_vars->autoconfiguration==AUTOCONF_MODE_NIT) { log_message( log_module, MSG_WARN,"Warning : No NIT found before timeout\n"); autoconf_definite_end(tuneparams->card, tuneparams->tuner, chan_and_pids, multicast_vars, unicast_vars); if(autoconf_vars->autoconf_temp_nit) { free(autoconf_vars->autoconf_temp_nit); autoconf_vars->autoconf_temp_nit=NULL; } autoconf_vars->autoconfiguration=0; } } return iRet; } mumudvb-1.7.1/src/autoconf.h000066400000000000000000000110371177353207000157640ustar00rootroot00000000000000/* * MuMuDVB -Stream a DVB transport stream. * * (C) 2008-2010 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /**@file * @brief Autoconfiguration structures */ #ifndef _AUTOCONF_H #define _AUTOCONF_H #include "mumudvb.h" #include "unicast_http.h" #include "ts.h" #include "tune.h" /**No autoconfiguration, only send specified PIDs */ #define AUTOCONF_MODE_NONE 0 /**find the audio and video pids from the PMT*/ #define AUTOCONF_MODE_PIDS 1 /**find the pmt pids and the channels from the pat, and go to AUTOCONF_MODE_PIDS*/ #define AUTOCONF_MODE_FULL 2 /**parse the NIT*/ #define AUTOCONF_MODE_NIT 4 //timeout for autoconfiguration #define AUTOCONFIGURE_TIME 10 /**@brief chained list of services for autoconfiguration * */ typedef struct mumudvb_service_t{ /**The channel name*/ char name[MAX_NAME_LEN]; /**Is the channel running ? Not used for the moment*/ int running_status; /**The service type : television, radio, data, ...*/ int type; /**The PMT pid of the service*/ int pmt_pid; /**The program ID, also called program number in the PAT or in ATSC*/ int id; /**Tell if this service is scrambled*/ int free_ca_mode; /**The next service in the chained list*/ struct mumudvb_service_t *next; }mumudvb_service_t; /**@brief The different parameters used for autoconfiguration*/ typedef struct autoconf_parameters_t{ /**Do we use autoconfiguration ? Possible values for this variable 0 : none (or autoconf finished) AUTOCONF_MODE_PIDS : we have the PMT pids and the channels, we search the audio and video AUTOCONF_MODE_FULL : we have only the tuning parameters, we search the channels and their pmt pids*/ int autoconfiguration; /**do we autoconfigure the radios ?*/ int autoconf_radios; /** The template of autoconfigured multicast addresses*/ char autoconf_ip4[80]; char autoconf_ip6[80]; /**When did we started autoconfiguration ?*/ long time_start_autoconfiguration; /**The transport stream id (used to read ATSC PSIP tables)*/ int transport_stream_id; /** Do we autoconfigure scrambled channels ? */ int autoconf_scrambled; /** Do we follow pmt changes*/ int autoconf_pid_update; //Different packets used by autoconfiguration mumudvb_ts_packet_t *autoconf_temp_pat; mumudvb_ts_packet_t *autoconf_temp_sdt; mumudvb_ts_packet_t *autoconf_temp_nit; /**For ATSC Program and System Information Protocol*/ mumudvb_ts_packet_t *autoconf_temp_psip; mumudvb_service_t *services; /**the http unicast port (string with %card %number, * and + ) */ char autoconf_unicast_port[256]; /**the multicast port (string with %card %number, * and + ) */ char autoconf_multicast_port[256]; /**the list of SID for full autoconfiguration*/ int service_id_list[MAX_CHANNELS]; /**number of SID*/ int num_service_id; /** the template for the channel name*/ char name_template[MAX_NAME_LEN]; }autoconf_parameters_t; int autoconf_init(autoconf_parameters_t *autoconf_vars, mumudvb_channel_t *channels,int number_of_channels); void autoconf_freeing(autoconf_parameters_t *); int read_autoconfiguration_configuration(autoconf_parameters_t *autoconf_vars, char *substring); int autoconf_new_packet(int pid, unsigned char *ts_packet, autoconf_parameters_t *autoconf_vars, fds_t *fds, mumudvb_chan_and_pids_t *chan_and_pids, tuning_parameters_t *tuneparams, multicast_parameters_t *multicast_vars, unicast_parameters_t *unicast_vars, int server_id); int autoconf_poll(long now, autoconf_parameters_t *autoconf_vars, mumudvb_chan_and_pids_t *chan_and_pids, tuning_parameters_t *tuneparams, multicast_parameters_t *multicast_vars, fds_t *fds, unicast_parameters_t *unicast_vars, int server_id); void autoconf_pmt_follow( unsigned char *ts_packet, fds_t *fds, mumudvb_channel_t *actual_channel, char *card_base_path, int tuner, mumudvb_chan_and_pids_t *chan_and_pids ); #endif mumudvb-1.7.1/src/autoconf_atsc.c000066400000000000000000000275201177353207000167750ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * File for Autoconfiguration * * (C) 2008-2010 Brice DUBOST * * Parts of this code come from libdvb, modified for mumudvb * by Brice DUBOST * Libdvb part : Copyright (C) 2000 Klaus Schmidinger * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief This file contain the code related to the ATSC tables reading for autoconfiguration * */ #include #include #include "errors.h" #include "mumudvb.h" #include "autoconf.h" #include "log.h" #ifdef HAVE_ICONV #include #endif //LIBUCSI for long channel names #ifdef HAVE_LIBUCSI #include #endif mumudvb_service_t *autoconf_find_service_for_add(mumudvb_service_t *services,int service_id); int autoconf_parse_vct_channel(unsigned char *buf, autoconf_parameters_t *parameters); static char *log_module="Autoconf: "; /******************************************************* ATSC ********************************************************/ /** @brief Read a PSIP table to find channels names * * We read the master PSIP pid, search for a (T/C)VCT table * If it find this table, searches for channels within the transport (check * the transport id found in the PAT) and for the extended channel name descriptor * For the moment if the name of the channel is compressed, it will use the short channel * * @param parameters : the structure containing autoconfiguration parameters */ int autoconf_read_psip(autoconf_parameters_t *parameters) { mumudvb_ts_packet_t *psip_mumu; int number_of_channels_in_section=0; int delta=0; int i=0; unsigned char *buf=NULL; //We get the packet psip_mumu=parameters->autoconf_temp_psip; buf=psip_mumu->data_full; psip_t *psip=(psip_t*)(buf); //We look only for the following tables OxC8 : TVCT (Terrestrial Virtual Channel Table), 0XC9 : CVCT (Cable Virtual Channel Table) if (psip->table_id != 0xc8 && psip->table_id != 0xc9) return 1; log_message( log_module, MSG_DEBUG,"---- ATSC : PSIP TVCT ot CVCT----\n"); /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(psip->current_next_indicator == 0) { log_message( log_module, MSG_FLOOD,"PSIP not yet valid, we get a new one (current_next_indicator == 0)\n"); return 1; } if(parameters->transport_stream_id<0) { log_message( log_module, MSG_DEBUG,"We don't have a transport id from the PAT, we skip this PSIP\n"); return 1; } log_message( log_module, MSG_DEBUG,"PSIP transport_stream_id : 0x%x PAT TSID 0x%x\n", HILO(psip->transport_stream_id), parameters->transport_stream_id); if(HILO(psip->transport_stream_id)!=parameters->transport_stream_id) { log_message( log_module, MSG_DEBUG,"This table belongs to another transponder, we skip\n"); return 1; } number_of_channels_in_section=buf[PSIP_HEADER_LEN]; //This field is the byte just after the PSIP header delta=PSIP_HEADER_LEN+1; log_message( log_module, MSG_DEBUG,"VCT : number_of_channels_in_section %d\n", number_of_channels_in_section); //We parse the channels for(i=0;ishort_name, 14*sizeof(uint8_t)); unconverted_short_name[14] = '\0'; #ifdef HAVE_ICONV //Conversion to utf8 of the short name iconv_t cd; //we open the conversion table cd = iconv_open( "UTF8", "UTF-16BE" ); log_message( log_module, MSG_DEBUG,"We use big Endian UTF16 as source for channel name, if it give weird characters please contact\n"); size_t inSize, outSize=14; inSize=14; //pointers initialisation dest=utf8_short_name; inbuf=unconverted_short_name; //conversion iconv(cd, &inbuf, &inSize, &dest, &outSize ); *dest = '\0'; iconv_close( cd ); #else log_message( log_module, MSG_DETAIL, "Iconv not present, no name encoding conversion the reseult will be probably bad\n"); memcpy (utf8_short_name, vct_channel->short_name, 14*sizeof(uint8_t)); utf8_short_name[14] = '\0'; #endif log_message( log_module, MSG_DEBUG, "\tchannel short_name : \"%s\"\n", utf8_short_name); //************ We skip "ininteresting" channels **************** if(vct_channel->modulation_mode==0x01) { log_message( log_module, MSG_DEBUG, "\tAnalog channel, we skip\n"); return PSIP_VCT_LEN + HILO(vct_channel->descriptor_length); //We return the length } if(HILO(vct_channel->channel_tsid)!=parameters->transport_stream_id) { log_message( log_module, MSG_DEBUG,"Channel for another transponder, we skip : Channel TSID 0x%x , PAT TSID 0x%x\n", HILO(vct_channel->channel_tsid), parameters->transport_stream_id); return PSIP_VCT_LEN + HILO(vct_channel->descriptor_length); //We return the length } if(vct_channel->hidden) { log_message( log_module, MSG_DEBUG,"This channel is supposed to be hidden, we skip. Please contact if you want to bypass\n"); return PSIP_VCT_LEN + HILO(vct_channel->descriptor_length); //We return the length } //We "convert" ATSC service type to the "equivalent" MPEG2 service type switch(vct_channel->service_type) { case 0x02://ATSC_digital_television — The virtual channel carries television programming (audio, video and //optional associated data) conforming to ATSC standards mpeg2_service_type=0x01; //service_type "digital television service" (0x01) log_message( log_module, MSG_DEBUG,"vct_channel->service_type ATSC_digital_television\n"); break; case 0x03://ATSC_audio — The virtual channel carries audio programming (audio service and optional //associated data) conforming to ATSC standards. mpeg2_service_type=0x02;//service_type digital radio sound service (0x02) log_message( log_module, MSG_DEBUG,"vct_channel->service_type ATSC_audio\n",vct_channel->service_type); break; case 0x04://ATSC_data_only_service — The virtual channel carries a data service conforming to ATSC //standards, but no video of stream_type 0x02 or audio of stream_type 0x81. mpeg2_service_type=0x0c;//service_type data broadcast service log_message( log_module, MSG_DEBUG,"vct_channel->service_type ATSC_data_only_service\n",vct_channel->service_type); break; default: log_message( log_module, MSG_DEBUG,"Unknown vct_channel->service_type 0x%02x\n",vct_channel->service_type); break; } #ifdef HAVE_LIBUCSI //used to decompress the atsc_text_descriptor int descriptor_delta; uint8_t *dest8=NULL; //Pointer for libusci conversion size_t destbufsize=MAX_NAME_LEN; size_t destbufpos=0; int descriptor_len; int atsc_decode_out; int delta_multiple_string_structure; //the beginning of tmultiple string structure //We loop on the different descriptors to find the long channel name for(descriptor_delta=0;descriptor_deltadescriptor_length);) { descriptor_len=buf[PSIP_VCT_LEN+descriptor_delta+1]; if(buf[PSIP_VCT_LEN+descriptor_delta]==0xA0) //Extended channel name descriptor { log_message( log_module, MSG_DEBUG, "Extended channel name descriptor, we try to decode long channel name\n"); dest8=(uint8_t *)long_name; //same type size, just the sign change but we don't care //check delta_multiple_string_structure=PSIP_VCT_LEN+descriptor_delta+2;//+2 to skip descriptor tag and descriptor len if (atsc_text_validate(((uint8_t*)(buf + delta_multiple_string_structure) ), buf[PSIP_VCT_LEN+descriptor_delta+1])) { log_message( log_module, MSG_DEBUG, "Error when VALIDATING long channel name, we take the short one\n"); } else { //If we have multiple strings for the channel name we ask people to report if(buf[delta_multiple_string_structure]!=1 || buf[delta_multiple_string_structure+1+3] !=1) { log_message( log_module, MSG_WARN, "!!!!! Please report : parsing of long name : number strings : %d number segments : %d\n", buf[delta_multiple_string_structure], buf[delta_multiple_string_structure+1+3]); } //Since it's only the channel name, we don't loop over strings and segments //We decode the text using LIBUCSI atsc_decode_out=atsc_text_segment_decode((struct atsc_text_string_segment *) (buf +delta_multiple_string_structure + MULTIPLE_STRING_STRUCTURE_HEADER), &dest8, &destbufsize, &destbufpos); if(atsc_decode_out!=-1) //No errors { dest8[atsc_decode_out]='\0'; //We take the long one log_message( log_module, MSG_DEBUG, "Decoded long channel name : \"%s\"\n",dest8); channel_name=long_name; } else log_message( log_module, MSG_DEBUG, "Error when decoding long channel name, we take the short one\n"); } } //Take the short name if error if(!channel_name) channel_name=utf8_short_name; //Next descriptor descriptor_delta+=descriptor_len+2;//We add the descriptor_len +2 for descriptor tag and descriptor len } #else //We don't use libusci, we don't try to get long channel name channel_name=utf8_short_name; #endif //************** We add this channel to the list of services ***************** //we search if we already have service id new_service=autoconf_find_service_for_add(parameters->services,HILO(vct_channel->program_number)); //The service id IS the program number if(new_service) { log_message( log_module, MSG_DETAIL, "Adding new channel %s to the list of services , program number : 0x%x \n", channel_name, HILO(vct_channel->program_number)); //we store the data new_service->id=HILO(vct_channel->program_number); new_service->running_status=0; new_service->type=mpeg2_service_type; new_service->free_ca_mode=vct_channel->access_controlled; log_message( log_module, MSG_DEBUG, "access_controlled : 0x%x\n", new_service->free_ca_mode); memcpy (new_service->name, channel_name, strlen(channel_name)); new_service->name[strlen(channel_name)] = '\0'; } //**************** Work done for this channel -- goodbye ********************* return PSIP_VCT_LEN + HILO(vct_channel->descriptor_length); //We return the length } mumudvb-1.7.1/src/autoconf_nit.c000066400000000000000000000513431177353207000166350ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * File for Autoconfiguration * * (C) 2008-2011 Brice DUBOST * * Parts of this code come from libdvb, modified for mumudvb * by Brice DUBOST * Libdvb part : Copyright (C) 2000 Klaus Schmidinger * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief This file contain the code related to the NIT reading for autoconfiguration * */ #include #include #include #include "errors.h" #include "mumudvb.h" #include "autoconf.h" #include "log.h" static char *log_module="Autoconf: "; extern int Interrupted; void parse_nit_descriptors(unsigned char *buf,int descriptors_loop_len); void parse_nit_ts_descriptor(unsigned char *buf,int ts_descriptors_loop_len, mumudvb_channel_t *channels, int number_of_channels); int convert_en399468_string(char *string, int max_len); void parse_network_name_descriptor(unsigned char *buf); void parse_multilingual_network_name_descriptor(unsigned char *buf); void parse_lcn_descriptor(unsigned char *buf, mumudvb_channel_t *channels, int number_of_channels); void parse_service_list_descriptor_descriptor(unsigned char *buf); void parse_satellite_delivery_system_descriptor(unsigned char *buf); void parse_terrestrial_delivery_system_descriptor(unsigned char *buf); /** @brief Read the network information table (cf EN 300 468) * */ int autoconf_read_nit(autoconf_parameters_t *parameters, mumudvb_channel_t *channels, int number_of_channels) { mumudvb_ts_packet_t *nit_mumu; unsigned char *buf=NULL; //We get the packet nit_mumu=parameters->autoconf_temp_nit; buf=nit_mumu->data_full; nit_t *header=(nit_t*)(buf); //We look only for the following table Ox40 : network_information_section - actual_network if (header->table_id != 0x40) { log_message( log_module, MSG_FLOOD,"NIT : Bad table %d\n", header->table_id); return 1; } /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(header->current_next_indicator == 0) { log_message( log_module, MSG_FLOOD,"NIT not yet valid, we get a new one (current_next_indicator == 0)\n"); return 1; } log_message( log_module, MSG_DEBUG, "-- NIT : Network Information Table --\n"); log_message( log_module, MSG_DEBUG, "Network id 0x%02x\n", HILO(header->network_id)); int network_descriptors_length = HILO(header->network_descriptor_length); //Loop over different descriptors in the NIT buf+=NIT_LEN; //We read the descriptors parse_nit_descriptors(buf,network_descriptors_length); buf += network_descriptors_length; nit_mid_t *middle=(nit_mid_t *)buf; int ts_loop_length=HILO(middle->transport_stream_loop_length); buf +=SIZE_NIT_MID; parse_nit_ts_descriptor(buf,ts_loop_length, channels, number_of_channels); return 0; } /** @brief Parse the NIT Network descriptors * Loop over the sdt descriptors and call other parsing functions if necessary * @param buf the buffer containing the descriptors * @param descriptors_loop_len the len of buffer containing the descriptors * @param service the associated service */ void parse_nit_descriptors(unsigned char *buf,int descriptors_loop_len) { while (descriptors_loop_len > 0) { unsigned char descriptor_tag = buf[0]; unsigned char descriptor_len = buf[1] + 2; if (!descriptor_len) { log_message( log_module, MSG_DEBUG, " --- NIT descriptor --- descriptor_tag == 0x%02x, len is 0\n", descriptor_tag); break; } //The service descriptor provides the names of the service provider and the service in text form together with the service_type. if(descriptor_tag==0x40) parse_network_name_descriptor(buf); else if(descriptor_tag==0x5B) parse_multilingual_network_name_descriptor(buf); else log_message( log_module, MSG_FLOOD, "NIT descriptor_tag : 0x%2x\n", descriptor_tag); buf += descriptor_len; descriptors_loop_len -= descriptor_len; } } void parse_nit_ts_descriptor(unsigned char* buf, int ts_descriptors_loop_len, mumudvb_channel_t* channels, int number_of_channels) { int descriptors_loop_len; nit_ts_t *descr_header; int ts_id; while (ts_descriptors_loop_len > 0) { descr_header=(nit_ts_t *)(buf); descriptors_loop_len=HILO(descr_header->transport_descriptors_length); log_message( log_module, MSG_FLOOD, " --- NIT ts_descriptors_loop_len %d descriptors_loop_len %d\n", ts_descriptors_loop_len, descriptors_loop_len); ts_id=HILO(descr_header->transport_stream_id); log_message( log_module, MSG_DEBUG, " --- NIT descriptor concerning the multiplex %d\n", ts_id); buf +=NIT_TS_LEN; ts_descriptors_loop_len -= (descriptors_loop_len+NIT_TS_LEN); while (descriptors_loop_len > 0) { unsigned char descriptor_tag = buf[0]; unsigned char descriptor_len = buf[1] + 2; if (!descriptor_len) { log_message( log_module, MSG_DEBUG, " --- NIT descriptor --- descriptor_tag == 0x%02x, len is 0\n", descriptor_tag); break; } if(descriptor_tag==0x83) parse_lcn_descriptor(buf, channels, number_of_channels); else if(descriptor_tag==0x41) parse_service_list_descriptor_descriptor(buf); else if(descriptor_tag==0x43) parse_satellite_delivery_system_descriptor(buf); else if(descriptor_tag==0x5A) parse_terrestrial_delivery_system_descriptor(buf); else log_message( log_module, MSG_FLOOD, " --- NIT descriptor --- descriptor_tag == 0x%02x len %d descriptors_loop_len %d ------------\n", descriptor_tag, descriptor_len, descriptors_loop_len); buf += descriptor_len; descriptors_loop_len -= descriptor_len; } } } /** @brief Parse the network name descriptor * It's used to get the network name * @param buf the buffer containing the descriptor */ void parse_multilingual_network_name_descriptor(unsigned char *buf) { /* Service descriptor : descriptor_tag 8 descriptor_length 8 for (i=0;i 0) { language_code[0]=*buf;buf++; language_code[1]=*buf;buf++; language_code[2]=*buf;buf++; language_code[3]='\0'; name_len=*buf;buf++; log_message( log_module, MSG_FLOOD, "NIT network descriptor_len %d, name_len %d\n",descriptor_len , name_len); dest=malloc(sizeof(char)*(name_len+1)); memcpy (dest, buf, name_len); dest[name_len] = '\0'; buf += name_len; convert_en399468_string(dest,name_len); log_message( log_module, MSG_DEBUG, "lang code %s network name : \"%s\"\n",language_code, dest); descriptor_len -= (name_len+4); free(dest); } } /** @brief Parse the network name descriptor * It's used to get the network name * @param buf the buffer containing the descriptor */ void parse_network_name_descriptor(unsigned char *buf) { /* Service descriptor : descriptor_tag 8 descriptor_length 8 for (i=0;i 0) { lcn=(nit_lcn_t *)buf; buf+=NIT_LCN_LEN; service_id= HILO(lcn->service_id); i_lcn=HILO(lcn->logical_channel_number); log_message( log_module, MSG_DEBUG, "NIT LCN channel number %d, service id %d visible %d\n",i_lcn ,service_id, lcn->visible_service_flag); for(curr_channel=0;curr_channelfrequency_4, descr->frequency_3, descr->frequency_2, descr->frequency_1); log_message( log_module, MSG_DETAIL, "Orbital position: %d%01d,%01d°", descr->orbital_position_hi,(descr->orbital_position_lo>>4)&0x0f, descr->orbital_position_lo&0x0f); if(descr->west_east_flag) log_message( log_module, MSG_DETAIL, "Estern position"); else log_message( log_module, MSG_DETAIL, "Western position"); switch(descr->polarization) { log_message( log_module, MSG_DETAIL, "Polarization: (0x%02x)", descr->polarization); case 0: log_message( log_module, MSG_DETAIL, "Polarization: linear - horizontal"); break; case 1: log_message( log_module, MSG_DETAIL, "Polarization: linear - vertical"); break; case 2: log_message( log_module, MSG_DETAIL, "Polarization: circular - left"); break; case 3: log_message( log_module, MSG_DETAIL, "Polarization: circular - right"); break; default: log_message( log_module, MSG_DETAIL, "Polarization: BUG"); break; } if(descr->modulation_system) log_message( log_module, MSG_DETAIL, "Modulation system: DVB-S2"); else log_message( log_module, MSG_DETAIL, "Modulation system: DVB-S"); if(descr->modulation_system) { switch(descr->roll_off) { case 0: log_message( log_module, MSG_DETAIL, "Roll-off factor: α = 0,35"); break; case 1: log_message( log_module, MSG_DETAIL, "Roll-off factor: α = 0,25"); break; case 2: log_message( log_module, MSG_DETAIL, "Roll-off factor: α = 0,20"); break; case 3: log_message( log_module, MSG_DETAIL, "Roll-off factor: reserved"); break; default: log_message( log_module, MSG_DETAIL, "Roll-off factor: BUG"); break; } } switch(descr->modulation_type) { case 0: log_message( log_module, MSG_DETAIL, "Constellation: Auto"); break; case 1: log_message( log_module, MSG_DETAIL, "Constellation: QPSK"); break; case 2: log_message( log_module, MSG_DETAIL, "Constellation: 8PSK"); break; case 3: log_message( log_module, MSG_DETAIL, "Constellation: 16-QAM"); break; default: log_message( log_module, MSG_DETAIL, "Constellation: BUG"); break; } log_message( log_module, MSG_DETAIL, "Symbol rate: %d%d%d,%d%d%d%d Msymbol/s", BCDHI(descr->symbol_rate_12), BCDLO(descr->symbol_rate_12), BCDHI(descr->symbol_rate_34), BCDLO(descr->symbol_rate_34), BCDHI(descr->symbol_rate_56), BCDLO(descr->symbol_rate_56), BCDLO(descr->symbol_rate_7) ); switch(descr->FEC_inner) { case 0: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: not defined"); break; case 1: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 1/2"); break; case 2: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 2/3"); break; case 3: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 3/4"); break; case 4: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 5/6"); break; case 5: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 7/8"); break; case 6: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 8/9"); break; case 7: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 3/5"); break; case 8: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 4/5"); break; case 9: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: 9/10"); break; case 10: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: Reserved for future use"); break; case 11: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: Reserved for future use"); break; case 12: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: no convolutional coding"); break; default: log_message( log_module, MSG_DETAIL, "Inner FEC scheme: BUG please contact"); break; } log_message( log_module, MSG_DETAIL, "--- descriptor done ---\n"); } /** @brief display the contents of terrestrial_delivery_system_descriptor * EN 300 468 V1.10.1 6.2.13.4 Terrestrial delivery system descriptor */ void parse_terrestrial_delivery_system_descriptor(unsigned char *buf) { descr_terr_delivery_t *descr; descr=(descr_terr_delivery_t *)buf; log_message( log_module, MSG_DETAIL, "--- NIT descriptor --- terrestrial delivery system descriptor\n"); log_message( log_module, MSG_DETAIL, "Frequency: %ld Hz", ((descr->frequency_4<<24)+(descr->frequency_3<<16)+(descr->frequency_2<<8)+descr->frequency_1) *10 ); if(descr->bandwidth<=3) log_message( log_module, MSG_DETAIL, "Bandwidth: %d MHz",8-descr->bandwidth); else log_message( log_module, MSG_DETAIL, "Bandwidth: Reserved for future use"); if(descr->priority) log_message( log_module, MSG_DETAIL, "Priority: HP (high priority)"); else log_message( log_module, MSG_DETAIL, "Priority: LP (low priority)"); log_message( log_module, MSG_DETAIL, "Time_Slicing_indicator: %d",descr->Time_Slicing_indicator); log_message( log_module, MSG_DETAIL, "MPE_FEC_indicator: %d",descr->MPE_FEC_indicator ); switch(descr->constellation) { case 0: log_message( log_module, MSG_DETAIL, "Constellation: QPSK"); break; case 1: log_message( log_module, MSG_DETAIL, "Constellation: 16-QAM"); break; case 2: log_message( log_module, MSG_DETAIL, "Constellation: 64-QAM"); break; case 3: log_message( log_module, MSG_DETAIL, "Constellation: RFU"); break; default: log_message( log_module, MSG_DETAIL, "Constellation: BUG"); break; } switch(descr->hierarchy_information) { case 0: log_message( log_module, MSG_DETAIL, "hierarchy_information: non-hierarchical, native interleaver"); break; case 1: log_message( log_module, MSG_DETAIL, "hierarchy_information: α = 1, native interleaver"); break; case 2: log_message( log_module, MSG_DETAIL, "hierarchy_information: α = 2, native interleaver"); break; case 3: log_message( log_module, MSG_DETAIL, "hierarchy_information: α = 4, native interleaver"); break; case 4: log_message( log_module, MSG_DETAIL, "hierarchy_information: non-hierarchical, in-depth interleaver"); break; case 5: log_message( log_module, MSG_DETAIL, "hierarchy_information: α = 1, in-depth interleaver"); break; case 6: log_message( log_module, MSG_DETAIL, "hierarchy_information: α = 2, in-depth interleaver"); break; case 7: log_message( log_module, MSG_DETAIL, "hierarchy_information: α = 4, in-depth interleaver"); break; default: log_message( log_module, MSG_DETAIL, "hierarchy_information: BUG please contact"); break; } switch(descr->code_rate_HP_stream) { case 0: log_message( log_module, MSG_DETAIL, "code_rate_HP_stream: 1/2"); break; case 1: log_message( log_module, MSG_DETAIL, "code_rate_HP_stream: 2/3"); break; case 2: log_message( log_module, MSG_DETAIL, "code_rate_HP_stream: 3/4"); break; case 3: log_message( log_module, MSG_DETAIL, "code_rate_HP_stream: 5/6"); break; case 4: log_message( log_module, MSG_DETAIL, "code_rate_HP_stream: 7/8"); break; case 5: case 6: case 7: default: log_message( log_module, MSG_DETAIL, "code_rate_HP_stream: RFU"); break; } switch(descr->code_rate_LP_stream) { case 0: log_message( log_module, MSG_DETAIL, "code_rate_LP_stream: 1/2"); break; case 1: log_message( log_module, MSG_DETAIL, "code_rate_LP_stream: 2/3"); break; case 2: log_message( log_module, MSG_DETAIL, "code_rate_LP_stream: 3/4"); break; case 3: log_message( log_module, MSG_DETAIL, "code_rate_LP_stream: 5/6"); break; case 4: log_message( log_module, MSG_DETAIL, "code_rate_LP_stream: 7/8"); break; case 5: case 6: case 7: default: log_message( log_module, MSG_DETAIL, "code_rate_LP_stream: RFU"); break; } switch(descr->guard_interval) { case 0: log_message( log_module, MSG_DETAIL, "guard_interval: 1/32"); break; case 1: log_message( log_module, MSG_DETAIL, "guard_interval: 1/16"); break; case 2: log_message( log_module, MSG_DETAIL, "guard_interval: 1/8"); break; case 3: log_message( log_module, MSG_DETAIL, "guard_interval: 1/4"); break; default: log_message( log_module, MSG_DETAIL, "guard_interval: BUG"); break; } switch(descr->transmission_mode) { case 0: log_message( log_module, MSG_DETAIL, "transmission_mode: 2k"); break; case 1: log_message( log_module, MSG_DETAIL, "transmission_mode: 8k"); break; case 2: log_message( log_module, MSG_DETAIL, "transmission_mode: 4k"); break; case 3: log_message( log_module, MSG_DETAIL, "transmission_mode: RFU"); break; default: log_message( log_module, MSG_DETAIL, "transmission_mode: BUG"); break; } if(descr->other_frequency_flag) log_message( log_module, MSG_DETAIL, "other_frequency_flag: one or more other frequencies are in use"); else log_message( log_module, MSG_DETAIL, "other_frequency_flag: no other frequency is in use"); log_message( log_module, MSG_DETAIL, "--- descriptor done ---\n"); } mumudvb-1.7.1/src/autoconf_pmt.c000066400000000000000000000612331177353207000166420ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * File for Autoconfiguration * * (C) 2008-2011 Brice DUBOST * * Parts of this code come from libdvb, modified for mumudvb * by Brice DUBOST * Libdvb part : Copyright (C) 2000 Klaus Schmidinger * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief This file contain the code related to the PMT reading for autoconfiguration * */ extern int Interrupted; static char *log_module="Autoconf: "; #include #include #include "errors.h" #include "mumudvb.h" #include "autoconf.h" #include "log.h" #include "dvb.h" mumudvb_service_t *autoconf_find_service_for_add(mumudvb_service_t *services,int service_id); mumudvb_service_t *autoconf_find_service_for_modify(mumudvb_service_t *services,int service_id); int pmt_find_descriptor(uint8_t tag, unsigned char *buf, int descriptors_loop_len, int *pos); void pmt_print_descriptor_tags(unsigned char *buf, int descriptors_loop_len); void autoconf_free_services(mumudvb_service_t *services); int autoconf_read_psip(autoconf_parameters_t *parameters); /****************************************************************************/ //Parts of this code (read of the pmt and read of the pat) // from libdvb, strongly modified, with commentaries added /****************************************************************************/ /** @brief Reads the program map table * * It's used to get the differents "useful" pids of the channel * @param pmt the pmt packet * @param channel the associated channel */ int autoconf_read_pmt(mumudvb_ts_packet_t *pmt, mumudvb_channel_t *channel, char *card_base_path, int tuner, uint8_t *asked_pid, uint8_t *number_chan_asked_pid,fds_t *fds) { int section_len, descr_section_len, i,j; int pid,pcr_pid; int pid_type; int found=0; pmt_t *header; pmt_info_t *descr_header; int program_info_length; int channel_update; //For channel update int temp_pids[MAX_PIDS_PAR_CHAINE]; int temp_pids_type[MAX_PIDS_PAR_CHAINE]; char temp_pids_language[MAX_PIDS_PAR_CHAINE][4]; //For channel update int temp_num_pids=0; pid_type=0; section_len=pmt->len_full; header=(pmt_t *)pmt->data_full; if(header->table_id!=0x02) { log_message( log_module, MSG_INFO,"Packet PID %d for channel \"%s\" is not a PMT PID. We remove the pmt pid for this channel\n", pmt->pid, channel->name); channel->pmt_pid=0; /** @todo : put a threshold, */ return 1; } //We check if this PMT belongs to the current channel. (Only works with autoconfiguration full for the moment because it stores the service_id) if(channel->service_id && (channel->service_id != HILO(header->program_number)) ) { log_message( log_module, MSG_DETAIL,"The PMT %d does not belongs to channel \"%s\"\n", pmt->pid, channel->name); return 1; } /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(header->current_next_indicator == 0) { log_message( log_module, MSG_DEBUG,"The current_next_indicator is set to 0, this PMT is not valid for the current stream\n"); return 1; } log_message( log_module, MSG_DEBUG,"PMT (PID %d) read for autoconfiguration of channel \"%s\"\n", pmt->pid, channel->name); channel_update=channel->num_pids>1?1:0; if(channel_update) { // Update log_message( log_module, MSG_INFO,"Channel %s update\n",channel->name); temp_pids[0]=pmt->pid; temp_num_pids++; #ifdef ENABLE_CAM_SUPPORT // Reset of the CA SYS saved for the chanel for (i=0; i<32; i++) channel->ca_sys_id[i]=0; #endif } program_info_length=HILO(header->program_info_length); //program_info_length char language[4]=""; int pos=0; //we read the different descriptors included in the pmt //for more information see ITU-T Rec. H.222.0 | ISO/IEC 13818 table 2-34 for (i=program_info_length+PMT_LEN; i<=section_len-(PMT_INFO_LEN+4); i+=descr_section_len+PMT_INFO_LEN) { //we parse the part after the descriptors //we map the descriptor header descr_header=(pmt_info_t *)(pmt->data_full+i); //We get the length of the descriptor descr_section_len=HILO(descr_header->ES_info_length); //ES_info_length // Default language value if not found snprintf(language,4,"%s","---"); // Default, no position found pos=0; pid=HILO(descr_header->elementary_PID); //Depending of the stream type we'll take or not this pid switch(descr_header->stream_type) { case 0x01: pid_type=PID_VIDEO_MPEG1; log_message( log_module, MSG_DEBUG," Video MPEG1 \tpid %d\n",pid); break; case 0x02: pid_type=PID_VIDEO_MPEG2; log_message( log_module, MSG_DEBUG," Video MPEG2 \tpid %d\n",pid); break; case 0x10: /* ISO/IEC 14496-2 Visual - MPEG4 video */ pid_type=PID_VIDEO_MPEG4_ASP; log_message( log_module, MSG_DEBUG," Video MPEG4-ASP \tpid %d\n",pid); break; case 0x1b: /* AVC video stream as defined in ITU-T Rec. H.264 | ISO/IEC 14496-10 Video */ pid_type=PID_VIDEO_MPEG4_AVC; log_message( log_module, MSG_DEBUG," Video MPEG4-AVC \tpid %d\n",pid); break; case 0x03: pid_type=PID_AUDIO_MPEG1; log_message( log_module, MSG_DEBUG," Audio MPEG1 \tpid %d\n",pid); break; case 0x04: pid_type=PID_AUDIO_MPEG2; log_message( log_module, MSG_DEBUG," Audio MPEG2 \tpid %d\n",pid); break; case 0x11: /* ISO/IEC 14496-3 Audio with the LATM transport syntax as defined in ISO/IEC 14496-3 */ pid_type=PID_AUDIO_AAC_LATM; log_message( log_module, MSG_DEBUG," Audio AAC-LATM \tpid %d\n",pid); break; case 0x0f: /* ISO/IEC 13818-7 Audio with ADTS transport syntax - usually AAC */ pid_type=PID_AUDIO_AAC_ADTS; log_message( log_module, MSG_DEBUG," Audio AAC-ADTS \tpid %d\n",pid); break; case 0x81: /* Audio per ATSC A/53B [2] Annex B */ pid_type=PID_AUDIO_ATSC; log_message( log_module, MSG_DEBUG," Audio ATSC A/53B \tpid %d\n",pid); break; case 0x06: /* Descriptor defined in EN 300 468 */ if(descr_section_len) //If we have an accociated descriptor, we'll search inforation in it { if(pmt_find_descriptor(0x45,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, NULL)){ log_message( log_module, MSG_DEBUG," VBI Data \tpid %d\n",pid); pid_type=PID_EXTRA_VBIDATA; }else if(pmt_find_descriptor(0x46,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, NULL)){ log_message( log_module, MSG_DEBUG," VBI Teletext \tpid %d\n",pid); pid_type=PID_EXTRA_VBITELETEXT; }else if(pmt_find_descriptor(0x56,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, NULL)){ log_message( log_module, MSG_DEBUG," Teletext \tpid %d\n",pid); pid_type=PID_EXTRA_TELETEXT; }else if(pmt_find_descriptor(0x59,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, &pos)){ log_message( log_module, MSG_DEBUG," Subtitling \tpid %d\n",pid); pid_type=PID_EXTRA_SUBTITLE; char * lng=(char *)(pmt->data_full+i+PMT_INFO_LEN+pos+2); language[0]=lng[0]; language[1]=lng[1]; language[2]=lng[2]; language[3]=0; }else if(pmt_find_descriptor(0x6a,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, NULL)){ log_message( log_module, MSG_DEBUG," AC3 (audio) \tpid %d\n",pid); pid_type=PID_AUDIO_AC3; }else if(pmt_find_descriptor(0x7a,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, NULL)){ log_message( log_module, MSG_DEBUG," Enhanced AC3 (audio) \tpid %d\n",pid); pid_type=PID_AUDIO_EAC3; }else if(pmt_find_descriptor(0x7b,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, NULL)){ log_message( log_module, MSG_DEBUG," DTS (audio) \tpid %d\n",pid); pid_type=PID_AUDIO_DTS; }else if(pmt_find_descriptor(0x7c,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, NULL)){ log_message( log_module, MSG_DEBUG," AAC (audio) \tpid %d\n",pid); pid_type=PID_AUDIO_AAC; }else { log_message( log_module, MSG_DEBUG,"Unknown descriptor see EN 300 468 v1.9.1 table 12, pid %d descriptor tags : ", pid); pmt_print_descriptor_tags(pmt->data_full+i+PMT_INFO_LEN,descr_section_len); log_message( log_module, MSG_DEBUG,"\n"); continue; } } else { log_message( log_module, MSG_DEBUG,"PMT read : stream type 0x06 without descriptor\n"); continue; } break; //Now, the list of what we drop case 0x05: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : 0x05, ITU-T Rec. H.222.0 | ISO/IEC 13818-1 private_sections \n",pid); continue; //Digital Storage Medium Command and Control (DSM-CC) cf H.222.0 | ISO/IEC 13818-1 annex B case 0x0a: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : 0x0A ISO/IEC 13818-6 type A (DSM-CC)\n",pid); continue; case 0x0b: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : 0x0B ISO/IEC 13818-6 type B (DSM-CC)\n",pid); continue; case 0x0c: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : 0x0C ISO/IEC 13818-6 type C (DSM-CC)\n",pid); continue; case 0x0D: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : ISO/IEC 13818-6 type D",pid); continue; case 0x0E: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : ITU-T Rec. H.222.0 | ISO/IEC 13818-1 auxiliary",pid); continue; case 0x12: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : ISO/IEC 14496-1 SL-packetized stream or FlexMux stream carried in PES packets",pid); continue; case 0x13: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : ISO/IEC 14496-1 SL-packetized stream or FlexMux stream carried in ISO/IEC 14496_sections",pid); continue; case 0x14: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : ISO/IEC 13818-6 Synchronized Download Protocol",pid); continue; case 0x15: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : Metadata carried in PES packets",pid); continue; case 0x16: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : Metadata carried in metadata_sections",pid); continue; case 0x17: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : Metadata carried in ISO/IEC 13818-6 Data Carousel",pid); continue; case 0x18: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : Metadata carried in ISO/IEC 13818-6 Object Carousel",pid); continue; case 0x19: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : Metadata carried in ISO/IEC 13818-6 Synchronized Download Protocol",pid); continue; case 0x1A: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : IPMP stream (defined in ISO/IEC 13818-11, MPEG-2 IPMP)",pid); continue; case 0x7F: log_message( log_module, MSG_DEBUG, "Dropped pid %d, type : IPMP stream",pid); continue; default: if(descr_header->stream_type >= 0x1C && descr_header->stream_type <= 0x7E) log_message( log_module, MSG_DEBUG, "Dropped pid %d, stream type : 0x%02x : ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Reserved",pid,descr_header->stream_type); else if(descr_header->stream_type >= 0x80) log_message( log_module, MSG_DEBUG, "Dropped pid %d, stream type : 0x%02x : User Private",pid,descr_header->stream_type); else log_message( log_module, MSG_INFO, "!!!!Unknown stream type : 0x%02x, PID : %d cf ITU-T Rec. H.222.0 | ISO/IEC 13818\n",descr_header->stream_type,pid); continue; } //We keep this pid // We try to find a 0x0a (ISO639) descriptor to have language information about the stream pos=0; if(pmt_find_descriptor(0x0a,pmt->data_full+i+PMT_INFO_LEN,descr_section_len, &pos)){ char * lng=(char *)(pmt->data_full+i+PMT_INFO_LEN+pos+2); language[0]=lng[0]; language[1]=lng[1]; language[2]=lng[2]; language[3]=0; } log_message( log_module, MSG_DEBUG," PID Language Code = %s\n",language); //For cam debugging purposes, we look if we can find a ca descriptor to display ca system ids if(descr_section_len) { int pos; int casysid; pos=0; while(pmt_find_descriptor(0x09,pmt->data_full+i+PMT_INFO_LEN,descr_section_len,&pos)) { descr_ca_t *ca_descriptor; ca_descriptor=(descr_ca_t *)(pmt->data_full+i+PMT_INFO_LEN+pos); casysid=0; while(channel->ca_sys_id[casysid] && channel->ca_sys_id[casysid]!=HILO(ca_descriptor->CA_type)&& casysid<32 ) casysid++; if(!channel->ca_sys_id[casysid]) { channel->ca_sys_id[casysid]=HILO(ca_descriptor->CA_type); log_message( log_module, MSG_DETAIL,"Ca system id 0x%04x : %s\n", HILO(ca_descriptor->CA_type), ca_sys_id_to_str(HILO(ca_descriptor->CA_type)));//we display it with the description } pos+=ca_descriptor->descriptor_length+2; } } if(channel_update) { temp_pids[temp_num_pids]=pid; temp_pids_type[temp_num_pids]=pid_type; snprintf(temp_pids_language[temp_num_pids],4,"%s",language); temp_num_pids++; } else { channel->pids[channel->num_pids]=pid; channel->pids_type[channel->num_pids]=pid_type; snprintf(channel->pids_language[channel->num_pids],4,"%s",language); channel->num_pids++; } } /************************** * PCR PID **************************/ pcr_pid=HILO(header->PCR_PID); //The PCR pid. //we check if it's not already included (ie the pcr is carried with the video) found=0; for(i=0;inum_pids;i++) { if((channel_update && temp_pids[i]==pcr_pid) || (!channel_update && channel->pids[i]==pcr_pid)) found=1; } if(!found) { if(channel_update) { temp_pids[temp_num_pids]=pcr_pid; temp_pids_type[temp_num_pids]=PID_PCR; snprintf(temp_pids_language[temp_num_pids],4,"%s","---"); temp_num_pids++; } else { channel->pids[channel->num_pids]=pcr_pid; channel->pids_type[channel->num_pids]=PID_PCR; snprintf(channel->pids_language[channel->num_pids],4,"%s","---"); channel->num_pids++; } log_message( log_module, MSG_DEBUG, "Added PCR pid %d\n",pcr_pid); } /************************** * PCR PID - END **************************/ //We store the PMT version useful to check for updates channel->pmt_version=header->version_number; /************************** * Channel update **************************/ //If it's a channel update we will have to update the filters if(channel_update) { log_message( log_module, MSG_DEBUG,"Channel update new number of pids %d old %d we check for changes\n", temp_num_pids, channel->num_pids); //We search for added pids for(i=0;inum_pids;j++) { if(channel->pids[j]==temp_pids[i]) found=1; } if(!found) { log_message( log_module, MSG_DETAIL, "Update : pid %d added \n",temp_pids[i]); //If the pid is not on the list we add it for the filters if(asked_pid[temp_pids[i]]==PID_NOT_ASKED) asked_pid[temp_pids[i]]=PID_ASKED; number_chan_asked_pid[temp_pids[i]]++; channel->pids[channel->num_pids]=temp_pids[i]; channel->pids_type[channel->num_pids]=temp_pids_type[i]; snprintf(channel->pids_language[channel->num_pids],4,"%s",temp_pids_language[i]); channel->num_pids++; log_message( log_module, MSG_DETAIL,"Add the new filters\n"); // we open the file descriptors if (create_card_fd (card_base_path, tuner, asked_pid, fds) < 0) { log_message( log_module, MSG_ERROR,"CANNOT open the new descriptors. Some channels will probably not work\n"); //return; //FIXME : what do we do here ? } //open the new filters set_filters(asked_pid, fds); } } //We search for suppressed pids for(i=0;inum_pids;i++) { found=0; for(j=0;jpids[i]==temp_pids[j]) found=1; } if(!found) { log_message( log_module, MSG_DETAIL, "Update : pid %d supressed \n",channel->pids[i]); //We check the number of channels on wich this pid is registered, if 0 it's strange we warn if((channel->pids[i]>MAX_MANDATORY_PID_NUMBER )&& (number_chan_asked_pid[channel->pids[i]])) { //We decrease the number of channels with this pid number_chan_asked_pid[channel->pids[i]]--; //If no channel need this pid anymore, we remove the filter (closing the file descriptor remove the filter associated) if(number_chan_asked_pid[channel->pids[i]]==0) { log_message( log_module, MSG_DEBUG, "Update : pid %d does not belong to any channel anymore, we close the filter \n",channel->pids[i]); close(fds->fd_demuxer[channel->pids[i]]); fds->fd_demuxer[channel->pids[i]]=0; asked_pid[channel->pids[i]]=PID_NOT_ASKED; } } else log_message( log_module, MSG_WARN, "Update : We tried to suppress pid %d in a strange way, please contact if you can reproduce\n",channel->pids[i]); //We remove the pid from this channel by swapping with the last one and decreasing the pid number channel->pids[i]=channel->pids[channel->num_pids-1]; channel->num_pids--; i--; //we wan to check the pid just moved so we force the loop to reaxamine pid i } } log_message( log_module, MSG_DETAIL, " pids : \n");/**@todo Generate a strind and call log_message after, in syslog it generates one line per pid : use the toolbox unicast*/ int curr_pid; for (curr_pid = 0; curr_pid < channel->num_pids; curr_pid++) log_message( log_module, MSG_DETAIL, " %d (%s) \n", channel->pids[curr_pid], pid_type_to_str(channel->pids_type[curr_pid])); } /** @todo : update generated conf file*/ /************************** * Channel update END **************************/ /************************* * Language template **************************/ found =0; int len=MAX_NAME_LEN; for(i=0;inum_pids && !found;i++) { if(channel->pids_language[i][0]!='-') { log_message( log_module, MSG_FLOOD, "Primary language for channel: %s",channel->pids_language[i]); mumu_string_replace(channel->name,&len,0,"%lang",channel->pids_language[i]); found=1; //we exit the loop } } //If we don't find a lang we replace by our "usual" --- if(!found) mumu_string_replace(channel->name,&len,0,"%lang",channel->pids_language[0]); /************************* * Language template END **************************/ log_message( log_module, MSG_DEBUG,"Number of pids after autoconf %d\n", channel->num_pids); return 0; } /** @brief Tells if the descriptor with tag in present in buf * * for more information see ITU-T Rec. H.222.0 | ISO/IEC 13818 * * @param tag the descriptor tag, cf EN 300 468 * @param buf the decriptors buffer (part of the PMT) * @param descriptors_loop_len the length of the descriptors * @param pos the position in the buffer */ int pmt_find_descriptor(uint8_t tag, unsigned char *buf, int descriptors_loop_len, int *pos) { if(pos!=NULL) { buf+=*pos; descriptors_loop_len -= *pos; } while (descriptors_loop_len > 0) { unsigned char descriptor_tag = buf[0]; unsigned char descriptor_len = buf[1] + 2; if (tag == descriptor_tag) return 1; if(pos!=NULL) *pos += descriptor_len; buf += descriptor_len; descriptors_loop_len -= descriptor_len; } return 0; } /** @brief Debugging function, Print the tags present in the descriptor * * for more information see ITU-T Rec. H.222.0 | ISO/IEC 13818 * @param buf the decriptors buffer (part of the PMT) * @param descriptors_loop_len the length of the descriptors */ void pmt_print_descriptor_tags(unsigned char *buf, int descriptors_loop_len) { while (descriptors_loop_len > 0) { unsigned char descriptor_tag = buf[0]; unsigned char descriptor_len = buf[1] + 2; log_message( log_module, MSG_DEBUG,"0x%02x - \n", descriptor_tag); buf += descriptor_len; descriptors_loop_len -= descriptor_len; } } /******************************************************************** * Autoconfiguration auto update ********************************************************************/ /** @brief, tell if the pmt have a newer version than the one recorded actually * In the PMT pid there is a field to say if the PMT was updated * This function check if it has changed * * @param channel the channel for which we have to check * @param buf : the received buffer * @param ts_header says if the packet contains a transport stream header */ int pmt_need_update(mumudvb_channel_t *channel, unsigned char *packet) { pmt_t *pmt; pmt=(pmt_t*)(packet); if(pmt == NULL) return 0; /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(pmt->current_next_indicator == 0) { return 0; } if(pmt->table_id==0x02) if(pmt->version_number!=channel->pmt_version) { log_message( log_module, MSG_DEBUG,"PMT version changed, channel %s . stored version : %d, new: %d.\n",channel->name,channel->pmt_version,pmt->version_number); return 1; } return 0; } /** @brief update the version using the dowloaded pmt*/ void update_pmt_version(mumudvb_channel_t *channel) { pmt_t *pmt=(pmt_t*)(channel->pmt_packet->data_full); if(channel->pmt_version!=pmt->version_number) log_message( log_module, MSG_INFO,"New PMT version for channel %s. Old : %d, new: %d\n",channel->name,channel->pmt_version,pmt->version_number); channel->pmt_version=pmt->version_number; } /** @brief This function is called when a new PMT packet is there and we asked to check if there is updates*/ void autoconf_pmt_follow(unsigned char *ts_packet, fds_t *fds, mumudvb_channel_t *actual_channel, char *card_base_path, int tuner, mumudvb_chan_and_pids_t *chan_and_pids) { /*Note : the pmt version is initialised during autoconfiguration*/ /*Check the version stored in the channel*/ if(!actual_channel->pmt_needs_update) { //Checking without crc32, it there is a change we get the full packet for crc32 checking actual_channel->pmt_needs_update=pmt_need_update(actual_channel,get_ts_begin(ts_packet)); } /*We need to update the full packet, we get it*/ if(actual_channel->pmt_needs_update) { if(get_ts_packet(ts_packet,actual_channel->pmt_packet)) { if(pmt_need_update(actual_channel,actual_channel->pmt_packet->data_full)) { log_message( log_module, MSG_DETAIL,"PMT packet updated, we have now to check if there is new things\n"); /*We've got the FULL PMT packet*/ if(autoconf_read_pmt(actual_channel->pmt_packet, actual_channel, card_base_path, tuner, chan_and_pids->asked_pid, chan_and_pids->number_chan_asked_pid, fds)==0) { if(actual_channel->need_cam_ask==CAM_ASKED) actual_channel->need_cam_ask=CAM_NEED_UPDATE; //We we resend this packet to the CAM update_pmt_version(actual_channel); actual_channel->pmt_needs_update=0; } } else { log_message( log_module, MSG_DEBUG,"False alert, nothing to do\n"); actual_channel->pmt_needs_update=0; } } } } mumudvb-1.7.1/src/autoconf_sdt.c000066400000000000000000000343011177353207000166300ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * File for Autoconfiguration * * (C) 2008-2010 Brice DUBOST * * Parts of this code come from libdvb, modified for mumudvb * by Brice DUBOST * Libdvb part : Copyright (C) 2000 Klaus Schmidinger * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief This file contain the code related to the SDT reading for autoconfiguration * */ #include #include #include #include "errors.h" #include "mumudvb.h" #include "autoconf.h" #include "log.h" #ifdef HAVE_ICONV #include #endif extern int Interrupted; static char *log_module="Autoconf: "; void parse_sdt_descriptor(unsigned char *buf,int descriptors_loop_len, mumudvb_service_t *services); void parse_service_descriptor(unsigned char *buf, mumudvb_service_t *services); void autoconf_show_CA_identifier_descriptor(unsigned char *buf); void autoconf_show_country_avaibility_descriptor(unsigned char *buf); mumudvb_service_t *autoconf_find_service_for_add(mumudvb_service_t *services,int service_id); /** @brief The different encodings that can be used Cf EN 300 468 Annex A (I used v1.9.1) */ char *encodings_en300468[] ={ "ISO8859-1", "ISO8859-2", "ISO8859-3", "ISO8859-4", "ISO8859-5", "ISO8859-6", "ISO8859-7", "ISO8859-8", "ISO8859-9", "ISO8859-10", "ISO8859-11", "ISO8859-12", "ISO8859-13", "ISO8859-14", "ISO8859-15", "ISO-10646", //control char 0x11 "GB2312", //control char 0x13 "BIG5", //control char 0x14 "ISO-10646/UTF8", //control char 0x15 }; /** @brief Read the service description table (cf EN 300 468) * * This table is used to find the name of the services versus the service number * This function will fill the services chained list. * * @param buf the buffer containing the SDT * @param len the len of the buffer * @param services the chained list of services * @todo : give the parameters as read_pat */ int autoconf_read_sdt(unsigned char *buf,int len, mumudvb_service_t *services) { int delta; sdt_t *header; sdt_descr_t *descr_header; mumudvb_service_t *new_service=NULL; header=(sdt_t *)buf; //we map the packet over the header structure /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(header->current_next_indicator == 0) { log_message( log_module, MSG_FLOOD,"SDT not yet valid, we get a new one (current_next_indicator == 0)\n"); return 0; } //We look only for the following table //0x42 service_description_section - actual_transport_stream if(header->table_id==0x42) { log_message( log_module, MSG_DEBUG, "-- SDT : Service Description Table (id 0x%02x)--\n",header->table_id); log_message( log_module, MSG_FLOOD, "-- SDT: TSID %d Original network id %d version %d section number %d last section number %d --\n", HILO(header->transport_stream_id), HILO(header->original_network_id), header->version_number, header->section_number, header->last_section_number); //Loop over different services in the SDT delta=SDT_LEN; while((len-delta)>=(4+SDT_DESCR_LEN)) { descr_header=(sdt_descr_t *)(buf +delta ); //we search if we already have service id new_service=autoconf_find_service_for_add(services,HILO(descr_header->service_id)); if(new_service) { log_message( log_module, MSG_DEBUG, "We discovered a new service, service_id : 0x%x\n", HILO(descr_header->service_id)); //For information only switch(descr_header->running_status) { case 0: log_message( log_module, MSG_DEBUG, "\trunning_status : undefined\n"); break; case 1: log_message( log_module, MSG_DEBUG, "\trunning_status : not running\n"); break; case 2: log_message( log_module, MSG_DEBUG, "\trunning_status : starts in a few seconds\n"); break; case 3: log_message( log_module, MSG_DEBUG, "\trunning_status : pausing\n"); break; case 4: log_message( log_module, MSG_FLOOD, "\trunning_status : running\n"); break; //too usual to be printed as debug case 5: log_message( log_module, MSG_DEBUG, "\trunning_status : service off-air\n"); break; } //we store the data new_service->id=HILO(descr_header->service_id); new_service->running_status=descr_header->running_status; new_service->free_ca_mode=descr_header->free_ca_mode; log_message( log_module, MSG_DEBUG, "\tfree_ca_mode : 0x%x\n", descr_header->free_ca_mode); //We read the descriptor parse_sdt_descriptor(buf+delta+SDT_DESCR_LEN,HILO(descr_header->descriptors_loop_length),new_service); } delta+=HILO(descr_header->descriptors_loop_length)+SDT_DESCR_LEN; } } else log_message( log_module, MSG_FLOOD, "-- SDT : bad table id 0x%02x--\n",header->table_id); return 0; } /** @brief Parse the SDT descriptors * Loop over the sdt descriptors and call other parsing functions if necessary * @param buf the buffer containing the descriptors * @param descriptors_loop_len the len of buffer containing the descriptors * @param service the associated service */ void parse_sdt_descriptor(unsigned char *buf,int descriptors_loop_len, mumudvb_service_t *service) { while (descriptors_loop_len > 0) { unsigned char descriptor_tag = buf[0]; unsigned char descriptor_len = buf[1] + 2; if (!descriptor_len) { log_message( log_module, MSG_DEBUG, "--- SDT descriptor --- descriptor_tag == 0x%02x, len is 0\n", descriptor_tag); break; } //The service descriptor provides the names of the service provider and the service in text form together with the service_type. if(descriptor_tag==0x48) parse_service_descriptor(buf,service); else if( descriptor_tag==0x53) //53 : CA identifier descriptor. This descriptor contains the CA_systems_id (the scrambling algorithms) autoconf_show_CA_identifier_descriptor(buf); else if( descriptor_tag==0x49) //0x49 : Country availability descriptor. autoconf_show_country_avaibility_descriptor(buf); else /** @todo : Add descriptor 0x50 Component descriptor (multilingual 0x5E)*/ /** @todo : Add descriptor 0x5D multilingual_service_name_descriptor*/ log_message( log_module, MSG_FLOOD, "SDT descriptor_tag : 0x%2x, descriptor_len %d\n", descriptor_tag, descriptor_len); buf += descriptor_len; descriptors_loop_len -= descriptor_len; } } int convert_en399468_string(char *string, int max_len) { int encoding_control_char=8; //cf encodings_en300468 char *dest; char *tempdest, *tempbuf; unsigned char *src; /* remove control characters and convert to UTF-8 the channel name */ //If no channel encoding is specified, it seems that most of the broadcasters //uses ISO/IEC 8859-9. But the norm (EN 300 468) said that it should be Latin-1 (ISO/IEC 6937 + euro) //temporary buffers allocation tempdest=tempbuf=malloc(sizeof(char)*2*strlen(string)); if(tempdest==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } int len=0; for (src = (unsigned char *) string; *src; src++) { if (*src >= 0x20 && (*src < 0x80 || *src > 0x9f)) { //We copy non-control characters *tempdest++ = *src; len++; } else if(*src <= 0x20) { log_message( log_module, MSG_FLOOD, "Encoding number 0x%02x, see EN 300 468 Annex A",*src); //control character recognition based on EN 300 468 v1.9.1 Annex A if(*src<=0x0b){ encoding_control_char=(int) *src+4-1; } else if(*src==0x10) { //ISO/IEC 8859 : See table A.4 src++;//we skip the current byte src++;//This one is always set to 0 if(*src >= 0x01 && *src <=0x0f) encoding_control_char=(int) *src-1; } else if(*src==0x11)//ISO/IEC 10646 : Basic Multilingual Plane encoding_control_char=15; else if(*src==0x12)//KSX1001-2004 : Korean Character Set log_message( log_module, MSG_WARN, "\t\t Encoding KSX1001-2004 (korean character set) not implemented yet by iconv, we'll use the default encoding for service name\n"); else if(*src==0x13)//GB-2312-1980 : Simplified Chinese Character encoding_control_char=16; else if(*src==0x14)//Big5 subset of ISO/IEC 10646 : Traditional Chinese encoding_control_char=17; else if(*src==0x15)//UTF-8 encoding of ISO/IEC 10646 : Basic Multilingual Plane encoding_control_char=18; else log_message( log_module, MSG_WARN, "\t\t Encoding not implemented yet (0x%02x), we'll use the default encoding for service name\n",*src); } else if (*src >= 0x80 && *src <= 0x9f) { //to encode in UTF-8 we add 0xc2 before this control character //but wh have to put it after iconv, it's a bit boring just for bold //we drop them if(*src==0x86) log_message( log_module, MSG_DETAIL, "Control character \"Bold\", we drop",*src); else if(*src==0x87) log_message( log_module, MSG_DETAIL, "Control character \"UnBold\", we drop",*src); else if(*src==0x8a) log_message( log_module, MSG_DETAIL, "Control character \"CR/LF\", we drop",*src); else if(*src>=0x8b ) log_message( log_module, MSG_DETAIL, "Control character 0x%02x \"User defined\" at len %d. We drop",*src,len); else log_message( log_module, MSG_DEBUG, "\tUnimplemented name control_character : %x \n", *src); } } #ifdef HAVE_ICONV //Conversion to utf8 iconv_t cd; //we open the conversion table cd = iconv_open( "UTF8", encodings_en300468[encoding_control_char] ); size_t inSize, outSize=max_len; inSize=len; //pointers initialisation because iconv change them, we store dest=string; tempdest=tempbuf; //conversion iconv(cd, &tempdest, &inSize, &dest, &outSize ); *dest = '\0'; free(tempbuf); iconv_close( cd ); #else log_message( log_module, MSG_DETAIL, "Iconv not present, no name encoding conversion \n"); #endif log_message( log_module, MSG_FLOOD, "Converted name : \"%s\" (name encoding : %s)\n", string,encodings_en300468[encoding_control_char]); return encoding_control_char; } /** @brief Parse the service descriptor * It's used to get the channel name * @param buf the buffer containing the descriptor * @param service the associated service */ void parse_service_descriptor(unsigned char *buf, mumudvb_service_t *service) { /* Service descriptor : descriptor_tag 8 descriptor_length 8 service_type 8 service_provider_name_length 8 for (i=0;itype=*buf; //We show the service type display_service_type(*buf, MSG_DEBUG,log_module); buf ++; //we skip the service_type len = *buf; //provider name len //we jump the provider_name + the provider_name_len buf += len + 1; //Channel name len len = *buf; buf++; //we jump the channel_name_len char *name; char tempbuf[MAX_NAME_LEN]; if(service) name=service->name; else name=tempbuf; //We store the channel name with the raw encoding memcpy (name, buf, len); name[len] = '\0'; encoding_control_char=convert_en399468_string(name,MAX_NAME_LEN); if(encoding_control_char==-1) return; log_message( log_module, MSG_DEBUG, "service_name : \"%s\" (name encoding : %s)\n", name,encodings_en300468[encoding_control_char]); } /** @brief : show the contents of the CA identifier descriptor * * @param buf : the buffer containing the descriptor */ void autoconf_show_CA_identifier_descriptor(unsigned char *buf) { int length,i,ca_id; log_message( log_module, MSG_DETAIL, "--- SDT descriptor --- CA identifier descriptor\n"); log_message( log_module, MSG_DETAIL, "CA_system_ids : \n"); length=buf[1]; buf+=2; for(i=0;idescriptor_length-1; if(descr->country_availability_flag) log_message( log_module, MSG_DETAIL, "The reception is intended for the following countries : \n"); else log_message( log_module, MSG_DETAIL, "The reception is NOT intended for the following countries : \n"); for(i=0;i * * The latest version can be found at http://mumudvb.braice.net * * Code inspired by libdvben50221 examples from dvb apps * Copyright (C) 2004, 2005 Manu Abraham * Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #include /* DVB Card Drivers */ #include #include #include /**@file * @brief cam support * * Code for talking with conditionnal acces modules. This code uses the libdvben50221 from dvb-apps */ #include #include "errors.h" #include "cam.h" #include "ts.h" #include "mumudvb.h" #include "log.h" extern int Interrupted; static char *log_module="CAM: "; /***************************************************************************** * Code for dealing with cam using libdvben50221 *****************************************************************************/ static void *camthread_func(void* arg); //The polling thread static int mumudvb_cam_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t application_type, uint16_t application_manufacturer, uint16_t manufacturer_code, uint8_t menu_string_length, uint8_t *menu_string); //The application information callback static int mumudvb_cam_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids); static int mumudvb_cam_app_ca_pmt_reply_callback(void *arg, uint8_t slot_id, uint16_t session_number, struct en50221_app_pmt_reply *reply, uint32_t reply_size); static int mumudvb_cam_mmi_menu_callback(void *arg, uint8_t slot_id, uint16_t session_number, struct en50221_app_mmi_text *title, struct en50221_app_mmi_text *sub_title, struct en50221_app_mmi_text *bottom, uint32_t item_count, struct en50221_app_mmi_text *items, uint32_t item_raw_length, uint8_t *items_raw); static int mumudvb_cam_mmi_list_callback(void *arg, uint8_t slot_id, uint16_t session_number, struct en50221_app_mmi_text *title, struct en50221_app_mmi_text *sub_title, struct en50221_app_mmi_text *bottom, uint32_t item_count, struct en50221_app_mmi_text *items, uint32_t item_raw_length, uint8_t *items_raw); static int mumudvb_cam_mmi_menu_list_callback(void *arg, uint8_t slot_id, uint16_t session_number, struct en50221_app_mmi_text *title, struct en50221_app_mmi_text *sub_title, struct en50221_app_mmi_text *bottom, uint32_t item_count, struct en50221_app_mmi_text *items, uint32_t item_raw_length, uint8_t *items_raw, int object_type); static int mumudvb_cam_mmi_close_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t cmd_id, uint8_t delay); static int mumudvb_cam_mmi_display_control_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t cmd_id, uint8_t mmi_mode); static int mumudvb_cam_mmi_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t blind_answer, uint8_t expected_answer_length, uint8_t *text, uint32_t text_size); static char *cam_status[] ={ "EN50221_STDCAM_CAM_NONE", "EN50221_STDCAM_CAM_INRESET", "EN50221_STDCAM_CAM_OK", "EN50221_STDCAM_CAM_BAD" }; /** @brief Read a line of the configuration file to check if there is a cam parameter * * @param cam_vars the cam parameters * @param substring The currrent line */ int read_cam_configuration(cam_parameters_t *cam_vars, mumudvb_channel_t *current_channel, int ip_ok, char *substring) { char delimiteurs[] = CONFIG_FILE_SEPARATOR; if (!strcmp (substring, "cam_support")) { substring = strtok (NULL, delimiteurs); cam_vars->cam_support = atoi (substring); if(cam_vars->cam_support) { log_message( log_module, MSG_WARN, "You have enabled the support for conditionnal acces modules (scrambled channels). Please report any bug/comment\n"); } } else if (!strcmp (substring, "cam_reask_interval")) { substring = strtok (NULL, delimiteurs); cam_vars->cam_reask_interval = atoi (substring); } else if (!strcmp (substring, "cam_reset_interval")) { substring = strtok (NULL, delimiteurs); cam_vars->reset_interval = atoi (substring); cam_vars->timeout_no_cam_init = cam_vars->reset_interval; } else if (!strcmp (substring, "cam_number")) { substring = strtok (NULL, delimiteurs); cam_vars->cam_number = atoi (substring); } else if (!strcmp (substring, "cam_delay_pmt_send")) { substring = strtok (NULL, delimiteurs); cam_vars->cam_delay_pmt_send = atoi (substring); } else if (!strcmp (substring, "cam_interval_pmt_send")) { substring = strtok (NULL, delimiteurs); cam_vars->cam_interval_pmt_send = atoi (substring); } else if (!strcmp (substring, "cam_pmt_follow")) { substring = strtok (NULL, delimiteurs); cam_vars->cam_pmt_follow = atoi (substring); } else if (!strcmp (substring, "cam_pmt_pid")) { if ( ip_ok == 0) { log_message( log_module, MSG_ERROR, "cam_pmt_pid : You have to start a channel first (using ip= or channel_next)\n"); return -1; } substring = strtok (NULL, delimiteurs); current_channel->pmt_pid = atoi (substring); if (current_channel->pmt_pid < 10 || current_channel->pmt_pid > 8191){ log_message( log_module, MSG_ERROR, "Config issue in pids, given pid : %d\n", current_channel->pmt_pid); return -1; } current_channel->need_cam_ask=CAM_NEED_ASK; } else return 0; //Nothing concerning cam, we return 0 to explore the other possibilities return 1;//We found something for cam, we tell main to go for the next line } struct en50221_stdcam_llci { struct en50221_stdcam stdcam; int cafd; int slotnum; int state; }; /** @brief Reset the CAM */ void cam_reset_cam(cam_parameters_t *cam_params) { log_message( log_module, MSG_DEBUG,"CAM Reset\n"); struct en50221_stdcam *stdcam=cam_params->stdcam; struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) stdcam; ioctl(llci->cafd, CA_RESET, (1 << llci->slotnum)); //This variable only exist for low level CAMs so we check the type if(cam_params->cam_type==DVBCA_INTERFACE_LINK) llci->state = EN50221_STDCAM_CAM_NONE; } /** @brief Get the CAM state */ int cam_debug_dvbca_get_cam_state(cam_parameters_t *cam_params) { struct en50221_stdcam *stdcam=cam_params->stdcam; struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) stdcam; ca_slot_info_t info; info.num = llci->slotnum; if (ioctl(llci->cafd, CA_GET_SLOT_INFO, &info)) return -1; if (info.flags == 0) return DVBCA_CAMSTATE_MISSING; if (info.flags & CA_CI_MODULE_READY) return DVBCA_CAMSTATE_READY; if (info.flags & CA_CI_MODULE_PRESENT) return DVBCA_CAMSTATE_INITIALISING; return -1; } /** @brief Get the CAM interface type */ int cam_debug_dvbca_get_interface_type(cam_parameters_t *cam_params) { struct en50221_stdcam *stdcam=cam_params->stdcam; struct en50221_stdcam_llci *llci = (struct en50221_stdcam_llci *) stdcam; ca_slot_info_t info; info.num = llci->slotnum; if (ioctl(llci->cafd, CA_GET_SLOT_INFO, &info)) return -1; if (info.type & CA_CI_LINK) return DVBCA_INTERFACE_LINK; if (info.type & CA_CI) return DVBCA_INTERFACE_HLCI; return -1; } /** @brief start the cam * This function will create the communication layers and set the callbacks*/ int cam_start(cam_parameters_t *cam_params, int adapter_id) { // CAM Log log_message( log_module, MSG_DEBUG,"CAM Initialization\n"); log_message( log_module, MSG_DEBUG,"CONF cam_reask_interval=%d\n",cam_params->cam_reask_interval); log_message( log_module, MSG_DEBUG,"CONF cam_reset_interval=%d\n",cam_params->reset_interval); log_message( log_module, MSG_DEBUG,"CONF cam_number=%d\n",cam_params->cam_number); log_message( log_module, MSG_DEBUG,"CONF cam_delay_pmt_send=%d\n",cam_params->cam_delay_pmt_send); log_message( log_module, MSG_DEBUG,"CONF cam_interval_pmt_send=%d\n",cam_params->cam_interval_pmt_send); // create transport layer - 1 Slot and 16 sessions maximum cam_params->tl = en50221_tl_create(1, 16); if (cam_params->tl == NULL) { log_message( log_module, MSG_ERROR,"Failed to create transport layer\n"); return 1; } // create session layer cam_params->sl = en50221_sl_create(cam_params->tl, SL_MAX_SESSIONS); if (cam_params->sl == NULL) { log_message( log_module, MSG_ERROR, "Failed to create session layer\n"); en50221_tl_destroy(cam_params->tl); return 1; } // create the stdcam instance cam_params->stdcam = en50221_stdcam_create(adapter_id, cam_params->cam_number, cam_params->tl, cam_params->sl); if (cam_params->stdcam == NULL) { log_message( log_module, MSG_ERROR, "Failed to create the stdcam instance (no cam present ?)\n"); en50221_sl_destroy(cam_params->sl); en50221_tl_destroy(cam_params->tl); return 1; } // hook up the AI callbacks if (cam_params->stdcam->ai_resource) { en50221_app_ai_register_callback(cam_params->stdcam->ai_resource, mumudvb_cam_ai_callback, cam_params); } else { log_message( log_module, MSG_WARN, "No Application Information resource\n"); } // hook up the CA callbacks if (cam_params->stdcam->ca_resource) { en50221_app_ca_register_info_callback(cam_params->stdcam->ca_resource, mumudvb_cam_ca_info_callback, cam_params); en50221_app_ca_register_pmt_reply_callback(cam_params->stdcam->ca_resource, mumudvb_cam_app_ca_pmt_reply_callback, cam_params); } else { log_message( log_module, MSG_WARN, "No CA resource\n"); } // hook up the MMI callbacks if (cam_params->stdcam->mmi_resource) { en50221_app_mmi_register_close_callback(cam_params->stdcam->mmi_resource, mumudvb_cam_mmi_close_callback, cam_params); en50221_app_mmi_register_display_control_callback(cam_params->stdcam->mmi_resource, mumudvb_cam_mmi_display_control_callback, cam_params); en50221_app_mmi_register_enq_callback(cam_params->stdcam->mmi_resource, mumudvb_cam_mmi_enq_callback, cam_params); en50221_app_mmi_register_menu_callback(cam_params->stdcam->mmi_resource, mumudvb_cam_mmi_menu_callback, cam_params); en50221_app_mmi_register_list_callback(cam_params->stdcam->mmi_resource, mumudvb_cam_mmi_list_callback, cam_params); } else { log_message( log_module, MSG_WARN, "CAM Menus are not supported by this interface hardware\n"); } // any other stuff cam_params->moveca = 1; //see http://www.linuxtv.org/pipermail/linux-dvb/2007-May/018198.html cam_params->cam_type = cam_debug_dvbca_get_interface_type(cam_params); //The reset procedure have only been tested on LLCI cams switch(cam_params->cam_type) { case DVBCA_INTERFACE_LINK: log_message( log_module, MSG_DETAIL, "CAM type : low level interface\n"); break; case DVBCA_INTERFACE_HLCI: log_message( log_module, MSG_DETAIL, "CAM type : HIGH level interface\n"); break; } // start the cam thread pthread_create(&(cam_params->camthread), NULL, camthread_func, cam_params); return 0; } /** @brief Stops the CAM*/ void cam_stop(cam_parameters_t *cam_params) { log_message( log_module, MSG_DEBUG, "CAM Stopping\n"); if (cam_params->stdcam == NULL) return; // shutdown the cam thread cam_params->camthread_shutdown = 1; pthread_join(cam_params->camthread, NULL); // destroy the stdcam if (cam_params->stdcam->destroy) cam_params->stdcam->destroy(cam_params->stdcam, 1); // destroy session layer en50221_sl_destroy(cam_params->sl); // destroy transport layer en50221_tl_destroy(cam_params->tl); } /** @brief The thread for polling the cam */ static void *camthread_func(void* arg) { cam_parameters_t *cam_params; cam_params= (cam_parameters_t *) arg; int i; int camstate; struct timeval tv; long real_start_time; long now; long last_channel_check; extern mumudvb_chan_and_pids_t chan_and_pids; /** @todo ugly way to access channel data */ //We record the starting time gettimeofday (&tv, (struct timezone *) NULL); real_start_time = tv.tv_sec; now = 0; last_channel_check=0; log_message( log_module, MSG_DEBUG,"CAM Thread started\n"); // Variables for detecting changes of status and error int status_old=0; int status_new=0; int error_old=0; int error_new=0; //Loop while(!cam_params->camthread_shutdown) { usleep(100*1000); //some waiting - 100ms (see specs) gettimeofday (&tv, (struct timezone *) NULL); now = tv.tv_sec - real_start_time; //If the CAM is initialised (ie we received the CA_info) we check if the "safety" delay is over //This behavior is made for some "cray" CAMs like powercam v4 which doesn't accept the PMT just after the ca_info_callback if(cam_params->ca_info_ok_time && cam_params->ca_resource_connected==0) if((tv.tv_sec - cam_params->ca_info_ok_time) > cam_params->cam_delay_pmt_send) cam_params->ca_resource_connected=1; /* Check for fully scrambled channels for a while, to re ask the CAM */ if(cam_params->ca_resource_connected && (cam_params->cam_reask_interval>0)) { //We don't check too often for the reasking of the highly scrambled channels if((now-last_channel_check)>2) { last_channel_check=now; for (int curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { // Check if reasking (ie sending a CAM PMT UPDATE) is needed. IE channel hyghly/partially scrambled or down and asked a while ago if((chan_and_pids.channels[curr_channel].scrambled_channel == HIGHLY_SCRAMBLED || chan_and_pids.channels[curr_channel].scrambled_channel == PARTIALLY_UNSCRAMBLED || chan_and_pids.channels[curr_channel].streamed_channel == 0)&& (chan_and_pids.channels[curr_channel].need_cam_ask==CAM_ASKED)&& ((tv.tv_sec-chan_and_pids.channels[curr_channel].cam_asking_time)>cam_params->cam_reask_interval)) { chan_and_pids.channels[curr_channel].need_cam_ask=CAM_NEED_UPDATE; //No race condition because need_cam_ask is not changed when it is at the value CAM_ASKED log_message( log_module, MSG_DETAIL, "Channel \"%s\" highly scrambled for more than %ds. We ask the CAM to update.\n", chan_and_pids.channels[curr_channel].name,cam_params->cam_reask_interval); chan_and_pids.channels[curr_channel].cam_asking_time=tv.tv_sec; } } } } // Polling CAM and checking status change - List of possible status: (en50221_stdcam.h) // 0: EN50221_STDCAM_CAM_NONE // 1: EN50221_STDCAM_CAM_INRESET // 2: EN50221_STDCAM_CAM_OK // 3: EN50221_STDCAM_CAM_BAD status_new=cam_params->stdcam->poll(cam_params->stdcam); if (status_new!=status_old) { if(status_new>3) log_message( log_module, MSG_WARN, "The CAM changed to an unknown status : %d, please contact\n",status_new); else if (status_old >3) log_message( log_module, MSG_DEBUG, "Status change from UNKNOWN (%d) to %s.\n",status_old,cam_status[status_new]); else log_message( log_module, MSG_DEBUG, "Status change from %s to %s.\n",cam_status[status_old],cam_status[status_new]); status_old=status_new; } // Try to get the Transport Layer structure from libdvben50221 if (cam_params->tl!=NULL) { // Get the last error code error_new=en50221_tl_get_error(cam_params->tl); } // Check if error code has changed - List of error codes: (en50221_errno.h) if (error_new!=error_old) { log_message( log_module, MSG_WARN, "Transport Layer Error change from %s (%s) to %s (%s)\n", liben50221_error_to_str(error_old),liben50221_error_to_str_descr(error_old), liben50221_error_to_str(error_new),liben50221_error_to_str_descr(error_new)); error_old=error_new; if(cam_params->ca_resource_connected) { // This is probably a CAM crash, as after initialization, a Transport Layer error isn't good... log_message( log_module, MSG_ERROR,"Transport Layer error after CAM initialization: CAM may have crash, it's better to exit and restart...\n"); Interrupted= ERROR_CAM<<8; //the <<8 is to make difference beetween signals and errors } } //check if we need reset if ( cam_params->ca_info_ok_time==0 && cam_params->timeout_no_cam_init>0 && now>cam_params->timeout_no_cam_init && cam_params->reset_interval>0) { if(cam_params->cam_type==DVBCA_INTERFACE_LINK) { if(cam_params->need_reset==0 && cam_params->reset_countsmax_reset_number) { log_message( log_module, MSG_INFO, "No CAM initialization in %ds, WE FORCE A RESET. try %d on %d.\n", cam_params->timeout_no_cam_init, cam_params->reset_counts+1, cam_params->max_reset_number); cam_params->need_reset=1; cam_params->timeout_no_cam_init=now+cam_params->reset_interval; } else if (cam_params->reset_counts>=cam_params->max_reset_number) { log_message( log_module, MSG_INFO, "No CAM initialization in %ds, the %d resets didn't worked. Exiting.\n", cam_params->timeout_no_cam_init,cam_params->max_reset_number); Interrupted= ERROR_NO_CAM_INIT<<8; //the <<8 is to make difference beetween signals and errors } } else { log_message( log_module, MSG_INFO, "No CAM initialization on in %ds and HLCI CAM, exiting.\n", cam_params->timeout_no_cam_init); Interrupted= ERROR_NO_CAM_INIT<<8; //the <<8 is to make difference beetween signals and errors } } //We do the reset if needed if(cam_params->need_reset==1) { cam_reset_cam(cam_params); i=0; log_message( log_module, MSG_DEBUG, "We wait for the cam to be INITIALISING\n"); do { camstate=cam_debug_dvbca_get_cam_state(cam_params); switch(camstate) { case DVBCA_CAMSTATE_MISSING: log_message( log_module, MSG_DEBUG, "cam state : DVBCA_CAMSTATE_MISSING\n"); break; case DVBCA_CAMSTATE_READY: log_message( log_module, MSG_DEBUG, "cam state : DVBCA_CAMSTATE_READY\n"); break; case DVBCA_CAMSTATE_INITIALISING: log_message( log_module, MSG_DEBUG, "cam state : DVBCA_CAMSTATE_INITIALISING\n"); break; case -1: log_message( log_module, MSG_DEBUG, "cam state : Eroor during the query\n"); break; } usleep(10000); i++; } while(camstate!=DVBCA_CAMSTATE_INITIALISING && i < MAX_WAIT_AFTER_RESET); if(i==MAX_WAIT_AFTER_RESET) log_message( log_module, MSG_INFO, "The CAM isn't in a good state after reset, it will probably don't work :(\n"); else log_message( log_module, MSG_DEBUG, "state correct after reset\n"); cam_params->need_reset=0; cam_params->reset_counts++; } } // As we can't get the state of the session, // we try to close all of them with some polling to force communication log_message( log_module, MSG_DEBUG,"Closing the CAM sessions\n"); for (i=0;isl,i); usleep(50*1000); cam_params->stdcam->poll(cam_params->stdcam); usleep(50*1000); cam_params->stdcam->poll(cam_params->stdcam); } log_message( log_module, MSG_DEBUG,"CAM Thread stopped\n"); return 0; } /** @brief PMT sending to the cam * This function if called when mumudvb receive a new PMT pid. * This function will ask the cam to decrypt the associated channel */ int mumudvb_cam_new_pmt(cam_parameters_t *cam_params, mumudvb_ts_packet_t *cam_pmt_ptr, int need_cam_ask) { uint8_t capmt[MAX_TS_SIZE]; int size,list_managment; // parse section struct section *section = section_codec(cam_pmt_ptr->data_full,cam_pmt_ptr->len_full); if (section == NULL) { log_message( log_module, MSG_WARN,"section_codec parsing error\n"); return -1; } // parse section_ext struct section_ext *section_ext = section_ext_decode(section, 0); if (section_ext == NULL) { log_message( log_module, MSG_WARN,"section_ext parsing error\n"); return -1; } // parse PMT struct mpeg_pmt_section *pmt = mpeg_pmt_section_codec(section_ext); if (pmt == NULL) { log_message( log_module, MSG_WARN,"mpeg_pmt_section_codec parsing error\n"); return -1; } if(pmt->head.table_id!=0x02) { log_message( log_module, MSG_WARN,"Packet PID %d is not a PMT PID\n", cam_pmt_ptr->pid); return -1; } if (cam_params->stdcam == NULL) return -1; if (cam_params->ca_resource_connected) { log_message( log_module, MSG_INFO, "Received new PMT - sending to CAM...\n"); // translate it into a CA PMT // Concerning the list managment the simplest (since we don't want to remove channels is to do a CA_LIST_MANAGEMENT_ADD //Always. Doing FIRST, MORE ,MORE ... LAST is more complicated because the CAM will wait for the LAST // If the an update is needed the Aston cams will be happy with a ADD (it detects that the channel is already present and updates //It seems that the power cam don't really follow the norm (ie accept almost everything) // Doing also only update should work //an update should be equivalent to an add when the channel is not present //Note : The powercam HD V3.1 doesn't add channels with update, so we only do updates when the channel was added if(need_cam_ask==CAM_NEED_UPDATE) list_managment=CA_LIST_MANAGEMENT_UPDATE; else list_managment=CA_LIST_MANAGEMENT_ADD; if ((size = en50221_ca_format_pmt(pmt, capmt, sizeof(capmt), cam_params->moveca, list_managment, CA_PMT_CMD_ID_OK_DESCRAMBLING)) < 0) { /*CA_PMT_CMD_ID_QUERY)) < 0) { We don't do query, the query is never working very well. This is because the CAM cannot ask the card if you have the rights for the channel. So this answer is often not reliable. Much thanks to Aston www.aston-france.com for the explanation */ log_message( log_module, MSG_WARN, "Failed to format PMT\n"); return -1; } // set it if (en50221_app_ca_pmt(cam_params->stdcam->ca_resource, cam_params->stdcam->ca_session_number, capmt, size)) { log_message( log_module, MSG_WARN, "Failed to send PMT\n"); return -1; } // we've seen this PMT return 1; } return 0; } static int mumudvb_cam_ai_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t application_type, uint16_t application_manufacturer, uint16_t manufacturer_code, uint8_t menu_string_length, uint8_t *menu_string) { cam_parameters_t *cam_params; cam_params= (cam_parameters_t *) arg; (void) slot_id; (void) session_number; // Write information to log log_message( log_module, MSG_DEBUG, "CAM Application_Info_Callback\n"); log_message( log_module, MSG_INFO, "CAM Application type: %02x\n", application_type); log_message( log_module, MSG_INFO, "CAM Application manufacturer: %04x\n", application_manufacturer); log_message( log_module, MSG_INFO, "CAM Manufacturer code: %04x\n", manufacturer_code); log_message( log_module, MSG_INFO, "CAM Menu string: %.*s\n", menu_string_length, menu_string); // Store the CAM menu string for easy identification mumu_free_string(&cam_params->cam_menu_string); mumu_string_append(&cam_params->cam_menu_string, "%.*s", menu_string_length, menu_string); // Try to append the information to the cam_info log file FILE *file_cam_info; file_cam_info = fopen (cam_params->filename_cam_info, "a"); if (file_cam_info == NULL) { log_message( log_module, MSG_WARN, "%s: %s\n", cam_params->filename_cam_info, strerror (errno)); } else { fprintf (file_cam_info,"CAM_Application_Type=%02x\n",application_type); fprintf (file_cam_info,"CAM_Application_Manufacturer=%04x\n",application_manufacturer); fprintf (file_cam_info,"CAM_Manufacturer_Code=%04x\n",manufacturer_code); fprintf (file_cam_info,"CAM_Menu_String=%.*s\n",menu_string_length, menu_string); fclose (file_cam_info); } return 0; } static int mumudvb_cam_ca_info_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids) { cam_parameters_t *cam_params; cam_params= (cam_parameters_t *) arg; (void) slot_id; (void) session_number; struct timeval tv; // Write information to log log_message( log_module, MSG_DEBUG,"CA_Info_Callback: %d CA systems supported\n",ca_id_count); log_message( log_module, MSG_DETAIL, "CAM supports the following ca system ids:\n"); uint32_t i; for(i=0; i< ca_id_count; i++) { log_message( log_module, MSG_DETAIL,"Ca system id 0x%04x : %s\n",ca_ids[i], ca_sys_id_to_str(ca_ids[i])); //we display it with the description } // Try to append the information to the cam_info log file FILE *file_cam_info; file_cam_info = fopen (cam_params->filename_cam_info, "a"); if (file_cam_info == NULL) { log_message( log_module, MSG_WARN, "%s: %s\n", cam_params->filename_cam_info, strerror (errno)); } else { for(i=0; i< ca_id_count; i++) fprintf (file_cam_info,"ID_CA_Supported=%04x\n",ca_ids[i]); fclose (file_cam_info); } gettimeofday (&tv, (struct timezone *) NULL); cam_params->ca_info_ok_time=tv.tv_sec; return 0; } static int mumudvb_cam_app_ca_pmt_reply_callback(void *arg, uint8_t slot_id, uint16_t session_number, struct en50221_app_pmt_reply *reply, uint32_t reply_size) { struct en50221_app_pmt_stream *pos; (void) arg; (void) slot_id; (void) session_number; log_message( log_module, MSG_INFO, "CAM PMT reply\n"); log_message( log_module, MSG_INFO, " Program number %d\n",reply->program_number); switch(reply->CA_enable) { case CA_ENABLE_DESCRAMBLING_POSSIBLE: log_message( log_module, MSG_INFO," Descrambling possible\n"); break; case CA_ENABLE_DESCRAMBLING_POSSIBLE_PURCHASE: log_message( log_module, MSG_INFO," Descrambling possible under conditions (purchase dialogue)\n"); break; case CA_ENABLE_DESCRAMBLING_POSSIBLE_TECHNICAL: log_message( log_module, MSG_INFO," Descrambling possible under conditions (technical dialogue)\n"); break; case CA_ENABLE_DESCRAMBLING_NOT_POSSIBLE_NO_ENTITLEMENT: log_message( log_module, MSG_INFO," Descrambling not possible (because no entitlement)\n"); break; case CA_ENABLE_DESCRAMBLING_NOT_POSSIBLE_TECHNICAL: log_message( log_module, MSG_INFO," Descrambling not possible (for technical reasons)\n"); break; default: log_message( log_module, MSG_INFO," RFU\n"); } en50221_app_pmt_reply_streams_for_each(reply, pos, reply_size) { log_message( log_module, MSG_INFO, " ES pid %d\n",pos->es_pid); switch(pos->CA_enable) { case CA_ENABLE_DESCRAMBLING_POSSIBLE: log_message( log_module, MSG_INFO," Descrambling possible\n"); break; case CA_ENABLE_DESCRAMBLING_POSSIBLE_PURCHASE: log_message( log_module, MSG_INFO," Descrambling possible under conditions (purchase dialogue)\n"); break; case CA_ENABLE_DESCRAMBLING_POSSIBLE_TECHNICAL: log_message( log_module, MSG_INFO," Descrambling possible under conditions (technical dialogue)\n"); break; case CA_ENABLE_DESCRAMBLING_NOT_POSSIBLE_NO_ENTITLEMENT: log_message( log_module, MSG_INFO," Descrambling not possible (because no entitlement)\n"); break; case CA_ENABLE_DESCRAMBLING_NOT_POSSIBLE_TECHNICAL: log_message( log_module, MSG_INFO," Descrambling not possible (for technical reasons)\n"); break; default: log_message( log_module, MSG_INFO," RFU\n"); } } return 0; } /******************************* * MMI *******************************/ // List object - DISPLAY_TYPE_LIST static int mumudvb_cam_mmi_list_callback(void *arg, uint8_t slot_id, uint16_t session_number, struct en50221_app_mmi_text *title, struct en50221_app_mmi_text *sub_title, struct en50221_app_mmi_text *bottom, uint32_t item_count, struct en50221_app_mmi_text *items, uint32_t item_raw_length, uint8_t *items_raw) { return(mumudvb_cam_mmi_menu_list_callback(arg, slot_id, session_number, title, sub_title, bottom, item_count, items, item_raw_length, items_raw, DISPLAY_TYPE_LIST)); } // Menu object - DISPLAY_TYPE_MENU static int mumudvb_cam_mmi_menu_callback(void *arg, uint8_t slot_id, uint16_t session_number, struct en50221_app_mmi_text *title, struct en50221_app_mmi_text *sub_title, struct en50221_app_mmi_text *bottom, uint32_t item_count, struct en50221_app_mmi_text *items, uint32_t item_raw_length, uint8_t *items_raw) { return(mumudvb_cam_mmi_menu_list_callback(arg, slot_id, session_number, title, sub_title, bottom, item_count, items, item_raw_length, items_raw, DISPLAY_TYPE_MENU)); } // Menu or List objects static int mumudvb_cam_mmi_menu_list_callback(void *arg, uint8_t slot_id, uint16_t session_number, struct en50221_app_mmi_text *title, struct en50221_app_mmi_text *sub_title, struct en50221_app_mmi_text *bottom, uint32_t item_count, struct en50221_app_mmi_text *items, uint32_t item_raw_length, uint8_t *items_raw, int object_type) { cam_parameters_t *cam_params; cam_params= (cam_parameters_t *) arg; (void) slot_id; // (void) session_number; (void) item_raw_length; (void) items_raw; // New CAM menu received, we prepared its storage for future display mumu_free_string(&cam_params->cam_menulist_str); // We save the date/time when the menu was received time_t rawtime; time (&rawtime); // Add line to CAM menu storage - Date and Time mumu_string_append(&cam_params->cam_menulist_str,"\t\n",ctime(&rawtime)); // Add line to CAM menu storage - CAM Menu String (model) mumu_string_append(&cam_params->cam_menulist_str,"\t\n",cam_params->cam_menu_string.string); // Add line to CAM menu storage - CAM Object type : LIST or MENU if (object_type==DISPLAY_TYPE_LIST) mumu_string_append(&cam_params->cam_menulist_str,"\t\n"); if (object_type==DISPLAY_TYPE_MENU) mumu_string_append(&cam_params->cam_menulist_str,"\t\n"); // Showing beginning of CAM menu if (object_type==DISPLAY_TYPE_LIST) log_message( log_module, MSG_INFO, "------------------ NEW CAM LIST ------------------\n"); if (object_type==DISPLAY_TYPE_MENU) log_message( log_module, MSG_INFO, "------------------ NEW CAM MENU ------------------\n"); // Title if (title->text_length) { log_message( log_module, MSG_INFO, "Menu_Title : %.*s\n", title->text_length, title->text); // Add line to CAM menu storage - Title mumu_string_append(&cam_params->cam_menulist_str,"\t<![CDATA[%.*s]]>\n", title->text_length, title->text); } // Subtitle if (sub_title->text_length) { log_message( log_module, MSG_INFO, "Menu_Subtitle : %.*s\n", sub_title->text_length, sub_title->text); // Add line to CAM menu storage - Subtitle mumu_string_append(&cam_params->cam_menulist_str,"\t\n", sub_title->text_length, sub_title->text); } // Choice 0 is always for cancel/return/ok action in MENU and LIST log_message( log_module, MSG_INFO, "Menu_Item 0 : Return\n"); // Add line to CAM menu storage - Items mumu_string_append(&cam_params->cam_menulist_str,"\t\n"); // Items uint32_t i; for(i=0; i< item_count; i++) { log_message( log_module, MSG_INFO, "Menu_Item %d : %.*s\n", (i+1), items[i].text_length, items[i].text); // Add line to CAM menu storage - Items mumu_string_append(&cam_params->cam_menulist_str,"\t\n", (i+1), items[i].text_length, items[i].text); } // Bottom if (bottom->text_length) { log_message( log_module, MSG_INFO, "Menu_Bottom : %.*s\n", bottom->text_length, bottom->text); // Add line to CAM menu storage - Bottom mumu_string_append(&cam_params->cam_menulist_str,"\t\n", bottom->text_length, bottom->text); } // Showing end of CAM menu log_message( log_module, MSG_INFO, "--------------------------------------------------\n"); fflush(stdout); cam_params->stdcam->mmi_session_number=session_number; //We leave (action=0 => CANCEL) if autoresponse is active (default=yes if no menu asked) if (cam_params->cam_mmi_autoresponse==1) { // Autoresponse log_message( log_module, MSG_INFO, "Menu autoresponse, send CANCEL\n"); en50221_app_mmi_menu_answ(cam_params->stdcam->mmi_resource, cam_params->stdcam->mmi_session_number, 0); cam_params->mmi_state = MMI_STATE_OPEN; } else // We wait an answer from the user cam_params->mmi_state = MMI_STATE_MENU; return 0; } static int mumudvb_cam_mmi_close_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t cmd_id, uint8_t delay) { cam_parameters_t *cam_params; cam_params= (cam_parameters_t *) arg; (void) slot_id; (void) cmd_id; (void) delay; // The CAM told us that the menu was closed log_message( log_module, MSG_INFO, "Closing CAM Menu\n"); // Remove last stored menu content mumu_free_string(&cam_params->cam_menulist_str); // Indicate that the menu was closed (for our own record) cam_params->mmi_state = MMI_STATE_CLOSED; // Close the session with the CAM or a new session MMI will not be allowed en50221_sl_destroy_session(cam_params->sl,session_number); return 0; } static int mumudvb_cam_mmi_display_control_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t cmd_id, uint8_t mmi_mode) { struct en50221_app_mmi_display_reply_details reply; cam_parameters_t *cam_params; cam_params= (cam_parameters_t *) arg; (void) slot_id; // don't support any commands but set mode if (cmd_id != MMI_DISPLAY_CONTROL_CMD_ID_SET_MMI_MODE) { en50221_app_mmi_display_reply(cam_params->stdcam->mmi_resource, session_number, MMI_DISPLAY_REPLY_ID_UNKNOWN_CMD_ID, &reply); return 0; } // we only support high level mode if (mmi_mode != MMI_MODE_HIGH_LEVEL) { en50221_app_mmi_display_reply(cam_params->stdcam->mmi_resource, session_number, MMI_DISPLAY_REPLY_ID_UNKNOWN_MMI_MODE, &reply); return 0; } // ack the high level open reply.u.mode_ack.mmi_mode = mmi_mode; en50221_app_mmi_display_reply(cam_params->stdcam->mmi_resource, session_number, MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK, &reply); cam_params->mmi_state = MMI_STATE_OPEN; return 0; } static int mumudvb_cam_mmi_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint8_t blind_answer, uint8_t expected_answer_length, uint8_t *text, uint32_t text_size) { cam_parameters_t *cam_params; cam_params= (cam_parameters_t *) arg; (void) slot_id; (void) session_number; // Show the enquiry informations log_message( log_module, MSG_INFO, "----------------- NEW CAM ENQUIRY-----------------\n"); log_message( log_module, MSG_INFO, "Question: %.*s\n", text_size, text); log_message( log_module, MSG_INFO, "Expected answer length: %d\n", expected_answer_length); log_message( log_module, MSG_INFO, "--------------------------------------------------\n"); // New CAM enquiry received, we prepared its storage for future display mumu_free_string(&cam_params->cam_menulist_str); // We save the date/time when the enquiry was received time_t rawtime; time(&rawtime); // Add line to CAM enquiry storage - Date and Time mumu_string_append(&cam_params->cam_menulist_str,"\t\n",ctime(&rawtime)); // Add line to CAM menu storage - CAM Menu String (model) mumu_string_append(&cam_params->cam_menulist_str,"\t\n",cam_params->cam_menu_string.string); // Add line to CAM menu storage - CAM Object type : ENQUIRY mumu_string_append(&cam_params->cam_menulist_str,"\t\n"); // We put the question in the "Title" field mumu_string_append(&cam_params->cam_menulist_str,"\t<![CDATA[%.*s]]>\n", text_size, text); // We put the answer length in the "Subtitle" field mumu_string_append(&cam_params->cam_menulist_str,"\t\n", expected_answer_length); // We don't care to hide or display the answer... cam_params->mmi_enq_blind = blind_answer; // The expected length of the answer (number of characters) cam_params->mmi_enq_length = expected_answer_length; // Limit the answer to MAX_ENQUIRY_ANSWER_LENGTH characters (enough for PIN code and changing maturity, for the most common usages) if (cam_params->mmi_enq_length>MAX_ENQUIRY_ANSWER_LENGTH) cam_params->mmi_enq_length=MAX_ENQUIRY_ANSWER_LENGTH; // The actual number of typed characters cam_params->mmi_enq_entered = 0; //We leave (CANCEL) if autoresponse is active (default=yes if no menu asked) if (cam_params->cam_mmi_autoresponse==1) { // Autoresponse log_message( log_module, MSG_INFO, "Enquiry autoresponse, send CANCEL\n"); en50221_app_mmi_answ(cam_params->stdcam->mmi_resource, cam_params->stdcam->mmi_session_number, MMI_ANSW_ID_CANCEL, NULL, 0); cam_params->mmi_state = MMI_STATE_OPEN; } else // We wait an answer from the user cam_params->mmi_state = MMI_STATE_ENQ; return 0; } /** @brief This function is called when a new PMT packet is there */ int cam_new_packet(int pid, int curr_channel, unsigned char *ts_packet, cam_parameters_t *cam_vars, mumudvb_channel_t *actual_channel) { int iRet; struct timeval tv; gettimeofday (&tv, (struct timezone *) NULL); if (((actual_channel->need_cam_ask==CAM_NEED_ASK)||(actual_channel->need_cam_ask==CAM_NEED_UPDATE))&& (actual_channel->pmt_pid == pid)) { if(get_ts_packet(ts_packet,actual_channel->cam_pmt_packet)) { //We check the transport stream id of the packet if(check_pmt_service_id(actual_channel->cam_pmt_packet, actual_channel)) { iRet=mumudvb_cam_new_pmt(cam_vars, actual_channel->cam_pmt_packet,actual_channel->need_cam_ask); if(iRet==1) { if(actual_channel->need_cam_ask==CAM_NEED_UPDATE) log_message( log_module, MSG_INFO,"CA PMT (UPDATED) sent for channel %d : \"%s\"\n", curr_channel, actual_channel->name ); else log_message( log_module, MSG_INFO,"CA PMT (ADDED) sent for channel %d : \"%s\"\n", curr_channel, actual_channel->name ); actual_channel->need_cam_ask=CAM_ASKED; //once we have asked the CAM for this PID, we don't have to ask anymore //For the feature of reasking we initalise the time actual_channel->cam_asking_time = tv.tv_sec; return 1; } else if(iRet==-1) { log_message( log_module, MSG_DETAIL,"Problem sending CA PMT for channel %d : \"%s\"\n", curr_channel, actual_channel->name ); } } //else //The service_id is bad, we will try to get another PMT packet } } return 0; } /************************************************************************************************************************************* This part of the code is a bit particular, it allows the PMT to be followed for non autoconfigurated channels *************************************************************************************************************************************/ //from autoconf_pmt.c void update_pmt_version(mumudvb_channel_t *channel); int pmt_need_update(mumudvb_channel_t *channel, unsigned char *packet); /** @brief This function is called when a new PMT packet is there and we asked to check if there is updates*/ void cam_pmt_follow(unsigned char *ts_packet, mumudvb_channel_t *actual_channel) { /*Note : the pmt version is initialised during autoconfiguration*/ /*Check the version stored in the channel*/ if(!actual_channel->pmt_needs_update) { //Checking without crc32, it there is a change we get the full packet for crc32 checking actual_channel->pmt_needs_update=pmt_need_update(actual_channel,get_ts_begin(ts_packet)); } /*We need to update the full packet, we download it*/ if(actual_channel->pmt_needs_update) { if(get_ts_packet(ts_packet,actual_channel->pmt_packet)) { if(pmt_need_update(actual_channel,actual_channel->pmt_packet->data_full)) { log_message( log_module, MSG_DETAIL,"PMT packet updated, we now ask the CAM to update it\n"); log_message( log_module, MSG_WARN,"The PMT version has changed but the PIDs are configured manually, use autoconfiguration if possible. If not, please tell me why so I can improve it\n"); /*We've got the FULL PMT packet*/ pmt_t *header; header=(pmt_t *)(actual_channel->pmt_packet->data_full); if(header->current_next_indicator == 0) { log_message( log_module, MSG_DEBUG,"The current_next_indicator is set to 0, this PMT is not valid for the current stream\n"); }else{ actual_channel->need_cam_ask=CAM_NEED_UPDATE; //We we resend this packet to the CAM update_pmt_version(actual_channel); actual_channel->pmt_needs_update=0; } } else { log_message( log_module, MSG_DEBUG,"False alert, nothing to do\n"); actual_channel->pmt_needs_update=0; } } } } mumudvb-1.7.1/src/cam.h000066400000000000000000000104621177353207000147070ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * File for Conditionnal Access Modules support * * (C) 2009-2011 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _CAM_H #define _CAM_H #include #include #include #include #include #include #include #include #include #include #include "ts.h" #include "mumudvb.h" #include "autoconf.h" /**@file * @brief cam support * * Header file for cam support, contains mainly the structure for carrying cam parameters */ #include struct ca_info { int initialized; //are the cai complete ? int ready; //We wait a pool between each channel sending int sys_num; uint16_t sys_id[256]; char app_name[256]; }; int cam_send_ca_pmt( mumudvb_ts_packet_t *pmt, struct ca_info *cai); int convert_desc(struct ca_info *cai, uint8_t *out, uint8_t *buf, int dslen, uint8_t cmd, int quiet); int convert_pmt(struct ca_info *cai, mumudvb_ts_packet_t *pmt, uint8_t list, uint8_t cmd,int quiet); #define MAX_ENQUIRY_ANSWER_LENGTH 20 #define DISPLAY_TYPE_LIST 1 #define DISPLAY_TYPE_MENU 2 /** @brief the parameters for the cam * This structure contain the parameters needed for the CAM */ typedef struct cam_parameters_t{ /**Do we activate the support for CAMs*/ int cam_support; /**The came number (in case of multiple cams)*/ int cam_number; /** Do we reask channels asked and keept scrambled and what is the interval between reasks*/ int cam_reask_interval; int cam_type; int need_reset; int reset_counts; int max_reset_number; int timeout_no_cam_init; int reset_interval; struct en50221_transport_layer *tl; struct en50221_session_layer *sl; struct en50221_stdcam *stdcam; int ca_resource_connected; int camthread_shutdown; pthread_t camthread; int moveca; int mmi_state; int mmi_enq_blind; int mmi_enq_length; int mmi_enq_entered; char mmi_enq_answer[10]; /** Used to say if we received the CA info callback */ long ca_info_ok_time; /** The delay for sending the PMT to the CAM*/ int cam_delay_pmt_send; /** The delay between two PMT asking */ int cam_interval_pmt_send; long cam_pmt_send_time; char filename_cam_info[DEFAULT_PATH_LEN]; mumu_string_t cam_menu_string; mumu_string_t cam_menulist_str; int cam_mmi_autoresponse; /** Do we follow the version of the PMT for the CAM ?*/ int cam_pmt_follow; }cam_parameters_t; /***************************************************************************** * Code for dealing with libdvben50221 *****************************************************************************/ #define SL_MAX_SESSIONS 16 #define MMI_STATE_CLOSED 0 #define MMI_STATE_OPEN 1 #define MMI_STATE_ENQ 2 #define MMI_STATE_MENU 3 #define MAX_WAIT_AFTER_RESET 30 #define CAM_DEFAULT_MAX_RESET_NUM 5 #define CAM_DEFAULT_RESET_INTERVAL 30 /** * States a CAM in a slot can be in. */ #define DVBCA_CAMSTATE_MISSING 0 #define DVBCA_CAMSTATE_INITIALISING 1 #define DVBCA_CAMSTATE_READY 2 /** * The types of CA interface we support. */ #define DVBCA_INTERFACE_LINK 0 #define DVBCA_INTERFACE_HLCI 1 int cam_start(cam_parameters_t *, int); void cam_stop(cam_parameters_t *); int read_cam_configuration(cam_parameters_t *cam_vars, mumudvb_channel_t *current_channel, int ip_ok, char *substring); int cam_new_packet(int pid, int curr_channel, unsigned char *ts_packet, cam_parameters_t *cam_vars, mumudvb_channel_t *actual_channel); void cam_pmt_follow(unsigned char *ts_packet, mumudvb_channel_t *actual_channel); #endif mumudvb-1.7.1/src/config.h.in000066400000000000000000000142431177353207000160220ustar00rootroot00000000000000/* src/config.h.in. Generated from configure.ac by autoheader. */ /* Define if you want the CAM support */ #undef ENABLE_CAM_SUPPORT /* Define if you want the transcoding support */ #undef ENABLE_TRANSCODING /* Define to 1 if you have the `alarm' function. */ #undef HAVE_ALARM /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_NAMESER_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FFMPEG_AVCODEC_H /* Define to 1 if you have the header file. */ #undef HAVE_FFMPEG_AVFORMAT_H /* Define to 1 if you have the header file. */ #undef HAVE_FFMPEG_SWSCALE_H /* Define if the function ff_url_split exists */ #undef HAVE_FF_URL_SPLIT /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the `inet_ntoa' function. */ #undef HAVE_INET_NTOA /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `avcodec' library (-lavcodec). */ #undef HAVE_LIBAVCODEC /* Define to 1 if you have the header file. */ #undef HAVE_LIBAVCODEC_AVCODEC_H /* Define to 1 if you have the `avformat' library (-lavformat). */ #undef HAVE_LIBAVFORMAT /* Define to 1 if you have the header file. */ #undef HAVE_LIBAVFORMAT_AVFORMAT_H /* Define to 1 if you have the `duma' library (-lduma). */ #undef HAVE_LIBDUMA /* Define to 1 if you have the `dvbapi' library (-ldvbapi). */ #undef HAVE_LIBDVBAPI /* Define to 1 if you have the `dvben50221' library (-ldvben50221). */ #undef HAVE_LIBDVBEN50221 /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `rt' library (-lrt). */ #undef HAVE_LIBRT /* Define to 1 if you have the `swscale' library (-lswscale). */ #undef HAVE_LIBSWSCALE /* Define to 1 if you have the header file. */ #undef HAVE_LIBSWSCALE_SWSCALE_H /* Define to 1 if you have the `ucsi' library (-lucsi). */ #undef HAVE_LIBUCSI /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the header file. */ #undef HAVE_RESOLV_H /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define if the function url_split exists */ #undef HAVE_URL_SPLIT /* Define to 1 if you have the header file. */ #undef HAVE_VALUES_H /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t mumudvb-1.7.1/src/crc32.c000066400000000000000000000102101177353207000150450ustar00rootroot00000000000000/* * mumudvb - UDP-ize a DVB transport stream. * * (C) 2004-2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief File for CRC32 calculation * it contains the precomputed table */ #include /**CRC table for PAT rebuilding, cam support and autoconfiguration*/ uint32_t crc32_table[256] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 }; mumudvb-1.7.1/src/dvb.c000066400000000000000000000456151177353207000147250ustar00rootroot00000000000000/* dvb.c * MuMuDVB - Stream a DVB transport stream. * * (C) 2004-2011 Brice DUBOST * (C) Dave Chapman 2001, 2002. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /** @file * @brief dvb part (except tune) of mumudvb * Ie : setting the filters, openning the file descriptors etc... */ #define _GNU_SOURCE #include "dvb.h" #include #include #include #include #include #include #include "log.h" #include extern int Interrupted; static char *log_module="DVB: "; /** * @brief Open the frontend associated with card * Return 1 in case of succes, -1 otherwise * * @param fd_frontend the file descriptor for the frontend * @param card the card number */ int open_fe (int *fd_frontend, char *base_path, int tuner) { char *frontend_name=NULL; int asprintf_ret; asprintf_ret=asprintf(&frontend_name,"%s/%s%d",base_path,FRONTEND_DEV_NAME,tuner); if(asprintf_ret==-1) return -1; if ((*fd_frontend = open (frontend_name, O_RDWR | O_NONBLOCK)) < 0) { log_message( log_module, MSG_ERROR, "FRONTEND DEVICE: %s : %s\n", frontend_name, strerror(errno)); free(frontend_name); return -1; } free(frontend_name); return 1; } /** * @brief Set a filter of the pid asked. The file descriptor has to be * opened before. Ie it will ask the card for this PID. * @param fd the file descriptor * @param pid the pid for the filter */ void set_ts_filt (int fd, uint16_t pid) { struct dmx_pes_filter_params pesFilterParams; log_message( log_module, MSG_DEBUG, "Setting filter for PID %d\n", pid); pesFilterParams.pid = pid; pesFilterParams.input = DMX_IN_FRONTEND; pesFilterParams.output = DMX_OUT_TS_TAP; pesFilterParams.pes_type = DMX_PES_OTHER; pesFilterParams.flags = DMX_IMMEDIATE_START; if (ioctl (fd, DMX_SET_PES_FILTER, &pesFilterParams) < 0) { log_message( log_module, MSG_ERROR, "FILTER %i: ", pid); log_message( log_module, MSG_ERROR, "DMX SET PES FILTER : %s\n", strerror(errno)); } } /** * @brief Show the reception power. * This information is not alway reliable * @param fds the file descriptors of the card */ void *show_power_func(void* arg) { strength_parameters_t *strengthparams; strengthparams= (strength_parameters_t *) arg; fe_status_t festatus_old; int lock_lost; int meas_ber_ok=1; int meas_strength_ok=1; int meas_snr_ok=1; int meas_ub_ok=1; int wait_time=20;//in units of 100ms int i; strengthparams->strength = 0; strengthparams->ber = 0; strengthparams->snr = 0; strengthparams->ub = 0; strengthparams->ts_discontinuities = 0; //could be initialised somewhere else but sounds fine here memset(&festatus_old,0,sizeof(fe_status_t)); lock_lost=0; while(!strengthparams->tuneparams->strengththreadshutdown) { if(strengthparams->tuneparams->card_tuned) { if(strengthparams->tuneparams->display_strenght ) mumu_timing(); if (ioctl (strengthparams->fds->fd_frontend, FE_READ_BER, &strengthparams->ber) < 0) { if(meas_ber_ok) { meas_ber_ok=0; log_message( log_module, MSG_WARN, "An issue happened during the IOCTLS to take BER measurements error: %s",strerror(errno)); } } else meas_ber_ok=1; if (ioctl (strengthparams->fds->fd_frontend, FE_READ_SIGNAL_STRENGTH, &strengthparams->strength) < 0) { if(meas_strength_ok) { meas_strength_ok=0; log_message( log_module, MSG_WARN, "An issue happened during the IOCTLS to take strength measurements error: %s",strerror(errno)); } } else meas_strength_ok=1; if (ioctl (strengthparams->fds->fd_frontend, FE_READ_SNR, &strengthparams->snr) < 0) { if(meas_snr_ok) { meas_snr_ok=0; log_message( log_module, MSG_WARN, "An issue happened during the IOCTLS to take SNR measurements error: %s",strerror(errno)); } } else meas_snr_ok=1; if (ioctl (strengthparams->fds->fd_frontend, FE_READ_UNCORRECTED_BLOCKS, &strengthparams->ub) < 0 ) { if(meas_ub_ok) { meas_ub_ok=0; log_message( log_module, MSG_WARN, "An issue happened during the IOCTLS to take uncorrected blocks measurements error: %s",strerror(errno)); } } else meas_ub_ok=1; } if(strengthparams->tuneparams->display_strenght && strengthparams->tuneparams->card_tuned) { log_message( log_module, MSG_INFO, "Bit error rate: %10d Signal strength: %10d SNR: %10d Uncorrected blocks: %10d\n", strengthparams->ber,strengthparams->strength,strengthparams->snr,strengthparams->ub); log_message( log_module, MSG_INFO, "ts_discontinuities %10d",strengthparams->ts_discontinuities); log_message( log_module, MSG_FLOOD, "Timing: ioctls took %ld micro seconds\n",mumu_timing()); } if((strengthparams->tuneparams->check_status ||strengthparams->tuneparams->display_strenght) && strengthparams->tuneparams->card_tuned) { if (ioctl (strengthparams->fds->fd_frontend, FE_READ_STATUS, &strengthparams->festatus) != -1) { if((!(strengthparams->festatus & FE_HAS_LOCK) ) && (festatus_old != strengthparams->festatus)) { if(!lock_lost) log_message( log_module, MSG_WARN, "The card has lost the lock (antenna unplugged ?). Detailled status\n"); else log_message( log_module, MSG_INFO, "Card is still not locked but status changed. Detailled status\n"); print_status(strengthparams->festatus); festatus_old = strengthparams->festatus; lock_lost=1; } if((strengthparams->festatus & FE_HAS_LOCK) && lock_lost) { log_message( log_module, MSG_INFO, "Card is locked again.\n"); lock_lost=0; } } } for(i=0;ituneparams->strengththreadshutdown;i++) usleep(100000); } return 0; } /** * @brief Open file descriptors for the card. open dvr and one demuxer fd per asked pid. This function can be called * more than one time if new pids are added (typical case autoconf) * return -1 in case of error * @param card the card number * @param asked_pid the array of asked pids * @param fds the structure with the file descriptors */ int create_card_fd(char *base_path, int tuner, uint8_t *asked_pid, fds_t *fds) { int curr_pid = 0; char *demuxdev_name=NULL; char *dvrdev_name=NULL; int asprintf_ret; asprintf_ret=asprintf(&demuxdev_name,"%s/%s%d",base_path,DEMUX_DEV_NAME,tuner); if(asprintf_ret==-1) return -1; for(curr_pid=0;curr_pid<8193;curr_pid++) //file descriptors for the demuxer (used to set the filters) //we check if we need to open the file descriptor (some cards are limited) if ((asked_pid[curr_pid] != 0)&& (fds->fd_demuxer[curr_pid]==0) ) if((fds->fd_demuxer[curr_pid] = open (demuxdev_name, O_RDWR)) < 0) { log_message( log_module, MSG_ERROR, "FD PID %i: ", curr_pid); log_message( log_module, MSG_ERROR, "DEMUX DEVICE: %s : %s\n", demuxdev_name, strerror(errno)); free(demuxdev_name); return -1; } asprintf_ret=asprintf(&dvrdev_name,"%s/%s%d",base_path,DVR_DEV_NAME,tuner); if(asprintf_ret==-1) return -1; if (fds->fd_dvr==0) //this function can be called more than one time, we check if we opened it before if ((fds->fd_dvr = open (dvrdev_name, O_RDONLY | O_NONBLOCK)) < 0) { log_message( log_module, MSG_ERROR, "DVR DEVICE: %s : %s\n", dvrdev_name, strerror(errno)); free(dvrdev_name); return -1; } free(dvrdev_name); free(demuxdev_name); return 0; } /** * @brief Open filters for the pids in asked_pid. This function update the asked_pid array and * can be called more than one time if new pids are added (typical case autoconf) * Ie it asks the card for the pid list by calling set_ts_filt * @param asked_pid the array of asked pids * @param fds the structure with the file descriptors */ void set_filters(uint8_t *asked_pid, fds_t *fds) { int curr_pid = 0; for(curr_pid=0;curr_pid<8193;curr_pid++) if ((asked_pid[curr_pid] == PID_ASKED) ) { set_ts_filt (fds->fd_demuxer[curr_pid], curr_pid); asked_pid[curr_pid] = PID_FILTERED; } } /** * @brief Close the file descriptors associated with the card * @param fds the structure with the file descriptors */ void close_card_fd(fds_t fds) { int curr_pid = 0; for(curr_pid=0;curr_pid<8193;curr_pid++) { close(fds.fd_demuxer[curr_pid]); } close (fds.fd_dvr); close (fds.fd_frontend); } /** * @brief Function for the tread reading data from the card * @param arg the structure with the thread parameters */ void *read_card_thread_func(void* arg) { card_thread_parameters_t *threadparams; threadparams= (card_thread_parameters_t *) arg; struct pollfd pfds[2]; // Local poll file descriptors containing DVR device int poll_ret; fds_t fds; threadparams->card_buffer->bytes_in_write_buffer=0; int throwing_packets=0; //File descriptor for polling the DVB card pfds[0].fd = threadparams->fds->fd_dvr; //POLLIN : data available for read pfds[0].events = POLLIN | POLLPRI; pfds[1].fd = 0; pfds[1].events = POLLIN | POLLPRI; fds.pfds=pfds; fds.pfdsnum=1; log_message( log_module, MSG_DEBUG, "Reading thread start\n"); usleep(100000); //some waiting to be sure the main program is waiting //it is probably useless threadparams->unicast_data=0; while(!threadparams->threadshutdown&& !Interrupted) { //If we know that there is unicast data waiting, we don't poll the unicast file descriptors if(threadparams->unicast_data) poll_ret=mumudvb_poll(&fds); else poll_ret=mumudvb_poll(threadparams->fds); if(poll_ret) { Interrupted=poll_ret; log_message( log_module, MSG_WARN, "Thread polling issue\n"); return NULL; } if((!(threadparams->fds->pfds[0].revents&POLLIN)) && (!(threadparams->fds->pfds[0].revents&POLLPRI))) //Unicast information { threadparams->unicast_data=1; if(threadparams->main_waiting) { //log_message( log_module, MSG_DEBUG, "Thread signalling -------\n"); pthread_cond_signal(&threadparams->threadcond); } //no DVB packet, we continue continue; } if((threadparams->card_buffer->bytes_in_write_buffer+TS_PACKET_SIZE*threadparams->card_buffer->dvr_buffer_size)>threadparams->card_buffer->write_buffer_size) { /**@todo : use a dynamic buffer ?*/ if(!throwing_packets) { throwing_packets=1; /** @todo count them*/ log_message( log_module, MSG_INFO, "Thread trowing dvb packets\n"); } if(threadparams->main_waiting) { //log_message( log_module, MSG_DEBUG, "Thread signalling -------\n"); pthread_cond_signal(&threadparams->threadcond); } continue; } throwing_packets=0; pthread_mutex_lock(&threadparams->carddatamutex); threadparams->card_buffer->bytes_in_write_buffer+=card_read(threadparams->fds->fd_dvr, threadparams->card_buffer->writing_buffer+threadparams->card_buffer->bytes_in_write_buffer, threadparams->card_buffer); if(threadparams->main_waiting) { //log_message( log_module, MSG_DEBUG, "Thread signalling -------\n"); pthread_cond_signal(&threadparams->threadcond); } pthread_mutex_unlock(&threadparams->carddatamutex); //usleep(2000000); } return NULL; } /** @brief : Read data from the card * This function have to be called after a poll to ensure there is data to read * */ int card_read(int fd_dvr, unsigned char *dest_buffer, card_buffer_t *card_buffer) { /* Attempt to read 188 bytes * dvr_buffer_size from /dev/____/dvr */ int bytes_read; if ((bytes_read = read (fd_dvr, dest_buffer, TS_PACKET_SIZE*card_buffer->dvr_buffer_size)) > 0) { if((bytes_read>0 )&& (bytes_read % TS_PACKET_SIZE)) { log_message( log_module, MSG_WARN, "Warning : partial packet received len %d\n", bytes_read); card_buffer->partial_packet_number++; bytes_read-=bytes_read % TS_PACKET_SIZE; if(bytes_read<=0) return 0; } } if(bytes_read<0) { if(errno!=EAGAIN) log_message( log_module, MSG_WARN,"Error : DVR Read error : %s \n",strerror(errno)); if(errno==EOVERFLOW) { card_buffer->overflow_number++; } return 0; } return bytes_read; } /* int tune_dvr_buffer_size(int bytes_read, card_buffer_t *card_buffers) { return 0; } */ typedef struct frontend_cap_t { long int flag; char descr[128]; }frontend_cap_t; /** @brief : List the capabilities of one card * * */ void show_card_capabilities( int card, int tuner ) { int frontend_fd; int i_ret; int display_sr; int frequency_factor; /** The path of the card */ char card_dev_path[256]; sprintf(card_dev_path,DVB_DEV_PATH,card); //Open the frontend if(!open_fe (&frontend_fd, card_dev_path, tuner)) return; //if(ioctl(fd_frontend,FE_READ_STATUS,&festatus) >= 0) //print_status(festatus); //get frontend info struct dvb_frontend_info fe_info; if ( (i_ret = ioctl(frontend_fd,FE_GET_INFO, &fe_info) < 0)){ log_message( log_module, MSG_ERROR, "FE_GET_INFO: %s \n", strerror(errno)); return; } log_message( log_module, MSG_INFO, "=========== Card %d - Tuner %d ===========\n", card, tuner); log_message( log_module, MSG_INFO, " Frontend : %s\n", fe_info.name); display_sr=0; switch(fe_info.type) { case FE_OFDM: log_message( log_module, MSG_INFO, " Terrestrial (DVB-T) card\n"); break; case FE_QPSK: log_message( log_module, MSG_INFO, " Satellite (DVB-S) card\n"); display_sr=1; break; case FE_QAM: log_message( log_module, MSG_INFO, " Cable (DVB-C) card\n"); display_sr=1; break; case FE_ATSC: log_message( log_module, MSG_INFO, " ATSC card\n"); break; } if(fe_info.type==FE_QPSK) frequency_factor=1000; else frequency_factor=1; if (frequency_factor!=0) log_message( log_module, MSG_INFO, " Frequency: %d kHz to %d kHz\n",(int) fe_info.frequency_min/1000*frequency_factor,(int) fe_info.frequency_max/1000*frequency_factor); else log_message( log_module, MSG_WARN, " frequency_factor=0\n"); if(display_sr) log_message( log_module, MSG_INFO, " Symbol rate: %d k symbols/s to %d k symbols/s \n", (int)fe_info.symbol_rate_min/1000, (int)fe_info.symbol_rate_max/1000); log_message( log_module, MSG_DETAIL, "\n== Card capabilities ==\n"); log_message( log_module, MSG_DEBUG, "caps 0x%x\n",fe_info.caps); frontend_cap_t caps[]={ {0x1,"FE_CAN_INVERSION_AUTO"}, {0x2,"FE_CAN_FEC_1_2"}, {0x4,"FE_CAN_FEC_2_3"}, {0x8,"FE_CAN_FEC_3_4"}, {0x10,"FE_CAN_FEC_4_5"}, {0x20,"FE_CAN_FEC_5_6"}, {0x40,"FE_CAN_FEC_6_7"}, {0x80,"FE_CAN_FEC_7_8"}, {0x100,"FE_CAN_FEC_8_9"}, {0x200,"FE_CAN_FEC_AUTO"}, {0x400,"FE_CAN_QPSK"}, {0x800,"FE_CAN_QAM_16"}, {0x1000,"FE_CAN_QAM_32"}, {0x2000,"FE_CAN_QAM_64"}, {0x4000,"FE_CAN_QAM_128"}, {0x8000,"FE_CAN_QAM_256"}, {0x10000,"FE_CAN_QAM_AUTO"}, {0x20000,"FE_CAN_TRANSMISSION_MODE_AUTO"}, {0x40000,"FE_CAN_BANDWIDTH_AUTO"}, {0x80000,"FE_CAN_GUARD_INTERVAL_AUTO"}, {0x100000,"FE_CAN_HIERARCHY_AUTO"}, {0x200000,"FE_CAN_8VSB"}, {0x400000,"FE_CAN_16VSB"}, {0x800000,"FE_HAS_EXTENDED_CAPS /* We need more bitspace for newer APIs, indicate this. */"}, {0x10000000,"FE_CAN_2G_MODULATION /* frontend supports '2nd generation modulation' (DVB-S2) */"}, {0x20000000,"FE_NEEDS_BENDING /* not supported anymore */"}, {0x40000000,"FE_CAN_RECOVER /* frontend can recover from a cable unplug automatically */"}, {0x80000000,"FE_CAN_MUTE_TS /* frontend can stop spurious TS data output */"}, }; int numcaps=28; int i; //todo : do a loop on a structure which contains the capabilities for(i=0;id_name)<8) continue; if(strncmp(d_adapter->d_name,"adapter",7)) continue; card_number= atoi(d_adapter->d_name+7); log_message( log_module, MSG_DEBUG, "found adapter %d\n", card_number); cards[num_cards]=card_number; num_cards++; if(num_cards==256) { log_message( log_module, MSG_ERROR, "Wow You have a system with more than 256 DVB cards, Please Contact me :D\n"); return; } } closedir(dvb_dir); //Basic card sorting (O(N^2)) int i,j,old_card; old_card=-1; DIR *adapter_dir; /** The path of the card */ char card_dev_path[256]; int tuner_number; struct dirent *d_tuner; for(i=0;iold_card) && (cards[j]d_name)<(strlen(FRONTEND_DEV_NAME)+1)) continue; if(strncmp(d_tuner->d_name,FRONTEND_DEV_NAME,strlen(FRONTEND_DEV_NAME))) continue; tuner_number= atoi(d_tuner->d_name+strlen(FRONTEND_DEV_NAME)); log_message( log_module, MSG_DEBUG, "\tfound Frontend %d\n", tuner_number); /** show the current tuner */ show_card_capabilities( card_number , tuner_number); } closedir(adapter_dir); } } mumudvb-1.7.1/src/dvb.h000066400000000000000000000054661177353207000147320ustar00rootroot00000000000000/* * mumudvb - UDP-ize a DVB transport stream. * Based on dvbstream by (C) Dave Chapman 2001, 2002. * * (C) 2004-2010 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /** @file * @brief dvb part (except tune) of mumudvb * Ie : setting the filters, openning the file descriptors etc... */ #ifndef _DVB_H #define _DVB_H #include #include #include #include #include #include #include #include // DVB includes: #include #include #include "mumudvb.h" #include "tune.h" #define DVB_DEV_PATH "/dev/dvb/adapter%d" #define FRONTEND_DEV_NAME "frontend" #define DEMUX_DEV_NAME "demux" #define DVR_DEV_NAME "dvr" enum { PID_NOT_ASKED=0, PID_ASKED, PID_FILTERED, }; /** The parameters for the thread for showing the strength */ typedef struct strength_parameters_t{ tuning_parameters_t *tuneparams; fds_t *fds; fe_status_t festatus; int strength, ber, snr, ub; int ts_discontinuities; }strength_parameters_t; /** The parameters for the thread for reading the data from the card */ typedef struct card_thread_parameters_t{ //mutex for the data buffer pthread_mutex_t carddatamutex; //Condition variable for locking the main program in order to wait for new data pthread_cond_t threadcond; //file descriptors fds_t *fds; //The shutdown for the thread int threadshutdown; //The buffer for the card card_buffer_t *card_buffer; // int thread_running; /** Is main waiting ?*/ int main_waiting; int unicast_data; }card_thread_parameters_t; void *read_card_thread_func(void* arg); int open_fe (int *fd_frontend, char *base_path, int tuner); void set_ts_filt (int fd,uint16_t pid); int create_card_fd(char *base_path, int tuner, uint8_t *asked_pid, fds_t *fds); void set_filters(uint8_t *asked_pid, fds_t *fds); void close_card_fd(fds_t fds); void *show_power_func(void* arg); int card_read(int fd_dvr, unsigned char *dest_buffer, card_buffer_t *card_buffer); void list_dvb_cards (); #endif mumudvb-1.7.1/src/errors.h000066400000000000000000000024411177353207000154610ustar00rootroot00000000000000/* * mumudvb - UDP-ize a DVB transport stream. * * (C) 2004-2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /**@file *File for the enumeration of the different possible errors *@todo : update it */ #ifndef _ERRORS_MUMUDVB_H #define _ERRORS_MUMUDVB_H enum { ERROR_ARGS=1, ERROR_CONF_FILE, ERROR_CONF, ERROR_TOO_CHANNELS, ERROR_CREATE_FILE, ERROR_DEL_FILE, ERROR_TUNE, ERROR_NO_DIFF, ERROR_MEMORY, ERROR_NETWORK, ERROR_CAM, ERROR_GENERIC, ERROR_NO_CAM_INIT, }; #endif mumudvb-1.7.1/src/log.c000066400000000000000000001036721177353207000147310ustar00rootroot00000000000000/* * mumudvb - Stream a DVB transport stream. * Based on dvbstream by (C) Dave Chapman 2001, 2002. * * (C) 2004-2010 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /** @file * @brief Log functions for mumudvb * * This file contains functions to log messages or write logging information to a file */ #include #include #include #include #include #include #include #include #include #include "mumudvb.h" #include "errors.h" #include "log.h" #include "tune.h" #ifdef ENABLE_CAM_SUPPORT #include #endif #define LOG_HEAD_LEN 6 extern int no_daemon; extern int Interrupted; log_params_t log_params={ .verbosity = MSG_INFO+1, .log_type=LOGGING_UNDEFINED, .rotating_log_file=0, .syslog_initialised=0, .log_header=NULL, .log_file=NULL, .log_flush_interval = -1, }; static char *log_module="Logs: "; /** @brief Read a line of the configuration file to check if there is a logging parameter * * @param stats_infos the stats infos parameters * @param log_params the logging parameters * @param substring The currrent line */ int read_logging_configuration(stats_infos_t *stats_infos, char *substring) { char delimiteurs[] = CONFIG_FILE_SEPARATOR; if (!strcmp (substring, "show_traffic_interval")) { substring = strtok (NULL, delimiteurs); stats_infos->show_traffic_interval= atoi (substring); if(stats_infos->show_traffic_interval<1) { stats_infos->show_traffic_interval=1; log_message( log_module, MSG_WARN,"Sorry the minimum interval for showing the traffic is 1s\n"); } } else if (!strcmp (substring, "compute_traffic_interval")) { substring = strtok (NULL, delimiteurs); stats_infos->compute_traffic_interval= atoi (substring); if(stats_infos->compute_traffic_interval<1) { stats_infos->compute_traffic_interval=1; log_message( log_module, MSG_WARN,"Sorry the minimum interval for computing the traffic is 1s\n"); } } else if (!strcmp (substring, "up_threshold")) { substring = strtok (NULL, delimiteurs); stats_infos->up_threshold= atoi (substring); } else if (!strcmp (substring, "down_threshold")) { substring = strtok (NULL, delimiteurs); stats_infos->down_threshold= atoi (substring); } else if (!strcmp (substring, "debug_updown")) { substring = strtok (NULL, delimiteurs); stats_infos->debug_updown= atoi (substring); } else if (!strcmp (substring, "log_type")) { substring = strtok (NULL, delimiteurs); if (!strcmp (substring, "console")) log_params.log_type |= LOGGING_CONSOLE; else if (!strcmp (substring, "syslog")) { openlog ("MUMUDVB", LOG_PID, 0); log_params.log_type |= LOGGING_SYSLOG; log_params.syslog_initialised=1; } else log_message(log_module,MSG_WARN,"Invalid value for log_type\n"); } else if (!strcmp (substring, "log_file")) { substring = strtok (NULL, delimiteurs); log_params.log_file_path=malloc((strlen(substring)+1)*sizeof(char)); strncpy(log_params.log_file_path,substring,strlen(substring)+1); if(log_params.log_file_path==NULL) { log_message(log_module,MSG_WARN,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } } else if (!strcmp (substring, "log_header")) { substring = strtok (NULL,"=" ); if(log_params.log_header!=NULL) free(log_params.log_header); log_params.log_header=malloc((strlen(substring)+1)*sizeof(char)); if(log_params.log_header==NULL) { log_message(log_module,MSG_WARN,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } sprintf(log_params.log_header,"%s",substring); } else if (!strcmp (substring, "log_flush_interval")) { substring = strtok (NULL, delimiteurs); log_params.log_flush_interval = atof (substring); } else return 0; return 1; } /** * @brief Return a string description of the log priorities */ char *priorities(int type) { switch(type) { case MSG_ERROR: return "ERRO"; case MSG_WARN: return "WARN"; case MSG_INFO: return "Info"; case MSG_DETAIL: return "Deb0"; case MSG_DEBUG: return "Deb1"; case MSG_FLOOD: return "Deb2"; default: return ""; } } /** * @brief Sync_log for logrotate * This function is called when a sighup is received. This function flushes the log and reopen the logfile * * */ void sync_logs() { if (log_params.log_type |= LOGGING_FILE && log_params.log_file) { fflush(log_params.log_file); log_params.log_file=freopen(log_params.log_file_path,"a",log_params.log_file); } } /** * @brief Print a log message * * @param log_module : the name of the part of MuMuDVB which send the message * @param type : message type MSG_* * @param psz_format : the message in the printf format */ void log_message( char* log_module, int type, const char *psz_format, ... ) { va_list args; int priority=0; char *tempchar; int message_size; mumu_string_t log_string; log_string.string=NULL; log_string.length=0; /*****************************************/ //if the log header is not initialised // we do it /*****************************************/ if(log_params.log_header==NULL) { log_params.log_header=malloc((strlen(DEFAULT_LOG_HEADER)+1)*sizeof(char)); if(log_params.log_header==NULL) { if (log_params.log_type == LOGGING_FILE) fprintf( log_params.log_file,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); else if (log_params.log_type == LOGGING_SYSLOG) syslog (MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); else fprintf( stderr,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); va_end( args ); Interrupted=ERROR_MEMORY<<8; return; } sprintf(log_params.log_header,"%s",DEFAULT_LOG_HEADER); } /*****************************************/ //We apply the templates to the header /*****************************************/ mumu_string_append(&log_string, "%s",log_params.log_header); log_string.string=mumu_string_replace(log_string.string,&log_string.length,1,"%priority",priorities(type)); if(log_module!=NULL) log_string.string=mumu_string_replace(log_string.string,&log_string.length,1,"%module",log_module); else log_string.string=mumu_string_replace(log_string.string,&log_string.length,1,"%module",""); char timestring[40]; time_t actual_time; actual_time=time(NULL); sprintf(timestring,"%jd", (intmax_t)actual_time); log_string.string=mumu_string_replace(log_string.string,&log_string.length,1,"%timeepoch",timestring); asctime_r(localtime(&actual_time),timestring); timestring[strlen(timestring)-1]='\0'; //In order to remove the final '\n' but by asctime log_string.string=mumu_string_replace(log_string.string,&log_string.length,1,"%date",timestring); char pidstring[10]; sprintf (pidstring, "%d", getpid ()); log_string.string=mumu_string_replace(log_string.string,&log_string.length,1,"%pid",pidstring); /*****************************************/ //We append the log message /*****************************************/ //The length returned by mumu_string_replace is the allocated length not the string length //If we want mumu_string_append to work we need to update the length to the string length log_string.length=strlen(log_string.string); va_start( args, psz_format ); message_size=vsnprintf(NULL, 0, psz_format, args); va_end( args ); tempchar=malloc((message_size+1)*sizeof(char)); if(tempchar==NULL) { if (log_params.log_type == LOGGING_FILE) fprintf( log_params.log_file,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); else if (log_params.log_type == LOGGING_SYSLOG) syslog (MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); else fprintf( stderr,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); va_end( args ); Interrupted=ERROR_MEMORY<<8; return; } va_start( args, psz_format ); vsprintf(tempchar, psz_format, args ); va_end( args ); //If there is no \n at the end of the message we add it char terminator='\0'; if(tempchar[strlen(tempchar)-1] != '\n') terminator='\n'; mumu_string_append(&log_string,"%s%c",tempchar,terminator); free(tempchar); /*****************************************/ //We "display" the log message /*****************************************/ if(typename)))return; for (int curr_pid = 0; curr_pid < channel->num_pids; curr_pid++) { if((Interrupted=mumu_string_append(&string, " %d",channel->pids[curr_pid])))return; } log_message( log_module, MSG_DETAIL,"%s\n",string.string); mumu_free_string(&string); /******** end of display the pids **********/ } /** * @brief Generate a file containing the list of the streamed channels * and a file containing a list of not streamed channels * * @param file_streamed_channels_filename The filename for the file containig the list of streamed channels * @param file_not_streamed_channels_filename The filename for the file containig the list of NOT streamed channels * @param number_of_channels the number of channels * @param channels the channels array */ void gen_file_streamed_channels (char *file_streamed_channels_filename, char *file_not_streamed_channels_filename, int number_of_channels, mumudvb_channel_t *channels) { /**todo : adapt it for unicast (json ?) */ FILE *file_streamed_channels; FILE *file_not_streamed_channels; int curr_channel; file_streamed_channels = fopen (file_streamed_channels_filename, "w"); if (file_streamed_channels == NULL) { log_message( log_module, MSG_WARN, "Error file_streamed_channels %s: %s\n", file_streamed_channels_filename, strerror (errno)); return; } file_not_streamed_channels = fopen (file_not_streamed_channels_filename, "w"); if (file_not_streamed_channels == NULL) { log_message( log_module, MSG_WARN, "Error file_not_streamed_channels %s: %s\n", file_not_streamed_channels_filename, strerror (errno)); return; } for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) //We store the old to be sure that we store only channels over the minimum packets limit if (channels[curr_channel].streamed_channel) { fprintf (file_streamed_channels, "%s:%d:%s", channels[curr_channel].ip4Out, channels[curr_channel].portOut, channels[curr_channel].name); if (channels[curr_channel].scrambled_channel == FULLY_UNSCRAMBLED) fprintf (file_streamed_channels, ":FullyUnscrambled\n"); else if (channels[curr_channel].scrambled_channel == PARTIALLY_UNSCRAMBLED) fprintf (file_streamed_channels, ":PartiallyUnscrambled\n"); else //HIGHLY_SCRAMBLED fprintf (file_streamed_channels, ":HighlyScrambled\n"); } else fprintf (file_not_streamed_channels, "%s:%d:%s\n", channels[curr_channel].ip4Out, channels[curr_channel].portOut, channels[curr_channel].name); fclose (file_streamed_channels); fclose (file_not_streamed_channels); } /** * @brief Write a config file with the current parameters * in a form understandable by mumudvb * This is useful if you want to do fine tuning after autoconf * This part generate the header ie take the actual config file and remove useless thing (ie channels, autoconf ...) * * @param orig_conf_filename The name of the config file used actually by mumudvb * @param saving_filename the path of the generated config file */ void gen_config_file_header(char *orig_conf_filename, char *saving_filename) { FILE *orig_conf_file; FILE *config_file; char current_line[CONF_LINELEN]; char current_line_temp[CONF_LINELEN]; char *substring=NULL; char delimiteurs[] = " ="; orig_conf_file = fopen (orig_conf_filename, "r"); if (orig_conf_file == NULL) { log_message( log_module, MSG_WARN, "Strange error %s: %s\n", orig_conf_filename, strerror (errno)); return; } config_file = fopen (saving_filename, "w"); if (config_file == NULL) { log_message( log_module, MSG_WARN, "saving_filename %s: %s\n", saving_filename, strerror (errno)); return; } fprintf ( config_file, "# !!!!!!! This is a generated configuration file for MuMuDVB !!!!!!!!!!!\n"); fprintf ( config_file, "#\n"); while (fgets (current_line, CONF_LINELEN, orig_conf_file)) { strcpy(current_line_temp,current_line); substring = strtok (current_line_temp, delimiteurs); //We remove the channels and parameters concerning autoconfiguration if (!strcmp (substring, "autoconfiguration")) continue; else if (!strncmp (substring, "autoconf_", strlen("autoconf_"))) continue; else if (!strcmp (substring, "channel_next")) continue; else if (!strcmp (substring, "ip")) continue; else if (!strcmp (substring, "port")) continue; else if (!strcmp (substring, "unicast_port")) continue; else if (!strcmp (substring, "ts_id")) continue; else if (!strcmp (substring, "service_id")) continue; else if (!strcmp (substring, "cam_pmt_pid")) continue; else if (!strcmp (substring, "pids")) continue; else if (!strcmp (substring, "sap_group")) continue; else if (!strcmp (substring, "name")) continue; //we write the parts we didn't dropped fprintf(config_file,"%s",current_line); } fprintf ( config_file, "\n#End of global part\n#\n"); fclose(config_file); fclose(orig_conf_file); } /** * @brief Write a config file with the current parameters * in a form understandable by mumudvb * This is useful if you want to do fine tuning after autoconf * this part generates the channels * * @param number_of_channels the number of channels * @param channels the channels array * @param saving_filename the path of the generated config file */ void gen_config_file(int number_of_channels, mumudvb_channel_t *channels, char *saving_filename) { FILE *config_file; int curr_channel; int curr_pid; //Append mode to avoid erasing the header config_file = fopen (saving_filename, "a"); if (config_file == NULL) { log_message( log_module, MSG_WARN, "Error config_file %s: %s\n", saving_filename, strerror (errno)); return; } fprintf ( config_file, "#Configuration for %d channel%s\n", number_of_channels, (number_of_channels <= 1 ? "" : "s")); for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) { fprintf ( config_file, "#Channel number : %3d\nip=%s\nport=%d\nname=%s\n", curr_channel, channels[curr_channel].ip4Out, channels[curr_channel].portOut, channels[curr_channel].name); if (channels[curr_channel].sap_group[0]) fprintf ( config_file, "sap_group=%s\n", channels[curr_channel].sap_group); if (channels[curr_channel].need_cam_ask) fprintf ( config_file, "cam_pmt_pid=%d\n", channels[curr_channel].pmt_pid); if (channels[curr_channel].service_id) fprintf ( config_file, "service_id=%d\n", channels[curr_channel].service_id); if (channels[curr_channel].unicast_port) fprintf ( config_file, "unicast_port=%d\n", channels[curr_channel].unicast_port); fprintf ( config_file, "pids="); for (curr_pid = 0; curr_pid < channels[curr_channel].num_pids; curr_pid++) fprintf ( config_file, "%d ", channels[curr_channel].pids[curr_pid]); fprintf ( config_file, "\n"); } fprintf ( config_file, "#End of config file\n"); fclose (config_file); } typedef struct ca_sys_id_t { int beginning; int end; //if == 0 equivalent to have end=beginning char descr[128]; }ca_sys_id_t; //updated 2010 06 12 ca_sys_id_t casysids[]={ {0x01,0, "IPDC SPP (TS 102 474) Annex A "}, {0x02,0, "IPDC SPP (TS 102 474) Annex B"}, {0x04,0, "OMA DRM Content Format"}, {0x05,0, "OMA BCAST 1.0"}, {0x06,0, "OMA BCAST 1.0 (U)SIM"}, {0x07,0, "Reserved for Open IPTV Forum"}, {0x00,0xFF, "Standardized systems"}, {0x0100,0x01ff, "Canal Plus"}, {0x0200,0x02ff, "CCETT"}, {0x0300,0x03ff, "Kabel Deutschland"}, {0x0400,0x04ff, "Eurodec"}, {0x0500,0x05ff, "France Telecom"}, {0x0600,0x06ff, "Irdeto"}, {0x0700,0x07ff, "Jerrold/GI/Motorola"}, {0x0800,0x08ff, "Matra Communication"}, {0x0900,0x09ff, "News Datacom"}, {0x0A00,0x0Aff, "Nokia"}, {0x0B00,0x0Bff, "Norwegian Telekom"}, {0x0C00,0x0Cff, "NTL"}, {0x0D00,0x0Dff, "CrytoWorks (Irdeto)"}, {0x0E00,0x0Eff, "Scientific Atlanta"}, {0x0F00,0x0Fff, "Sony"}, {0x1000,0x10ff, "Tandberg Television"}, {0x1100,0x11ff, "Thomson"}, {0x1200,0x12ff, "TV/Com"}, {0x1300,0x13ff, "HPT - Croatian Post and Telecommunications"}, {0x1400,0x14ff, "HRT - Croatian Radio and Television"}, {0x1500,0x15ff, "IBM"}, {0x1600,0x16ff, "Nera"}, {0x1700,0x17ff, "BetaTechnik"}, {0x1800,0x18ff, "Kudelski SA"}, {0x1900,0x19ff, "Titan Information Systems"}, {0x2000,0x20ff, "Telefonica Servicios Audiovisuales"}, {0x2100,0x21ff, "STENTOR (France Telecom, CNES and DGA)"}, {0x2200,0x22ff, "Scopus Network Technologies"}, {0x2300,0x23ff, "BARCO AS"}, {0x2400,0x24ff, "StarGuide Digital Networks"}, {0x2500,0x25ff, "Mentor Data System, Inc."}, {0x2600,0x26ff, "European Broadcasting Union"}, {0x2700 ,0x270F , "PolyCipher (NGNA, LLC)"}, {0x4347 ,0 , "Crypton"}, {0x4700 ,0x47FF , "General Instrument (Motorola)"}, {0x4800 ,0x48FF , "Telemann"}, {0x4900 ,0x49FF , "CrytoWorks (China) (Irdeto)"}, {0x4A10 ,0x4A1F , "Easycas"}, {0x4A20 ,0x4A2F , "AlphaCrypt"}, {0x4A30 ,0x4A3F , "DVN Holdings"}, {0x4A40 ,0x4A4F , "Shanghai Advanced Digital Technology Co. Ltd. (ADT)"}, {0x4A50 ,0x4A5F , "Shenzhen Kingsky Company (China) Ltd."}, {0x4A60 ,0x4A6F , "@Sky"}, {0x4A70 ,0x4A7F , "Dreamcrypt"}, {0x4A80 ,0x4A8F , "THALESCrypt"}, {0x4A90 ,0x4A9F , "Runcom Technologies"}, {0x4AA0 ,0x4AAF , "SIDSA"}, {0x4AB0 ,0x4ABF , "Beijing Compunicate Technology Inc."}, {0x4AC0 ,0x4ACF , "Latens Systems Ltd"}, {0x4AD0 ,0x4AD1 , "XCrypt Inc."}, {0x4AD2 ,0x4AD3 , "Beijing Digital Video Technology Co., Ltd."}, {0x4AD4 ,0x4AD5 , "Widevine Technologies, Inc."}, {0x4AD6 ,0x4AD7 , "SK Telecom Co., Ltd."}, {0x4AD8 ,0x4AD9 , "Enigma Systems"}, {0x4ADA ,0 , "Wyplay SAS"}, {0x4ADB ,0 , "Jinan Taixin Electronics, Co., Ltd."}, {0x4ADC ,0 , "LogiWays"}, {0x4ADD ,0 , "ATSC System Renewability Message (SRM)"}, {0x4ADE ,0 , "CerberCrypt"}, {0x4ADF ,0 , "Caston Co., Ltd."}, {0x4AE0 ,0x4AE1 , "Digi Raum Electronics Co. Ltd."}, {0x4AE2 ,0x4AE3 , "Microsoft Corp."}, {0x4AE4 ,0 , "Coretrust, Inc."}, {0x4AE5 ,0 , "IK SATPROF"}, {0x4AE6 ,0 , "SypherMedia International"}, {0x4AE7 ,0 , "Guangzhou Ewider Technology Corporation Limited"}, {0x4AE8 ,0 , "FG DIGITAL Ltd."}, {0x4AE9 ,0 , "Dreamer-i Co., Ltd."}, {0x4AEA ,0 , "Cryptoguard AB"}, {0x4AEB ,0 , "Abel DRM Systems AS"}, {0x4AEC ,0 , "FTS DVL SRL"}, {0x4AED ,0 , "Unitend Technologies, Inc."}, {0x4AEE ,0 , "Deltacom Electronics OOD"}, {0x4AEF ,0 , "NetUP Inc."}, {0x4AF0 ,0 , "Beijing Alliance Broadcast Vision Technology Co., Ltd."}, {0x4AF1 ,0 , "China DTV Media Inc., Ltd. #1"}, {0x4AF2 ,0 , "China DTV Media Inc., Ltd. #2"}, {0x4AF3 ,0 , "Baustem Information Technologies, Ltd."}, {0x4AF4 ,0 , "Marlin Developer Community, LLC"}, {0x4AF5 ,0 , "SecureMedia"}, {0x4AF6 ,0 , "Tongfang CAS"}, {0x4AF7 ,0 , "MSA"}, {0x4AF8 ,0 , "Griffin CAS"}, {0x4AF9 ,0x4AFA , "Beijing Topreal Technologies Co., Ltd"}, {0x4AFB ,0 , "NST"}, {0x4AFC ,0 , "Panaccess Systems GmbH"}, {0x4B00 ,0x4B02 , "Tongfang CAS"}, {0x4B03 ,0 , "DuoCrypt"}, {0x4B04 ,0 , "Great Wall CAS"}, {0x4B05 ,0x4B06 , "DIGICAP"}, {0x4B07 ,0 , "Wuhan Reikost Technology Co., Ltd."}, {0x4B08 ,0 , "Philips"}, {0x4B09 ,0 , "Ambernetas"}, {0x4B0A ,0x4B0B , "Beijing Sumavision Technologies CO. LTD."}, {0x4B0C ,0x4B0F , "Sichuan changhong electric co.,ltd."}, {0x5347 ,0 , "GkWare e.K."}, {0x5601 ,0 , "Verimatrix, Inc. #1"}, {0x5602 ,0 , "Verimatrix, Inc. #2"}, {0x5603 ,0 , "Verimatrix, Inc. #3"}, {0x5604 ,0 , "Verimatrix, Inc. #4"}, {0x5605 ,0x5606 , "Sichuan Juizhou Electronic Co. Ltd"}, {0x5607 ,0x5608 , "Viewscenes"}, {0x7BE0 ,0x7BE1 , "OOO"}, {0xAA00 ,0 , "Best CAS Ltd"}, }; int num_casysids=105; /** @brief Display the ca system id according to ETR 162 * * @param id the id to display */ char *ca_sys_id_to_str(int id) { //cf ETR 162 and http://www.dvbservices.com/identifiers/ca_system_id for(int i=0;i= id)) return casysids[i].descr; } return "UNKNOWN, please report"; } /** @brief Convert the service type to str according to EN 300 468 v1.10.1 table 81 * * @param type the type to display * @param dest : the destination string */ char *service_type_to_str(int type) { if(type>=0x80 && type<=0xFE) return "User defined"; switch(type) { case 0x01: return "Television"; case 0x02: return "Radio"; case 0x03: return "Teletext"; case 0x04: return "NVOD Reference service"; case 0x05: return "NVOD Time shifted service"; case 0x06: return "Mosaic service"; case 0x0a: return "Advanced codec Radio"; case 0x0b: return "Advanced codec mosaic"; case 0x0c: return "Data broadcast service"; case 0x0d: return "Reserved for common interface usage"; case 0x0e: return "RCS Map"; case 0x0f: return "RCS FLS"; case 0x10: return "DVB MHP (multimedia home platform)"; case 0x11: return "Television MPEG2-HD"; case 0x16: return "Advanced codec SD Television"; case 0x17: return "Advanced codec SD NVOD Time shifted service"; case 0x18: return "Advanced codec SD NVOD Reference service"; case 0x19: return "Advanced codec HD Television"; case 0x1a: return "Advanced codec HD NVOD Time shifted service"; case 0x1b: return "Advanced codec HD NVOD Reference service"; default: return "Please report : Unknown service type doc : EN 300 468 v1.10.1 table 81"; } } /** @brief Convert the service type to str according to EN 300 468 v1.10.1 table 81 * * @param type the type to display * @param dest : the destination string */ char *simple_service_type_to_str(int type) { if(type>=0x80 && type<=0xFE) return "User defined"; switch(type) { case 0x01: case 0x11: case 0x16: case 0x19: return "Television"; case 0x02: case 0x0a: return "Radio"; default: return ""; } } /** @brief Display the service type according to EN 300 468 v1.10.1 table 81 * * @param type the type to display * @param loglevel : the loglevel for displaying it */ void display_service_type(int type, int loglevel, char *log_module) { log_message( log_module, loglevel, "service type: 0x%x : %s \n", type, service_type_to_str(type)); } /** @brief Write the PID type into a string * * @param dest : the destination string * @param type the type to display */ char *pid_type_to_str(int type) { switch(type) { case PID_PMT: return "PMT"; case PID_PCR: return "PCR"; case PID_VIDEO_MPEG1: return "Video (MPEG1)"; case PID_VIDEO_MPEG2: return "Video (MPEG2)"; case PID_VIDEO_MPEG4_ASP: return "Video (MPEG4-ASP)"; case PID_VIDEO_MPEG4_AVC: return "Video (MPEG4-AVC)"; case PID_AUDIO_MPEG1: return "Audio (MPEG1)"; case PID_AUDIO_MPEG2: return "Audio (MPEG2)"; case PID_AUDIO_AAC_LATM: return "Audio (AAC-LATM)"; case PID_AUDIO_AAC_ADTS: return "Audio (AAC-ADTS)"; case PID_AUDIO_ATSC: return "Audio (ATSC A/53B)"; case PID_AUDIO_AC3: return "Audio (AC3)"; case PID_AUDIO_EAC3: return "Audio (E-AC3)"; case PID_AUDIO_DTS: return "Audio (DTS)"; case PID_AUDIO_AAC: return "Audio (AAC)"; case PID_EXTRA_VBIDATA: return "VBI Data"; case PID_EXTRA_VBITELETEXT: return "VBI Teletext"; case PID_EXTRA_TELETEXT: return "Teletext"; case PID_EXTRA_SUBTITLE: return "Subtitling"; case PID_UNKNOW: default: return "Unknown"; } } #ifdef ENABLE_CAM_SUPPORT /** @brief Write the error from the libdvben50221 into a string * * @param dest : the destination string * @param error the error to display */ char *liben50221_error_to_str(int error) { switch(error) { case 0: return "EN50221ERR_NONE"; case EN50221ERR_CAREAD: return "EN50221ERR_CAREAD"; case EN50221ERR_CAWRITE: return "EN50221ERR_CAWRITE"; case EN50221ERR_TIMEOUT: return "EN50221ERR_TIMEOUT"; case EN50221ERR_BADSLOTID: return "EN50221ERR_BADSLOTID"; case EN50221ERR_BADCONNECTIONID: return "EN50221ERR_BADCONNECTIONID"; case EN50221ERR_BADSTATE: return "EN50221ERR_BADSTATE"; case EN50221ERR_BADCAMDATA: return "EN50221ERR_BADCAMDATA"; case EN50221ERR_OUTOFMEMORY: return "EN50221ERR_OUTOFMEMORY"; case EN50221ERR_ASNENCODE: return "EN50221ERR_ASNENCODE"; case EN50221ERR_OUTOFCONNECTIONS: return "EN50221ERR_OUTOFCONNECTIONS"; case EN50221ERR_OUTOFSLOTS: return "EN50221ERR_OUTOFSLOTS"; case EN50221ERR_IOVLIMIT: return "EN50221ERR_IOVLIMIT"; case EN50221ERR_BADSESSIONNUMBER: return "EN50221ERR_BADSESSIONNUMBER"; case EN50221ERR_OUTOFSESSIONS: return "EN50221ERR_OUTOFSESSIONS"; default: return "UNKNOWN"; } } /** @brief Write the error from the libdvben50221 into a string containing the description of the error * * @param dest : the destination string * @param error the error to display */ char *liben50221_error_to_str_descr(int error) { switch(error) { case 0: return "No Error."; case EN50221ERR_CAREAD: return "error during read from CA device."; case EN50221ERR_CAWRITE: return "error during write to CA device."; case EN50221ERR_TIMEOUT: return "timeout occured waiting for a response from a device."; case EN50221ERR_BADSLOTID: return "bad slot ID supplied by user - the offending slot_id will not be set."; case EN50221ERR_BADCONNECTIONID: return "bad connection ID supplied by user."; case EN50221ERR_BADSTATE: return "slot/connection in the wrong state."; case EN50221ERR_BADCAMDATA: return "CAM supplied an invalid request."; case EN50221ERR_OUTOFMEMORY: return "memory allocation failed."; case EN50221ERR_ASNENCODE: return "ASN.1 encode failure - indicates library bug."; case EN50221ERR_OUTOFCONNECTIONS: return "no more connections available."; case EN50221ERR_OUTOFSLOTS: return "no more slots available - the offending slot_id will not be set."; case EN50221ERR_IOVLIMIT: return "Too many struct iovecs were used."; case EN50221ERR_BADSESSIONNUMBER: return "Bad session number suppplied by user."; case EN50221ERR_OUTOFSESSIONS: return "no more sessions available."; default: return "Unknown error, please contact"; } } #endif /** @brief : display mumudvb info*/ void print_info () { fprintf (stderr, "MuMuDVB Version " VERSION "\n --- Build information ---\n" #ifdef ENABLE_CAM_SUPPORT "Built with CAM support.\n" #else "Built without CAM support.\n" #endif #ifdef ENABLE_TRANSCODING "Built with transcoding support.\n" #else "Built without transcoding support.\n" #endif #ifdef ATSC "Built with ATSC support.\n" #ifdef HAVE_LIBUCSI "Built with ATSC long channel names support.\n" #endif #endif #if DVB_API_VERSION >= 5 "Built with support for DVB API Version 5.\n" #ifdef SYS_DVBT2 "\tBuilt with support for DVB-T2.\n" #endif #endif "---------\n" "Originally based on dvbstream 0.6 by (C) Dave Chapman 2001-2004\n" "Released under the GPL.\n" "Latest version available from http://mumudvb.braice.net/\n" "Project from the cr@ns (http://www.crans.org)\n" "by Brice DUBOST (mumudvb@braice.net)\n\n"); } /** @brief : display mumudvb usage*/ void usage (char *name) { fprintf (stderr, "MuMuDVB is a program who can redistribute stream from DVB on a network, in multicast or in http unicast.\n" "It's main feature is to take a whole transponder and put each channel on a different multicast IP.\n\n" "Usage: %s [options] \n" "-c, --config : Config file\n" "-s, --signal : Display signal power\n" "-t, --traffic : Display channels traffic\n" "-l, --list-cards : List the DVB cards and exit\n" "--card : The DVB card to use (overrided by the configuration file)\n" "--server_id : The server id (for autoconfiguration, overrided by the configuration file)\n" "-d, --debug : Don't deamonize\n" "-v : More verbose\n" "-q : Less verbose\n" "--dumpfile : Debug option : Dump the stream into the specified file\n" "-h, --help : Help\n" "\n", name); print_info (); } void show_traffic( char *log_module, double now, int show_traffic_interval, mumudvb_chan_and_pids_t *chan_and_pids) { static long show_traffic_time=0; if(!show_traffic_time) show_traffic_time=now; if((now-show_traffic_time)>=show_traffic_interval) { show_traffic_time=now; for (int curr_channel = 0; curr_channel < chan_and_pids->number_of_channels; curr_channel++) { log_message( log_module, MSG_INFO, "Traffic : %.2f kb/s \t for channel \"%s\"\n", chan_and_pids->channels[curr_channel].traffic*8, chan_and_pids->channels[curr_channel].name); } } } mumudvb-1.7.1/src/log.h000066400000000000000000000076661177353207000147440ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * * (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _LOG_H #define _LOG_H #include "mumudvb.h" enum { MSG_ERROR=-2, MSG_WARN, MSG_INFO, MSG_DETAIL, MSG_DEBUG, MSG_FLOOD }; typedef struct stats_infos_t{ //statistics for the big buffer /** */ int stats_num_packets_received; /** */ int stats_num_reads; /** */ int show_buffer_stats; /** */ double show_buffer_stats_time; /** How often we how the statistics about the DVR buffer*/ int show_buffer_stats_interval; //statistics for the traffic /** do we periodically show the traffic ?*/ int show_traffic; /** last time we show the traffic */ long show_traffic_time; /** last time we computed the traffic */ double compute_traffic_time; /** The interval for the traffic display */ int show_traffic_interval; /** The interval for the traffic calculation */ int compute_traffic_interval; /** The number of packets per second (PMT excluded) for going to the UP state */ int up_threshold; /** The number of packets per second (PMT excluded) for going to the DOWN state */ int down_threshold; /** Do we display the number of packets per second to debug up/down detection ? */ int debug_updown; }stats_infos_t; #define LOGGING_UNDEFINED 0 #define LOGGING_CONSOLE 1 #define LOGGING_SYSLOG 2 #define LOGGING_FILE 4 #define DEFAULT_LOG_HEADER "%priority: %module " typedef struct log_params_t{ /** the verbosity level for log messages */ int verbosity; /**say if we log to the console, syslog*/ int log_type; /** Says if syslog is initialised */ int syslog_initialised; /**Say if the logging file could be rotated*/ int rotating_log_file; /** The logging file */ FILE *log_file; /** The logging file path */ char *log_file_path; /** The header with templates for the log messages*/ char *log_header; /** Flushing interval */ float log_flush_interval; }log_params_t; void print_info (); void usage (char *name); void log_message( char* log_module, int , const char *, ... ); void gen_file_streamed_channels (char *nom_fich_chaines_diff, char *nom_fich_chaines_non_diff, int nb_flux, mumudvb_channel_t *channels); void log_streamed_channels(char *log_module,int number_of_channels, mumudvb_channel_t *channels, int multicast_ipv4, int multicast_ipv6, int unicast, int unicast_master_port, char *unicastipOut); void gen_config_file_header(char *orig_conf_filename, char *saving_filename); void gen_config_file(int number_of_channels, mumudvb_channel_t *channels, char *saving_filename); char *ca_sys_id_to_str(int id); void display_service_type(int type, int loglevel,char *log_module); char *pid_type_to_str(int type); char *service_type_to_str(int type); char *simple_service_type_to_str(int type); void show_traffic(char *log_module, double now, int show_traffic_interval, mumudvb_chan_and_pids_t *chan_and_pids); char *liben50221_error_to_str(int error); char *liben50221_error_to_str_descr(int error); void log_pids(char *log_module, mumudvb_channel_t *channel, int curr_channel); int read_logging_configuration(stats_infos_t *stats_infos, char *substring); void sync_logs(); #endif mumudvb-1.7.1/src/multicast.c000066400000000000000000000114001177353207000161400ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Based on dvbstream by (C) Dave Chapman 2001, 2002. * * (C) 2009 Brice DUBOST * * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /** @file * @brief File for Multicast related functions * @author Brice DUBOST * @date 2009 */ #include "mumudvb.h" #include "log.h" #include #include static char *log_module="Multicast: "; /** @brief Read a line of the configuration file to check if there is a cam parameter * * @param multicast_vars the multicast parameters * @param substring The currrent line */ int read_multicast_configuration(multicast_parameters_t *multicast_vars, mumudvb_channel_t *channels, int channel_start, int *curr_channel, char *substring) { char delimiteurs[] = CONFIG_FILE_SEPARATOR; if (!strcmp (substring, "common_port")) { if ( channel_start ) { log_message( log_module, MSG_ERROR, "You have to set common_port before the channels\n"); return -1; } substring = strtok (NULL, delimiteurs); multicast_vars->common_port = atoi (substring); } else if (!strcmp (substring, "multicast_ttl")) { substring = strtok (NULL, delimiteurs); multicast_vars->ttl = atoi (substring); } else if (!strcmp (substring, "multicast")) { substring = strtok (NULL, delimiteurs); multicast_vars->multicast = atoi (substring); } else if (!strcmp (substring, "multicast_ipv4")) { substring = strtok (NULL, delimiteurs); multicast_vars->multicast_ipv4 = atoi (substring); } else if (!strcmp (substring, "multicast_ipv6")) { substring = strtok (NULL, delimiteurs); multicast_vars->multicast_ipv6 = atoi (substring); } else if (!strcmp (substring, "multicast_auto_join")) { substring = strtok (NULL, delimiteurs); multicast_vars->auto_join = atoi (substring); } else if (!strcmp (substring, "ip")) { (*curr_channel)++; substring = strtok (NULL, delimiteurs); if(strlen(substring)>19) { log_message( log_module, MSG_ERROR, "The Ip address %s is too long.\n", substring); return -1; } sscanf (substring, "%s\n", channels[*curr_channel].ip4Out); } else if (!strcmp (substring, "ip6")) { substring = strtok (NULL, delimiteurs); if(strlen(substring)>(IPV6_CHAR_LEN-1)) { log_message( log_module, MSG_ERROR, "The Ip v6 address %s is too long.\n", substring); return -1; } sscanf (substring, "%s\n", channels[*curr_channel].ip6Out); } else if (!strcmp (substring, "port")) { if ( channel_start == 0) { log_message( log_module, MSG_ERROR, "port : You have to start a channel first (using ip= or channel_next)\n"); return -1; } substring = strtok (NULL, delimiteurs); channels[*curr_channel].portOut = atoi (substring); } else if (!strcmp (substring, "rtp_header")) { substring = strtok (NULL, delimiteurs); multicast_vars->rtp_header = atoi (substring); if (multicast_vars->rtp_header==1) log_message( log_module, MSG_INFO, "You decided to send the RTP header (multicast only).\n"); } else if (!strcmp (substring, "multicast_iface4")) { substring = strtok (NULL, delimiteurs); if(strlen(substring)>(IF_NAMESIZE)) { log_message( log_module, MSG_ERROR, "The interface name ipv4 address %s is too long.\n", substring); return -1; } sscanf (substring, "%s\n", multicast_vars->iface4); } else if (!strcmp (substring, "multicast_iface6")) { substring = strtok (NULL, delimiteurs); if(strlen(substring)>(IF_NAMESIZE)) { log_message( log_module, MSG_ERROR, "The interface name ipv6 address %s is too long.\n", substring); return -1; } sscanf (substring, "%s\n", multicast_vars->iface6); } else return 0; //Nothing concerning multicast, we return 0 to explore the other possibilities return 1;//We found something for multicast, we tell main to go for the next line } mumudvb-1.7.1/src/mumudvb.c000066400000000000000000002567461177353207000156420ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * Based on dvbstream by (C) Dave Chapman 2001, 2002. * * (C) 2004-2011 Brice DUBOST * * Code for dealing with libdvben50221 inspired from zap_ca * Copyright (C) 2004, 2005 Manu Abraham * Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net) * * Transcoding written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /** @file * @brief This file is the main file of mumudvb */ /** @mainpage Documentation for the mumudvb project * @section introduction * Mumudvb is a program that can redistribute streams from DVB on a network using * multicasting or HTTP unicast. It is able to multicast a whole DVB transponder by assigning * each channel to a different multicast IP. * * @section Main features * Stream channels from a transponder on different multicast IPs * The program can rewrite the PAT Pid in order to announce only present channels (useful for some set-top boxes) * Support for scrambled channels (if you don't have a CAM you can use sasc-ng, but check if it's allowed in you country) * Support for autoconfiguration * Generation of SAP announces *@section files * mumudvb.h header containing global information * * autoconf.c autoconf.h code related to autoconfiguration * * cam.c cam.h : code related to the support of scrambled channels * * crc32.c : the crc32 table * * dvb.c dvb.h functions related to the DVB card : oppening filters, file descriptors etc * * log.c logging functions * * pat_rewrite.c rewrite.h : the functions associated with the rewrite of the PAT pid * * sdt_rewrite.c rewrite.h : the functions associated with the rewrite of the SDT pid * * sap.c sap.h : sap announces * * ts.c ts.h : function related to the MPEG-TS parsing * * tune.c tune.h : tuning of the dvb card * * network.c network.h : networking ie openning sockets, sending packets * * unicast_http.c unicast_http.h : HTTP unicast */ #define _GNU_SOURCE //in order to use program_invocation_short_name (extension gnu) #include "config.h" // Linux includes: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mumudvb.h" #include "tune.h" #include "network.h" #include "dvb.h" #ifdef ENABLE_CAM_SUPPORT #include "cam.h" #endif #include "ts.h" #include "errors.h" #include "autoconf.h" #include "sap.h" #include "rewrite.h" #include "unicast_http.h" #include "rtp.h" #include "log.h" #ifdef ENABLE_TRANSCODING #include "transcode.h" #endif /** the table for crc32 claculations */ extern uint32_t crc32_table[256]; static char *log_module="Main: "; /* Signal handling code shamelessly copied from VDR by Klaus Schmidinger - see http://www.cadsoft.de/people/kls/vdr/index.htm */ // global variables used by SignalHandler long now; long real_start_time; int *card_tuned; int received_signal = 0; int timeout_no_diff = ALARM_TIME_TIMEOUT_NO_DIFF; // file descriptors fds_t fds; /** File descriptors associated with the card */ int no_daemon = 0; int Interrupted = 0; int write_streamed_channels=1; pthread_t signalpowerthread; pthread_t cardthread; pthread_t monitorthread; card_thread_parameters_t cardthreadparams; mumudvb_chan_and_pids_t chan_and_pids={ .number_of_channels=0, .dont_send_scrambled=0, .filter_transport_error=0, .psi_tables_filtering=PSI_TABLES_FILTERING_NONE, .check_cc=0, }; //multicast parameters multicast_parameters_t multicast_vars={ .multicast=1, .multicast_ipv6=0, .multicast_ipv4=1, .ttl=DEFAULT_TTL, .common_port = 1234, .auto_join=0, .rtp_header = 0, .iface4="\0", .iface6="\0", }; //autoconfiguration autoconf_parameters_t autoconf_vars={ .autoconfiguration=0, .autoconf_radios=0, .autoconf_scrambled=0, .autoconf_pid_update=1, .autoconf_ip4="239.100.%card.%number", .autoconf_ip6="FF15:4242::%server:%card:%number", .time_start_autoconfiguration=0, .transport_stream_id=-1, .autoconf_temp_pat=NULL, .autoconf_temp_sdt=NULL, .autoconf_temp_psip=NULL, .services=NULL, .autoconf_unicast_port="\0", .autoconf_multicast_port="\0", .num_service_id=0, .name_template="\0", }; //Parameters for rewriting rewrite_parameters_t rewrite_vars={ .rewrite_pat = OPTION_UNDEFINED, .pat_version=-1, .full_pat=NULL, .pat_needs_update=1, .full_pat_ok=0, .pat_continuity_counter=0, .rewrite_sdt = OPTION_UNDEFINED, .sdt_version=-1, .full_sdt=NULL, .sdt_needs_update=1, .full_sdt_ok=0, .sdt_continuity_counter=0, .eit_sort=OPTION_UNDEFINED, .sdt_force_eit=OPTION_UNDEFINED, }; #ifdef ENABLE_TRANSCODING /** The transcode options defined for all the channels */ transcode_options_t global_transcode_opt; #endif //logging extern log_params_t log_params; // prototypes static void SignalHandler (int signum);//below int read_multicast_configuration(multicast_parameters_t *, mumudvb_channel_t *, int, int *, char *); //in multicast.c void *monitor_func(void* arg); int mumudvb_close(monitor_parameters_t* monitor_thread_params, unicast_parameters_t* unicast_vars, int* strengththreadshutdown, void *cam_vars_v, char* filename_channels_not_streamed,char *filename_channels_streamed, char *filename_pid, int Interrupted); int main (int argc, char **argv) { //sap announces sap_parameters_t sap_vars={ .sap_messages4=NULL, .sap_messages6=NULL, .sap=OPTION_UNDEFINED, //No sap by default .sap_interval=SAP_DEFAULT_INTERVAL, .sap_sending_ip4="0.0.0.0", .sap_sending_ip6="::", .sap_default_group="", .sap_organisation="MuMuDVB", .sap_uri="\0", .sap_ttl=SAP_DEFAULT_TTL, }; //Statistics stats_infos_t stats_infos={ .stats_num_packets_received=0, .stats_num_reads=0, .show_buffer_stats=0, .show_buffer_stats_time = 0, .show_buffer_stats_interval = 120, .show_traffic = 0, .show_traffic_time = 0, .compute_traffic_time = 0, .show_traffic_interval = 10, .compute_traffic_interval = 10, .up_threshold = 80, .down_threshold = 30, .debug_updown = 0, }; //Parameters for HTTP unicast unicast_parameters_t unicast_vars={ .unicast=0, .ipOut="0.0.0.0", .portOut=4242, .portOut_str=NULL, .consecutive_errors_timeout=UNICAST_CONSECUTIVE_ERROR_TIMEOUT, .max_clients=-1, .queue_max_size=UNICAST_DEFAULT_QUEUE_MAX, .socket_sendbuf_size=0, .flush_on_eagain=0, }; //tuning parameters tuning_parameters_t tuneparams={ .card = 0, .tuner = 0, .card_dev_path="", .card_tuned = 0, .tuning_timeout = ALARM_TIME_TIMEOUT, .freq = 0, .srate = 0, .pol = 0, .lnb_voltage_off=0, .lnb_type=LNB_UNIVERSAL, .lnb_lof_standard=DEFAULT_LOF_STANDARD, .lnb_slof=DEFAULT_SLOF, .lnb_lof_low=DEFAULT_LOF1_UNIVERSAL, .lnb_lof_high=DEFAULT_LOF2_UNIVERSAL, .sat_number = 0, .switch_type = 'C', .modulation_set = 0, .display_strenght = 0, .check_status = 1, .strengththreadshutdown = 0, .HP_CodeRate = HP_CODERATE_DEFAULT,//cf tune.h .LP_CodeRate = LP_CODERATE_DEFAULT, .TransmissionMode = TRANSMISSION_MODE_DEFAULT, .guardInterval = GUARD_INTERVAL_DEFAULT, .bandwidth = BANDWIDTH_DEFAULT, .hier = HIERARCHY_DEFAULT, .fe_type=FE_QPSK, //sat by default #if DVB_API_VERSION >= 5 .delivery_system=SYS_UNDEFINED, .rolloff=ROLLOFF_35, #endif }; card_tuned=&tuneparams.card_tuned; #ifdef ENABLE_CAM_SUPPORT //CAM (Conditionnal Access Modules : for scrambled channels) cam_parameters_t cam_vars={ .cam_support = 0, .cam_number=0, .cam_reask_interval=0, .need_reset=0, .reset_counts=0, .reset_interval=CAM_DEFAULT_RESET_INTERVAL, .timeout_no_cam_init=CAM_DEFAULT_RESET_INTERVAL, .max_reset_number=CAM_DEFAULT_MAX_RESET_NUM, .tl=NULL, .sl=NULL, .stdcam=NULL, .ca_resource_connected=0, .mmi_state = MMI_STATE_CLOSED, .ca_info_ok_time=0, .cam_delay_pmt_send=0, .cam_interval_pmt_send=3, .cam_pmt_send_time=0, .cam_mmi_autoresponse=1, .cam_pmt_follow=1, .cam_menulist_str = EMPTY_STRING, .cam_menu_string = EMPTY_STRING, }; mumu_string_append(&cam_vars.cam_menu_string,"Not retrieved"); cam_parameters_t *cam_vars_ptr=&cam_vars; #else void *cam_vars_ptr=NULL; #endif char filename_channels_not_streamed[DEFAULT_PATH_LEN]; char filename_channels_streamed[DEFAULT_PATH_LEN]; char filename_pid[DEFAULT_PATH_LEN]=PIDFILE_PATH; char filename_gen_conf[DEFAULT_PATH_LEN]; int server_id = 0; /** The server id for the template %server */ int k,iRet,cmdlinecard; cmdlinecard=-1; //MPEG2-TS reception and sort int pid; /** pid of the current mpeg2 packet */ int ScramblingControl; int continuity_counter; /** The buffer for the card */ card_buffer_t card_buffer; memset (&card_buffer, 0, sizeof (card_buffer_t)); card_buffer.dvr_buffer_size=DEFAULT_TS_BUFFER_SIZE; card_buffer.max_thread_buffer_size=DEFAULT_THREAD_BUFFER_SIZE; /** List of mandatory pids */ uint8_t mandatory_pid[MAX_MANDATORY_PID_NUMBER]; struct timeval tv; //files char *conf_filename = NULL; FILE *conf_file; FILE *channels_diff; FILE *channels_not_streamed; #ifdef ENABLE_CAM_SUPPORT FILE *cam_info; #endif FILE *pidfile; char *dump_filename = NULL; FILE *dump_file; // configuration file parsing int curr_channel = 0; int curr_pid = 0; int send_packet=0; int channel_start = 0; char current_line[CONF_LINELEN]; char *substring=NULL; char delimiteurs[] = CONFIG_FILE_SEPARATOR; uint8_t hi_mappids[8193]; uint8_t lo_mappids[8193]; // Initialise PID map for (k = 0; k < 8193; k++) { hi_mappids[k] = (k >> 8); lo_mappids[k] = (k & 0xff); } /******************************************************/ //Getopt /******************************************************/ const char short_options[] = "c:sdthvql"; const struct option long_options[] = { {"config", required_argument, NULL, 'c'}, {"signal", no_argument, NULL, 's'}, {"traffic", no_argument, NULL, 't'}, {"server_id", required_argument, NULL, 'i'}, {"debug", no_argument, NULL, 'd'}, {"help", no_argument, NULL, 'h'}, {"list-cards", no_argument, NULL, 'l'}, {"card", required_argument, NULL, 'a'}, {"dumpfile", required_argument, NULL, 'z'}, {0, 0, 0, 0} }; int c, option_index = 0; if (argc == 1) { usage (program_invocation_short_name); exit(ERROR_ARGS); } while (1) { c = getopt_long (argc, argv, short_options, long_options, &option_index); if (c == -1) { break; } switch (c) { case 'c': conf_filename = (char *) malloc (strlen (optarg) + 1); if (!conf_filename) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); exit(ERROR_MEMORY); } strncpy (conf_filename, optarg, strlen (optarg) + 1); break; case 'a': cmdlinecard=atoi(optarg); break; case 's': tuneparams.display_strenght = 1; break; case 'i': server_id = atoi(optarg); break; case 't': stats_infos.show_traffic = 1; break; case 'd': no_daemon = 1; break; case 'v': log_params.verbosity++; break; case 'q': log_params.verbosity--; break; case 'h': usage (program_invocation_short_name); exit(ERROR_ARGS); break; case 'l': print_info (); list_dvb_cards (); exit(0); break; case 'z': dump_filename = (char *) malloc (strlen (optarg) + 1); if (!dump_filename) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); exit(ERROR_MEMORY); } strncpy (dump_filename, optarg, strlen (optarg) + 1); log_message( log_module, MSG_WARN,"You've decided to dump the received stream into %s. Be warned, it can grow quite fast", dump_filename); break; } } if (optind < argc) { usage (program_invocation_short_name); exit(ERROR_ARGS); } /******************************************************/ //end of command line options parsing /******************************************************/ // DO NOT REMOVE (make mumudvb a deamon) if(!no_daemon) if(daemon(42,0)) { log_message( log_module, MSG_WARN, "Cannot daemonize: %s\n", strerror (errno)); exit(666); //FIXME : use an error } //If the user didn't defined a prefered logging way, and we daemonise, we set to syslog if (!no_daemon) { if(log_params.log_type==LOGGING_UNDEFINED) { openlog ("MUMUDVB", LOG_PID, 0); log_params.log_type=LOGGING_SYSLOG; log_params.syslog_initialised=1; } } //Display general information print_info (); //paranoya we clear all the content of all the channels memset (&chan_and_pids.channels, 0, sizeof (mumudvb_channel_t)*MAX_CHANNELS); /******************************************************/ // config file displaying /******************************************************/ conf_file = fopen (conf_filename, "r"); if (conf_file == NULL) { log_message( log_module, MSG_ERROR, "%s: %s\n", conf_filename, strerror (errno)); free(conf_filename); exit(ERROR_CONF_FILE); } log_message( log_module, MSG_FLOOD,"==== Configuration file ===="); int line_num=1; while (fgets (current_line, CONF_LINELEN, conf_file)) { int line_len; //We suppress the end of line line_len=strlen(current_line); if(current_line[line_len-1]=='\r' ||current_line[line_len-1]=='\n') current_line[line_len-1]=0; log_message( log_module, MSG_FLOOD,"%03d %s\n",line_num,current_line); line_num++; } log_message( log_module, MSG_FLOOD,"============ done ===========\n"); fclose (conf_file); /******************************************************/ // config file reading /******************************************************/ conf_file = fopen (conf_filename, "r"); if (conf_file == NULL) { log_message( log_module, MSG_ERROR, "%s: %s\n", conf_filename, strerror (errno)); free(conf_filename); exit(ERROR_CONF_FILE); } curr_channel=-1; int curr_channel_old=-1; // we scan config file // see doc/README_CONF* for further information int line_len; while (fgets (current_line, CONF_LINELEN, conf_file)) { //We suppress the end of line (this can disturb atoi if there is spaces at the end of the line) //Thanks to pierre gronlier pierre.gronlier at gmail.com for finding that bug line_len=strlen(current_line); if(current_line[line_len-1]=='\r' ||current_line[line_len-1]=='\n') current_line[line_len-1]=0; //Line without "=" we continue if(strstr(current_line,"=")==NULL) { //We check if it's not a channel_next line substring = strtok (current_line, delimiteurs); //If nothing in the substring we avoid the segfault in the next line if(substring == NULL) continue; if(strcmp (substring, "channel_next") ) continue; } //commentary if (current_line[0] == '#') continue; //We split the line substring = strtok (current_line, delimiteurs); //If nothing in the substring we avoid the segfault in the next line if(substring == NULL) continue; //commentary if (substring[0] == '#') continue; if(curr_channel<0) channel_start=0; else channel_start=1; if((iRet=read_tuning_configuration(&tuneparams, substring))) //Read the line concerning the tuning parameters { if(iRet==-1) exit(ERROR_CONF); } else if((iRet=read_autoconfiguration_configuration(&autoconf_vars, substring))) //Read the line concerning the autoconfiguration parameters { if(iRet==-1) exit(ERROR_CONF); } else if((iRet=read_sap_configuration(&sap_vars, &chan_and_pids.channels[curr_channel], channel_start, substring))) //Read the line concerning the sap parameters { if(iRet==-1) exit(ERROR_CONF); } #ifdef ENABLE_CAM_SUPPORT else if((iRet=read_cam_configuration(cam_vars_ptr, &chan_and_pids.channels[curr_channel], channel_start, substring))) //Read the line concerning the cam parameters { if(iRet==-1) exit(ERROR_CONF); } #endif else if((iRet=read_unicast_configuration(&unicast_vars, &chan_and_pids.channels[curr_channel], channel_start, substring))) //Read the line concerning the unicast parameters { if(iRet==-1) exit(ERROR_CONF); } else if((iRet=read_multicast_configuration(&multicast_vars, chan_and_pids.channels, channel_start, &curr_channel, substring))) //Read the line concerning the multicast parameters { if(iRet==-1) exit(ERROR_CONF); } else if((iRet=read_rewrite_configuration(&rewrite_vars, substring))) //Read the line concerning the rewrite parameters { if(iRet==-1) exit(ERROR_CONF); } #ifdef ENABLE_TRANSCODING else if ((transcode_read_option((curr_channel>=0)?&chan_and_pids.channels[curr_channel].transcode_options : &global_transcode_opt, delimiteurs, &substring))) { continue; } #endif else if((iRet=read_logging_configuration(&stats_infos, substring))) //Read the line concerning the logging parameters { if(iRet==-1) exit(ERROR_CONF); } else if (!strcmp (substring, "channel_next")) { curr_channel++; log_message( log_module, MSG_INFO,"channel next\n"); } else if (!strcmp (substring, "timeout_no_diff")) { substring = strtok (NULL, delimiteurs); timeout_no_diff= atoi (substring); } else if (!strcmp (substring, "dont_send_scrambled")) { substring = strtok (NULL, delimiteurs); chan_and_pids.dont_send_scrambled = atoi (substring); } else if (!strcmp (substring, "filter_transport_error")) { substring = strtok (NULL, delimiteurs); chan_and_pids.filter_transport_error = atoi (substring); } else if (!strcmp (substring, "psi_tables_filtering")) { substring = strtok (NULL, delimiteurs); if (!strcmp (substring, "pat")) chan_and_pids.psi_tables_filtering = PSI_TABLES_FILTERING_PAT_ONLY; else if (!strcmp (substring, "pat_cat")) chan_and_pids.psi_tables_filtering = PSI_TABLES_FILTERING_PAT_CAT_ONLY; else if (!strcmp (substring, "none")) chan_and_pids.psi_tables_filtering = PSI_TABLES_FILTERING_NONE; if (chan_and_pids.psi_tables_filtering == PSI_TABLES_FILTERING_PAT_ONLY) log_message( log_module, MSG_INFO, "You have enabled PSI tables filtering, only PAT will be send\n"); if (chan_and_pids.psi_tables_filtering == PSI_TABLES_FILTERING_PAT_CAT_ONLY) log_message( log_module, MSG_INFO, "You have enabled PSI tables filtering, only PAT and CAT will be send\n"); } else if (!strcmp (substring, "dvr_buffer_size")) { substring = strtok (NULL, delimiteurs); card_buffer.dvr_buffer_size = atoi (substring); if(card_buffer.dvr_buffer_size<=0) { log_message( log_module, MSG_WARN, "Warning : the buffer size MUST be >0, forced to 1 packet\n"); card_buffer.dvr_buffer_size = 1; } if(card_buffer.dvr_buffer_size>1) log_message( log_module, MSG_WARN, "Warning : You set a buffer size > 1, this feature is experimental, please report bugs/problems or results\n"); stats_infos.show_buffer_stats=1; } else if (!strcmp (substring, "dvr_thread")) { substring = strtok (NULL, delimiteurs); card_buffer.threaded_read = atoi (substring); if(card_buffer.threaded_read) { log_message( log_module, MSG_WARN, "Warning : You want to use a thread for reading the card, this feature is experimental, please report bugs/problems or results\n"); } } else if (!strcmp (substring, "dvr_thread_buffer_size")) { substring = strtok (NULL, delimiteurs); card_buffer.max_thread_buffer_size = atoi (substring); } else if ((!strcmp (substring, "service_id")) || (!strcmp (substring, "ts_id"))) { if(!strcmp (substring, "ts_id")) log_message( log_module, MSG_WARN, "Warning : the option ts_id is deprecated, use service_id instead.\n"); if ( channel_start == 0) { log_message( log_module, MSG_ERROR, "service_id : You have to start a channel first (using ip= or channel_next)\n"); exit(ERROR_CONF); } substring = strtok (NULL, delimiteurs); chan_and_pids.channels[curr_channel].service_id = atoi (substring); } else if (!strcmp (substring, "pids")) { curr_pid = 0; if ( channel_start == 0) { log_message( log_module, MSG_ERROR, "pids : You have to start a channel first (using ip= or channel_next)\n"); exit(ERROR_CONF); } if (multicast_vars.common_port!=0 && chan_and_pids.channels[curr_channel].portOut == 0) chan_and_pids.channels[curr_channel].portOut = multicast_vars.common_port; while ((substring = strtok (NULL, delimiteurs)) != NULL) { chan_and_pids.channels[curr_channel].pids[curr_pid] = atoi (substring); // we see if the given pid is good if (chan_and_pids.channels[curr_channel].pids[curr_pid] < 10 || chan_and_pids.channels[curr_channel].pids[curr_pid] >= 8193) { log_message( log_module, MSG_ERROR, "Config issue : %s in pids, given pid : %d\n", conf_filename, chan_and_pids.channels[curr_channel].pids[curr_pid]); exit(ERROR_CONF); } curr_pid++; if (curr_pid >= MAX_PIDS_PAR_CHAINE) { log_message( log_module, MSG_ERROR, "Too many pids : %d channel : %d\n", curr_pid, curr_channel); exit(ERROR_CONF); } } chan_and_pids.channels[curr_channel].num_pids = curr_pid; } else if (!strcmp (substring, "name")) { if ( channel_start == 0) { log_message( log_module, MSG_ERROR, "name : You have to start a channel first (using ip= or channel_next)\n"); exit(ERROR_CONF); } // other substring extraction method in order to keep spaces substring = strtok (NULL, "="); if (!(strlen (substring) >= MAX_NAME_LEN - 1)) strcpy(chan_and_pids.channels[curr_channel].name,strtok(substring,"\n")); else { log_message( log_module, MSG_WARN,"Channel name too long\n"); strncpy(chan_and_pids.channels[curr_channel].name,strtok(substring,"\n"),MAX_NAME_LEN-1); chan_and_pids.channels[curr_channel].name[MAX_NAME_LEN-1]='\0'; } } else if (!strcmp (substring, "server_id")) { substring = strtok (NULL, delimiteurs); server_id = atoi (substring); } else if (!strcmp (substring, "filename_pid")) { substring = strtok (NULL, delimiteurs); if(strlen(substring)>=DEFAULT_PATH_LEN) { log_message(log_module,MSG_WARN,"filename_pid too long \n"); } else strcpy(filename_pid,substring); } else if (!strcmp (substring, "check_cc")) { substring = strtok (NULL, delimiteurs); chan_and_pids.check_cc = atoi (substring); } else { if(strlen (current_line) > 1) log_message( log_module, MSG_WARN, "Config issue : unknow symbol : %s\n\n", substring); continue; } if (curr_channel > MAX_CHANNELS) { log_message( log_module, MSG_ERROR, "Too many channels : %d limit : %d\n", curr_channel, MAX_CHANNELS); exit(ERROR_TOO_CHANNELS); } //A new channel have been defined if(curr_channel_old != curr_channel) { curr_channel_old = curr_channel; #ifdef ENABLE_TRANSCODING //We copy the common transcode options to the new channel transcode_copy_options(&global_transcode_opt,&chan_and_pids.channels[curr_channel].transcode_options); #endif } } fclose (conf_file); //Autoconfiguration full is the simple mode for autoconfiguration, we set other option by default if(autoconf_vars.autoconfiguration==AUTOCONF_MODE_FULL) { if((sap_vars.sap == OPTION_UNDEFINED) && (multicast_vars.multicast)) { log_message( log_module, MSG_INFO, "Full autoconfiguration, we activate SAP announces. if you want to deactivate them see the README.\n"); sap_vars.sap=OPTION_ON; } if(rewrite_vars.rewrite_pat == OPTION_UNDEFINED) { rewrite_vars.rewrite_pat=OPTION_ON; log_message( log_module, MSG_INFO, "Full autoconfiguration, we activate PAT rewritting. if you want to deactivate it see the README.\n"); } if(rewrite_vars.rewrite_sdt == OPTION_UNDEFINED) { rewrite_vars.rewrite_sdt=OPTION_ON; log_message( log_module, MSG_INFO, "Full autoconfiguration, we activate SDT rewritting. if you want to deactivate it see the README.\n"); } if(rewrite_vars.eit_sort == OPTION_UNDEFINED) { rewrite_vars.eit_sort=OPTION_ON; log_message( log_module, MSG_INFO, "Full autoconfiguration, we activate sorting of the EIT PID. if you want to deactivate it see the README.\n"); } } if(card_buffer.max_thread_buffer_size 1? 's':' '); /******************************************************/ // Monitor Thread /******************************************************/ monitor_parameters_t monitor_thread_params ={ .threadshutdown=0, .wait_time=10, .autoconf_vars=&autoconf_vars, .sap_vars=&sap_vars, .chan_and_pids=&chan_and_pids, .multicast_vars=&multicast_vars, .unicast_vars=&unicast_vars, .tuneparams=&tuneparams, .stats_infos=&stats_infos, .server_id=server_id, .filename_channels_not_streamed=filename_channels_not_streamed, .filename_channels_streamed=filename_channels_streamed, }; pthread_create(&(monitorthread), NULL, monitor_func, &monitor_thread_params); /*****************************************************/ //cam_support /*****************************************************/ #ifdef ENABLE_CAM_SUPPORT if(cam_vars.cam_support){ //We initialise the cam. If fail, we remove cam support if(cam_start(cam_vars_ptr,tuneparams.card)) { log_message("CAM: ", MSG_ERROR,"Cannot initalise cam\n"); cam_vars.cam_support=0; } else { //If the cam is properly initialised, we autoconfigure scrambled channels autoconf_vars.autoconf_scrambled=1; } for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { //We allocate the packet for storing the PMT for CAM purposes if(chan_and_pids.channels[curr_channel].cam_pmt_packet==NULL) { chan_and_pids.channels[curr_channel].cam_pmt_packet=malloc(sizeof(mumudvb_ts_packet_t)); if(chan_and_pids.channels[curr_channel].cam_pmt_packet==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; goto mumudvb_close_goto; } memset (chan_and_pids.channels[curr_channel].cam_pmt_packet, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&chan_and_pids.channels[curr_channel].cam_pmt_packet->packetmutex,NULL); } } } #endif /*****************************************************/ //autoconfiguration //memory allocation for MPEG2-TS //packet structures /*****************************************************/ iRet=autoconf_init(&autoconf_vars, chan_and_pids.channels,chan_and_pids.number_of_channels); if(iRet) { Interrupted=ERROR_GENERIC<<8; goto mumudvb_close_goto; } /*****************************************************/ //Pat rewriting //memory allocation for MPEG2-TS //packet structures /*****************************************************/ if(rewrite_vars.rewrite_pat == OPTION_ON) { for (curr_channel = 0; curr_channel < MAX_CHANNELS; curr_channel++) chan_and_pids.channels[curr_channel].generated_pat_version=-1; rewrite_vars.full_pat=malloc(sizeof(mumudvb_ts_packet_t)); if(rewrite_vars.full_pat==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; goto mumudvb_close_goto; } memset (rewrite_vars.full_pat, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&rewrite_vars.full_pat->packetmutex,NULL); } /*****************************************************/ //SDT rewriting //memory allocation for MPEG2-TS //packet structures /*****************************************************/ if(rewrite_vars.rewrite_sdt == OPTION_ON) { for (curr_channel = 0; curr_channel < MAX_CHANNELS; curr_channel++) chan_and_pids.channels[curr_channel].generated_sdt_version=-1; rewrite_vars.full_sdt=malloc(sizeof(mumudvb_ts_packet_t)); if(rewrite_vars.full_sdt==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; goto mumudvb_close_goto; } memset (rewrite_vars.full_sdt, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&rewrite_vars.full_sdt->packetmutex,NULL); } /*****************************************************/ //Some initialisations /*****************************************************/ //Initialisation of the channels for RTP if(multicast_vars.rtp_header) for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) init_rtp_header(&chan_and_pids.channels[curr_channel]); // initialisation of active channels list for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { chan_and_pids.channels[curr_channel].num_packet = 0; chan_and_pids.channels[curr_channel].streamed_channel = 1; chan_and_pids.channels[curr_channel].num_scrambled_packets = 0; chan_and_pids.channels[curr_channel].scrambled_channel = 0; //We alloc the channel pmt_packet (useful for autoconf and cam) /** @todo : allocate only if autoconf */ if(chan_and_pids.channels[curr_channel].pmt_packet==NULL) { chan_and_pids.channels[curr_channel].pmt_packet=malloc(sizeof(mumudvb_ts_packet_t)); if(chan_and_pids.channels[curr_channel].pmt_packet==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; goto mumudvb_close_goto; } memset (chan_and_pids.channels[curr_channel].pmt_packet, 0, sizeof( mumudvb_ts_packet_t));//we clear it pthread_mutex_init(&chan_and_pids.channels[curr_channel].pmt_packet->packetmutex,NULL); } } //We initialise asked pid table memset (chan_and_pids.asked_pid, 0, sizeof( uint8_t)*8193);//we clear it memset (chan_and_pids.number_chan_asked_pid, 0, sizeof( uint8_t)*8193);//we clear it // We initialize the table for checking the TS discontinuities for (curr_pid = 0; curr_pid < 8193; curr_pid++) chan_and_pids.continuity_counter_pid[curr_pid]=-1; //We initialise mandatory pid table memset (mandatory_pid, 0, sizeof( uint8_t)*MAX_MANDATORY_PID_NUMBER);//we clear it //mandatory pids (always sent with all channels) //PAT : Program Association Table mandatory_pid[0]=1; chan_and_pids.asked_pid[0]=PID_ASKED; //CAT : Conditional Access Table mandatory_pid[1]=1; chan_and_pids.asked_pid[1]=PID_ASKED; //NIT : Network Information Table //It is intended to provide information about the physical network. mandatory_pid[16]=1; chan_and_pids.asked_pid[16]=PID_ASKED; //SDT : Service Description Table //the SDT contains data describing the services in the system e.g. names of services, the service provider, etc. mandatory_pid[17]=1; chan_and_pids.asked_pid[17]=PID_ASKED; //EIT : Event Information Table //the EIT contains data concerning events or programmes such as event name, start time, duration, etc. mandatory_pid[18]=1; chan_and_pids.asked_pid[18]=PID_ASKED; //TDT : Time and Date Table //the TDT gives information relating to the present time and date. //This information is given in a separate table due to the frequent updating of this information. mandatory_pid[20]=1; chan_and_pids.asked_pid[20]=PID_ASKED; //PSIP : Program and System Information Protocol //Specific to ATSC, this is more or less the equivalent of sdt plus other stuff if(tuneparams.fe_type==FE_ATSC) chan_and_pids.asked_pid[PSIP_PID]=PID_ASKED; /*****************************************************/ //We open the file descriptors and //Set the filters /*****************************************************/ //We fill the asked_pid array for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { for (curr_pid = 0; curr_pid < chan_and_pids.channels[curr_channel].num_pids; curr_pid++) { if(chan_and_pids.asked_pid[chan_and_pids.channels[curr_channel].pids[curr_pid]]==PID_NOT_ASKED) chan_and_pids.asked_pid[chan_and_pids.channels[curr_channel].pids[curr_pid]]=PID_ASKED; chan_and_pids.number_chan_asked_pid[chan_and_pids.channels[curr_channel].pids[curr_pid]]++; } } // we open the file descriptors if (create_card_fd (tuneparams.card_dev_path, tuneparams.tuner, chan_and_pids.asked_pid, &fds) < 0) { Interrupted=ERROR_GENERIC<<8; goto mumudvb_close_goto; } set_filters(chan_and_pids.asked_pid, &fds); fds.pfds=NULL; fds.pfdsnum=1; //+1 for closing the pfd list, see man poll fds.pfds=realloc(fds.pfds,(fds.pfdsnum+1)*sizeof(struct pollfd)); if (fds.pfds==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; goto mumudvb_close_goto; } //We fill the file descriptor information structure. the first one is irrelevant //(file descriptor associated to the DVB card) but we allocate it for consistency unicast_vars.fd_info=NULL; unicast_vars.fd_info=realloc(unicast_vars.fd_info,(fds.pfdsnum)*sizeof(unicast_fd_info_t)); if (unicast_vars.fd_info==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; goto mumudvb_close_goto; } //File descriptor for polling the DVB card fds.pfds[0].fd = fds.fd_dvr; //POLLIN : data available for read fds.pfds[0].events = POLLIN | POLLPRI; fds.pfds[0].revents = 0; fds.pfds[1].fd = 0; fds.pfds[1].events = POLLIN | POLLPRI; fds.pfds[1].revents = 0; /*****************************************************/ // Init network, we open the sockets /*****************************************************/ if(multicast_vars.multicast) for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { if(multicast_vars.multicast_ipv4) { //See the README for the reason of this option if(multicast_vars.auto_join) chan_and_pids.channels[curr_channel].socketOut4 = makeclientsocket (chan_and_pids.channels[curr_channel].ip4Out, chan_and_pids.channels[curr_channel].portOut, multicast_vars.ttl, multicast_vars.iface4, &chan_and_pids.channels[curr_channel].sOut4); else chan_and_pids.channels[curr_channel].socketOut4 = makesocket (chan_and_pids.channels[curr_channel].ip4Out, chan_and_pids.channels[curr_channel].portOut, multicast_vars.ttl, multicast_vars.iface4, &chan_and_pids.channels[curr_channel].sOut4); } if(multicast_vars.multicast_ipv6) { //See the README for the reason of this option if(multicast_vars.auto_join) chan_and_pids.channels[curr_channel].socketOut6 = makeclientsocket6 (chan_and_pids.channels[curr_channel].ip6Out, chan_and_pids.channels[curr_channel].portOut, multicast_vars.ttl, multicast_vars.iface6, &chan_and_pids.channels[curr_channel].sOut6); else chan_and_pids.channels[curr_channel].socketOut6 = makesocket6 (chan_and_pids.channels[curr_channel].ip6Out, chan_and_pids.channels[curr_channel].portOut, multicast_vars.ttl, multicast_vars.iface6, &chan_and_pids.channels[curr_channel].sOut6); } } //We open the socket for the http unicast if needed and we update the poll structure if(unicast_vars.unicast) { log_message("Unicast: ", MSG_INFO,"We open the Master http socket for address %s:%d\n",unicast_vars.ipOut, unicast_vars.portOut); unicast_create_listening_socket(UNICAST_MASTER, -1, unicast_vars.ipOut, unicast_vars.portOut, &unicast_vars.sIn, &unicast_vars.socketIn, &fds, &unicast_vars); /** open the unicast listening connections fo the channels */ for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) if(chan_and_pids.channels[curr_channel].unicast_port) { log_message("Unicast: ", MSG_INFO,"We open the channel %d http socket address %s:%d\n",curr_channel, unicast_vars.ipOut, chan_and_pids.channels[curr_channel].unicast_port); unicast_create_listening_socket(UNICAST_LISTEN_CHANNEL, curr_channel, unicast_vars.ipOut,chan_and_pids.channels[curr_channel].unicast_port , &chan_and_pids.channels[curr_channel].sIn, &chan_and_pids.channels[curr_channel].socketIn, &fds, &unicast_vars); } } /*****************************************************/ // init sap /*****************************************************/ iRet=init_sap(&sap_vars, multicast_vars); if(iRet) { Interrupted=ERROR_GENERIC<<8; goto mumudvb_close_goto; } /*****************************************************/ // Information about streamed channels /*****************************************************/ if(autoconf_vars.autoconfiguration!=AUTOCONF_MODE_FULL) log_streamed_channels(log_module, chan_and_pids.number_of_channels, chan_and_pids.channels, multicast_vars.multicast_ipv4, multicast_vars.multicast_ipv6, unicast_vars.unicast, unicast_vars.portOut, unicast_vars.ipOut); if(autoconf_vars.autoconfiguration) log_message("Autoconf: ",MSG_INFO,"Autoconfiguration Start\n"); //Thread for reading from the DVB card RUNNING if(card_buffer.threaded_read) { pthread_create(&(cardthread), NULL, read_card_thread_func, &cardthreadparams); //We alloc the buffers card_buffer.write_buffer_size=card_buffer.max_thread_buffer_size*TS_PACKET_SIZE; card_buffer.buffer1=malloc(sizeof(unsigned char)*card_buffer.write_buffer_size); card_buffer.buffer2=malloc(sizeof(unsigned char)*card_buffer.write_buffer_size); card_buffer.actual_read_buffer=1; card_buffer.reading_buffer=card_buffer.buffer1; card_buffer.writing_buffer=card_buffer.buffer2; cardthreadparams.main_waiting=0; }else { //We alloc the buffer card_buffer.reading_buffer=malloc(sizeof(unsigned char)*TS_PACKET_SIZE*card_buffer.dvr_buffer_size); } /******************************************************/ //We open the dump file if any /******************************************************/ dump_file = NULL; if(dump_filename) { dump_file = fopen (dump_filename, "w"); if (dump_file == NULL) { log_message( log_module, MSG_ERROR, "%s: %s\n", dump_filename, strerror (errno)); free(dump_filename); } } /******************************************************/ //Main loop where we get the packets and send them /******************************************************/ int poll_ret; /**Buffer containing one packet*/ unsigned char *actual_ts_packet; while (!Interrupted) { if(card_buffer.threaded_read) { if(!card_buffer.bytes_in_write_buffer && !cardthreadparams.unicast_data) { pthread_mutex_lock(&cardthreadparams.carddatamutex); cardthreadparams.main_waiting=1; pthread_cond_wait(&cardthreadparams.threadcond,&cardthreadparams.carddatamutex); //pthread_mutex_lock(&cardthreadparams.carddatamutex); cardthreadparams.main_waiting=0; } else pthread_mutex_lock(&cardthreadparams.carddatamutex); if(card_buffer.bytes_in_write_buffer) { if(card_buffer.actual_read_buffer==1) { card_buffer.reading_buffer=card_buffer.buffer2; card_buffer.writing_buffer=card_buffer.buffer1; card_buffer.actual_read_buffer=2; } else { card_buffer.reading_buffer=card_buffer.buffer1; card_buffer.writing_buffer=card_buffer.buffer2; card_buffer.actual_read_buffer=1; } card_buffer.bytes_read=card_buffer.bytes_in_write_buffer; card_buffer.bytes_in_write_buffer=0; } pthread_mutex_unlock(&cardthreadparams.carddatamutex); if(cardthreadparams.unicast_data) { iRet=unicast_handle_fd_event(&unicast_vars, &fds, chan_and_pids.channels, chan_and_pids.number_of_channels, &strengthparams, &autoconf_vars, cam_vars_ptr); if(iRet) { Interrupted=iRet; continue; } pthread_mutex_lock(&cardthreadparams.carddatamutex); cardthreadparams.unicast_data=0; pthread_mutex_unlock(&cardthreadparams.carddatamutex); } } else { /* Poll the open file descriptors : we wait for data*/ poll_ret=mumudvb_poll(&fds); if(poll_ret) { Interrupted=poll_ret; continue; } /**************************************************************/ /* UNICAST HTTP */ /**************************************************************/ if((!(fds.pfds[0].revents&POLLIN)) && (!(fds.pfds[0].revents&POLLPRI))) //Priority to the DVB packets so if there is dvb packets and something else, we look first to dvb packets { iRet=unicast_handle_fd_event(&unicast_vars, &fds, chan_and_pids.channels, chan_and_pids.number_of_channels, &strengthparams, &autoconf_vars, cam_vars_ptr); if(iRet) Interrupted=iRet; //no DVB packet, we continue continue; } /**************************************************************/ /* END OF UNICAST HTTP */ /**************************************************************/ if((card_buffer.bytes_read=card_read(fds.fd_dvr, card_buffer.reading_buffer, &card_buffer))==0) continue; } if(card_buffer.dvr_buffer_size!=1 && stats_infos.show_buffer_stats) { stats_infos.stats_num_packets_received+=(int) card_buffer.bytes_read/TS_PACKET_SIZE; stats_infos.stats_num_reads++; } for(card_buffer.read_buff_pos=0; (card_buffer.read_buff_pos+TS_PACKET_SIZE)<=card_buffer.bytes_read; card_buffer.read_buff_pos+=TS_PACKET_SIZE)//we loop on the subpackets { actual_ts_packet=card_buffer.reading_buffer+card_buffer.read_buff_pos; //If the user asked to dump the streams it's here tath it should be done if(dump_file) if(fwrite(actual_ts_packet,TS_PACKET_SIZE,sizeof(unsigned char),dump_file)0) continue; } // Get the PID of the received TS packet pid = ((actual_ts_packet[1] & 0x1f) << 8) | (actual_ts_packet[2]); // Check the continuity if(chan_and_pids.check_cc) { continuity_counter=actual_ts_packet[3] & 0x0f; if (chan_and_pids.continuity_counter_pid[pid]!=-1 && chan_and_pids.continuity_counter_pid[pid]!=continuity_counter && ((chan_and_pids.continuity_counter_pid[pid]+1) & 0x0f)!=continuity_counter) strengthparams.ts_discontinuities++; chan_and_pids.continuity_counter_pid[pid]=continuity_counter; } //Software filtering in case the card doesn't have hardware filtering if(chan_and_pids.asked_pid[8192]==PID_NOT_ASKED && chan_and_pids.asked_pid[pid]==PID_NOT_ASKED) continue; ScramblingControl = (actual_ts_packet[3] & 0xc0) >> 6; /* 0 = Not scrambled 1 = Reserved for future use 2 = Scrambled with even key 3 = Scrambled with odd key*/ /******************************************************/ // AUTOCONFIGURATION PART /******************************************************/ if(!ScramblingControl && autoconf_vars.autoconfiguration) { iRet = autoconf_new_packet(pid, actual_ts_packet, &autoconf_vars, &fds, &chan_and_pids, &tuneparams, &multicast_vars, &unicast_vars, server_id); if(iRet) Interrupted = iRet; } if(autoconf_vars.autoconfiguration) continue; /******************************************************/ // AUTOCONFIGURATION PART FINISHED /******************************************************/ /******************************************************/ //Pat rewrite /******************************************************/ if( (pid == 0) && //This is a PAT PID rewrite_vars.rewrite_pat == OPTION_ON ) //AND we asked for rewrite { pat_rewrite_new_global_packet(actual_ts_packet, &rewrite_vars); } /******************************************************/ //SDT rewrite /******************************************************/ if( (pid == 17) && //This is a SDT PID rewrite_vars.rewrite_sdt == OPTION_ON ) //AND we asked for rewrite { //we check the new packet and if it's fully updated we set the skip to 0 if(sdt_rewrite_new_global_packet(actual_ts_packet, &rewrite_vars)==1) { log_message( log_module, MSG_DETAIL,"The SDT version changed, we force the update of all the channels.\n"); for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) chan_and_pids.channels[curr_channel].sdt_rewrite_skip=0; } } /******************************************************/ //for each channel we'll look if we must send this PID /******************************************************/ for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { //we'll see if we must send this pid for this channel send_packet=0; //If it's a mandatory pid we send it if((pid0)&& (pid != chan_and_pids.channels[curr_channel].pmt_pid) ) send_packet=0; if ((ScramblingControl>0) && (pid != chan_and_pids.channels[curr_channel].pmt_pid) ) chan_and_pids.channels[curr_channel].num_scrambled_packets++; //check if the PID is scrambled for determining its state if (ScramblingControl>0) chan_and_pids.channels[curr_channel].pids_num_scrambled_packets[curr_pid]++; //we don't count the PMT pid for up channels if (pid != chan_and_pids.channels[curr_channel].pmt_pid) chan_and_pids.channels[curr_channel].num_packet++; } /******************************************************/ //cam support // If we send the packet, we look if it's a cam pmt pid /******************************************************/ #ifdef ENABLE_CAM_SUPPORT if((cam_vars.cam_support && send_packet==1) && //no need to check paquets we don't send cam_vars.ca_resource_connected && ((now-cam_vars.cam_pmt_send_time)>=cam_vars.cam_interval_pmt_send )) { if(cam_new_packet(pid, curr_channel, actual_ts_packet, cam_vars_ptr, &chan_and_pids.channels[curr_channel])) cam_vars.cam_pmt_send_time=now; //A packet was sent to the CAM } #endif /******************************************************/ //PMT follow (ie we check if the pids announced in the PMT changed) /******************************************************/ if( (autoconf_vars.autoconf_pid_update) && (send_packet==1) && //no need to check paquets we don't send (chan_and_pids.channels[curr_channel].autoconfigurated) && //only channels whose pids where detected by autoconfiguration (we don't erase "manual" channels) (chan_and_pids.channels[curr_channel].pmt_pid==pid) && //And we see the PMT pid) { autoconf_pmt_follow( actual_ts_packet, &fds, &chan_and_pids.channels[curr_channel], tuneparams.card_dev_path, tuneparams.tuner, &chan_and_pids ); } /******************************************************/ //PMT follow for the cam for non autoconfigurated channels. // This is a PMT update forced for the CAM in case of no autoconfiguration /******************************************************/ #ifdef ENABLE_CAM_SUPPORT if((cam_vars.cam_pmt_follow) && (chan_and_pids.channels[curr_channel].need_cam_ask==CAM_ASKED) && (send_packet==1) && //no need to check paquets we don't send (!chan_and_pids.channels[curr_channel].autoconfigurated) && //the check is for the non autoconfigurated channels (chan_and_pids.channels[curr_channel].pmt_pid==pid) && //And we see the PMT pid) { cam_pmt_follow( actual_ts_packet, &chan_and_pids.channels[curr_channel] ); } #endif /******************************************************/ //Rewrite PAT /******************************************************/ if((send_packet==1) && //no need to check paquets we don't send (pid == 0) && //This is a PAT PID rewrite_vars.rewrite_pat == OPTION_ON ) //AND we asked for rewrite send_packet=pat_rewrite_new_channel_packet(actual_ts_packet, &rewrite_vars, &chan_and_pids.channels[curr_channel], curr_channel); /******************************************************/ //Rewrite SDT /******************************************************/ if((send_packet==1) && //no need to check paquets we don't send (pid == 17) && //This is a SDT PID rewrite_vars.rewrite_sdt == OPTION_ON && //AND we asked for rewrite !chan_and_pids.channels[curr_channel].sdt_rewrite_skip ) //AND the generation was successful send_packet=sdt_rewrite_new_channel_packet(actual_ts_packet, &rewrite_vars, &chan_and_pids.channels[curr_channel], curr_channel); /******************************************************/ //EIT SORT /******************************************************/ if((send_packet==1) &&//no need to check paquets we don't send (pid == 18) && //This is a EIT PID (chan_and_pids.channels[curr_channel].service_id) && //we have the service_id rewrite_vars.eit_sort ) //AND we asked for EIT sorting { send_packet=eit_sort_new_packet(actual_ts_packet, &chan_and_pids.channels[curr_channel]); } /******************************************************/ // Test if PSI tables filtering is activated /******************************************************/ if (send_packet==1 && chan_and_pids.psi_tables_filtering>0 && pid<32) { // Keep only PAT and CAT if (chan_and_pids.psi_tables_filtering==1 && pid>1) send_packet=0; // Keep only PAT if (chan_and_pids.psi_tables_filtering==2 && pid>0) send_packet=0; } /******************************************************/ //Ok we must send this packet, // we add it to the channel buffer /******************************************************/ if(send_packet==1) { // we fill the channel buffer memcpy(chan_and_pids.channels[curr_channel].buf + chan_and_pids.channels[curr_channel].nb_bytes, actual_ts_packet, TS_PACKET_SIZE); chan_and_pids.channels[curr_channel].buf[chan_and_pids.channels[curr_channel].nb_bytes + 1] = (chan_and_pids.channels[curr_channel].buf[chan_and_pids.channels[curr_channel].nb_bytes + 1] & 0xe0) | hi_mappids[pid]; chan_and_pids.channels[curr_channel].buf[chan_and_pids.channels[curr_channel].nb_bytes + 2] = lo_mappids[pid]; chan_and_pids.channels[curr_channel].nb_bytes += TS_PACKET_SIZE; //The buffer is full, we send it if ((!multicast_vars.rtp_header && ((chan_and_pids.channels[curr_channel].nb_bytes + TS_PACKET_SIZE) > MAX_UDP_SIZE)) ||(multicast_vars.rtp_header && ((chan_and_pids.channels[curr_channel].nb_bytes + RTP_HEADER_LEN + TS_PACKET_SIZE) > MAX_UDP_SIZE))) { //For bandwith measurement (traffic) chan_and_pids.channels[curr_channel].sent_data+=chan_and_pids.channels[curr_channel].nb_bytes+20+8; // IP=20 bytes header and UDP=8 bytes header if (multicast_vars.rtp_header) chan_and_pids.channels[curr_channel].sent_data+=RTP_HEADER_LEN; /********* TRANSCODE **********/ #ifdef ENABLE_TRANSCODING if (NULL != chan_and_pids.channels[curr_channel].transcode_options.enable && 1 == *chan_and_pids.channels[curr_channel].transcode_options.enable) { if (NULL == chan_and_pids.channels[curr_channel].transcode_handle) { strcpy(chan_and_pids.channels[curr_channel].transcode_options.ip, chan_and_pids.channels[curr_channel].ip4Out); chan_and_pids.channels[curr_channel].transcode_handle = transcode_start_thread(chan_and_pids.channels[curr_channel].socketOut4, &chan_and_pids.channels[curr_channel].sOut4, &chan_and_pids.channels[curr_channel].transcode_options); } if (NULL != chan_and_pids.channels[curr_channel].transcode_handle) { transcode_enqueue_data(chan_and_pids.channels[curr_channel].transcode_handle, chan_and_pids.channels[curr_channel].buf, chan_and_pids.channels[curr_channel].nb_bytes); } } if (NULL == chan_and_pids.channels[curr_channel].transcode_options.enable || 1 != *chan_and_pids.channels[curr_channel].transcode_options.enable || ((NULL != chan_and_pids.channels[curr_channel].transcode_options.streaming_type && STREAMING_TYPE_MPEGTS != *chan_and_pids.channels[curr_channel].transcode_options.streaming_type)&& (NULL == chan_and_pids.channels[curr_channel].transcode_options.send_transcoded_only || 1 != *chan_and_pids.channels[curr_channel].transcode_options.send_transcoded_only))) #endif /********** MULTICAST *************/ //if the multicast TTL is set to 0 we don't send the multicast packets if(multicast_vars.multicast) { unsigned char *data; int data_len; if(multicast_vars.rtp_header) { /****** RTP *******/ rtp_update_sequence_number(&chan_and_pids.channels[curr_channel]); data=chan_and_pids.channels[curr_channel].buf_with_rtp_header; data_len=chan_and_pids.channels[curr_channel].nb_bytes+RTP_HEADER_LEN; } else { data=chan_and_pids.channels[curr_channel].buf; data_len=chan_and_pids.channels[curr_channel].nb_bytes; } if(multicast_vars.multicast_ipv4) sendudp (chan_and_pids.channels[curr_channel].socketOut4, &chan_and_pids.channels[curr_channel].sOut4, data, data_len); if(multicast_vars.multicast_ipv6) sendudp6 (chan_and_pids.channels[curr_channel].socketOut6, &chan_and_pids.channels[curr_channel].sOut6, data, data_len); } /*********** UNICAST **************/ unicast_data_send(&chan_and_pids.channels[curr_channel], chan_and_pids.channels, &fds, &unicast_vars); /********* END of UNICAST **********/ chan_and_pids.channels[curr_channel].nb_bytes = 0; } } } } } /******************************************************/ //End of main loop /******************************************************/ if(dump_file) fclose(dump_file); gettimeofday (&tv, (struct timezone *) NULL); log_message( log_module, MSG_INFO, "End of streaming. We streamed during %dd %d:%02d:%02d\n",(tv.tv_sec - real_start_time )/86400,((tv.tv_sec - real_start_time) % 86400 )/3600,((tv.tv_sec - real_start_time) % 3600)/60,(tv.tv_sec - real_start_time) %60 ); if(card_buffer.partial_packet_number) log_message( log_module, MSG_INFO, "We received %d partial packets :-( \n",card_buffer.partial_packet_number ); if(card_buffer.partial_packet_number) log_message( log_module, MSG_INFO, "We have got %d overflow errors\n",card_buffer.overflow_number ); mumudvb_close_goto: //If the thread is not started, we don't send the unexisting address of monitor_thread_params return mumudvb_close(monitorthread == 0 ? NULL:&monitor_thread_params , &unicast_vars, &tuneparams.strengththreadshutdown, cam_vars_ptr, filename_channels_not_streamed, filename_channels_streamed, filename_pid, Interrupted); } /** @brief Clean closing and freeing * * */ int mumudvb_close(monitor_parameters_t *monitor_thread_params, unicast_parameters_t *unicast_vars, int *strengththreadshutdown, void *cam_vars_v, char *filename_channels_not_streamed, char *filename_channels_streamed, char *filename_pid, int Interrupted) { int curr_channel; int iRet; #ifndef ENABLE_CAM_SUPPORT (void) cam_vars_v; //to make compiler happy #else cam_parameters_t *cam_vars=(cam_parameters_t *)cam_vars_v; #endif if (Interrupted) { if(Interrupted< (1<<8)) //we check if it's a signal or a mumudvb error log_message( log_module, MSG_INFO, "Caught signal %d - closing cleanly.\n", Interrupted); else log_message( log_module, MSG_INFO, "Closing cleanly. Error %d\n",Interrupted>>8); } struct timespec ts; if(signalpowerthread) { log_message(log_module,MSG_DEBUG,"Signal/power Thread closing\n"); *strengththreadshutdown=1; clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 5; iRet=pthread_timedjoin_np(signalpowerthread, NULL, &ts); if(iRet) log_message(log_module,MSG_WARN,"Signal/power Thread badly closed: %s\n", strerror(iRet)); } if(cardthreadparams.thread_running) { log_message(log_module,MSG_DEBUG,"Card reading Thread closing\n"); cardthreadparams.threadshutdown=1; pthread_mutex_destroy(&cardthreadparams.carddatamutex); pthread_cond_destroy(&cardthreadparams.threadcond); } //We shutdown the monitoring thread if(monitorthread) { log_message(log_module,MSG_DEBUG,"Monitor Thread closing\n"); monitor_thread_params->threadshutdown=1; clock_gettime(CLOCK_REALTIME, &ts); ts.tv_sec += 5; iRet=pthread_timedjoin_np(monitorthread, NULL, &ts); if(iRet) log_message(log_module,MSG_WARN,"Monitor Thread badly closed: %s\n", strerror(iRet)); } for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { #ifdef ENABLE_TRANSCODING transcode_request_thread_end(chan_and_pids.channels[curr_channel].transcode_handle); #endif if(chan_and_pids.channels[curr_channel].socketOut4>0) close (chan_and_pids.channels[curr_channel].socketOut4); if(chan_and_pids.channels[curr_channel].socketOut6>0) close (chan_and_pids.channels[curr_channel].socketOut6); if(chan_and_pids.channels[curr_channel].socketIn>0) close (chan_and_pids.channels[curr_channel].socketIn); //Free the channel structures if(chan_and_pids.channels[curr_channel].pmt_packet) free(chan_and_pids.channels[curr_channel].pmt_packet); chan_and_pids.channels[curr_channel].pmt_packet=NULL; } #ifdef ENABLE_TRANSCODING /* End transcoding and clear transcode options */ for (curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { transcode_wait_thread_end(chan_and_pids.channels[curr_channel].transcode_handle); free_transcode_options(&chan_and_pids.channels[curr_channel].transcode_options); } free_transcode_options(&global_transcode_opt); #endif // we close the file descriptors close_card_fd (fds); //We close the unicast connections and free the clients unicast_freeing(unicast_vars, chan_and_pids.channels); #ifdef ENABLE_CAM_SUPPORT if(cam_vars->cam_support) { // stop CAM operation cam_stop(cam_vars); // delete cam_info file if (remove (cam_vars->filename_cam_info)) { log_message( log_module, MSG_WARN, "%s: %s\n", cam_vars->filename_cam_info, strerror (errno)); } mumu_free_string(&cam_vars->cam_menulist_str); mumu_free_string(&cam_vars->cam_menu_string); } #endif //autoconf variables freeing autoconf_freeing(&autoconf_vars); //sap variables freeing if(monitor_thread_params && monitor_thread_params->sap_vars->sap_messages4) free(monitor_thread_params->sap_vars->sap_messages4); if(monitor_thread_params && monitor_thread_params->sap_vars->sap_messages6) free(monitor_thread_params->sap_vars->sap_messages6); //Pat rewrite freeing if(rewrite_vars.full_pat) free(rewrite_vars.full_pat); //SDT rewrite freeing if(rewrite_vars.full_sdt) free(rewrite_vars.full_sdt); if (strlen(filename_channels_streamed) && (write_streamed_channels)&&remove (filename_channels_streamed)) { log_message( log_module, MSG_WARN, "%s: %s\n", filename_channels_streamed, strerror (errno)); exit(ERROR_DEL_FILE); } if (strlen(filename_channels_not_streamed) && (write_streamed_channels)&&remove (filename_channels_not_streamed)) { log_message( log_module, MSG_WARN, "%s: %s\n", filename_channels_not_streamed, strerror (errno)); exit(ERROR_DEL_FILE); } if (!no_daemon) { if (remove (filename_pid)) { log_message( log_module, MSG_INFO, "%s: %s\n", filename_pid, strerror (errno)); exit(ERROR_DEL_FILE); } } /*free the file descriptors*/ if(fds.pfds) free(fds.pfds); fds.pfds=NULL; if(unicast_vars->fd_info) free(unicast_vars->fd_info); unicast_vars->fd_info=NULL; // plop if(temp_buffer_from_dvr) // free(temp_buffer_from_dvr); // Format ExitCode (normal exit) int ExitCode; if(Interrupted<(1<<8)) ExitCode=0; else ExitCode=Interrupted>>8; // Show in log that we are stopping log_message( log_module, MSG_INFO,"========== MuMuDVB version %s is stopping with ExitCode %d ==========",VERSION,ExitCode); // Freeing log ressources if(log_params.log_file) { fclose(log_params.log_file); free(log_params.log_file_path); } if(log_params.log_header!=NULL) free(log_params.log_header); // End return(ExitCode); } /****************************************************** * Signal Handler Function * * This function is called periodically * It checks for the tuning timeouts * * This function also catches SIGPIPE, SIGUSR1, SIGUSR2 and SIGHUP * ******************************************************/ static void SignalHandler (int signum) { if (signum == SIGALRM && !Interrupted) { if (card_tuned && !*card_tuned) { log_message( log_module, MSG_INFO, "Card not tuned after timeout - exiting\n"); exit(ERROR_TUNE); } } else if (signum == SIGUSR1) { received_signal=SIGUSR1; } else if (signum == SIGUSR2) { received_signal=SIGUSR2; } else if (signum == SIGHUP) { received_signal=signum; } else if (signum != SIGPIPE) { Interrupted = signum; } signal (signum, SignalHandler); } void *monitor_func(void* arg) { monitor_parameters_t *params; params= (monitor_parameters_t *) arg; int i,curr_channel; struct timeval tv; double monitor_now; double monitor_start; double last_updown_check=0; double last_flush_time = 0; double time_no_diff=0; int num_big_buffer_show=0; gettimeofday (&tv, (struct timezone *) NULL); monitor_start = tv.tv_sec + tv.tv_usec/1000000; monitor_now = monitor_start; while(!params->threadshutdown) { gettimeofday (&tv, (struct timezone *) NULL); monitor_now = tv.tv_sec + tv.tv_usec/1000000 -monitor_start; now = tv.tv_sec - real_start_time; /*******************************************/ /* We deal with the received signals */ /*******************************************/ if (received_signal == SIGUSR1) //Display signal strength { params->tuneparams->display_strenght = params->tuneparams->display_strenght ? 0 : 1; received_signal = 0; } else if (received_signal == SIGUSR2) //Display traffic { params->stats_infos->show_traffic = params->stats_infos->show_traffic ? 0 : 1; if(params->stats_infos->show_traffic) log_message( log_module, MSG_INFO,"The traffic will be shown every %d seconds\n",params->stats_infos->show_traffic_interval); else log_message( log_module, MSG_INFO,"The traffic will not be shown anymore\n"); received_signal = 0; } else if (received_signal == SIGHUP) //Sync logs { log_message( log_module, MSG_DEBUG,"Syncing logs\n"); sync_logs(); received_signal = 0; } /*autoconfiguration*/ /*We check if we reached the autoconfiguration timeout*/ if(params->autoconf_vars->autoconfiguration) { int iRet; iRet = autoconf_poll(now, params->autoconf_vars, params->chan_and_pids, params->tuneparams, params->multicast_vars, &fds, params->unicast_vars, params->server_id); if(iRet) Interrupted = iRet; } if(!params->autoconf_vars->autoconfiguration) { /*we are not doing autoconfiguration we can do something else*/ /*sap announces*/ sap_poll(params->sap_vars,params->chan_and_pids->number_of_channels,params->chan_and_pids->channels,*params->multicast_vars, (long)monitor_now); /*******************************************/ /* compute the bandwith occupied by */ /* each channel */ /*******************************************/ float time_interval; if(!params->stats_infos->compute_traffic_time) params->stats_infos->compute_traffic_time=monitor_now; if((monitor_now-params->stats_infos->compute_traffic_time)>=params->stats_infos->compute_traffic_interval) { time_interval=monitor_now-params->stats_infos->compute_traffic_time; params->stats_infos->compute_traffic_time=monitor_now; for (curr_channel = 0; curr_channel < params->chan_and_pids->number_of_channels; curr_channel++) { if (time_interval!=0) params->chan_and_pids->channels[curr_channel].traffic=((float)params->chan_and_pids->channels[curr_channel].sent_data)/time_interval*1/1000; else params->chan_and_pids->channels[curr_channel].traffic=0; params->chan_and_pids->channels[curr_channel].sent_data=0; } } /*******************************************/ /*show the bandwith measurement */ /*******************************************/ if(params->stats_infos->show_traffic) { show_traffic(log_module,monitor_now, params->stats_infos->show_traffic_interval, params->chan_and_pids); } /*******************************************/ /* Show the statistics for the big buffer */ /*******************************************/ if(params->stats_infos->show_buffer_stats) { if(!params->stats_infos->show_buffer_stats_time) params->stats_infos->show_buffer_stats_time=monitor_now; if((monitor_now-params->stats_infos->show_buffer_stats_time)>=params->stats_infos->show_buffer_stats_interval) { params->stats_infos->show_buffer_stats_time=monitor_now; if (params->stats_infos->stats_num_reads!=0) log_message( log_module, MSG_DETAIL, "Average packets in the buffer %d\n", params->stats_infos->stats_num_packets_received/params->stats_infos->stats_num_reads); else log_message( log_module, MSG_DETAIL, "Average packets in the buffer cannot be calculated - No packets read!\n"); params->stats_infos->stats_num_packets_received=0; params->stats_infos->stats_num_reads=0; num_big_buffer_show++; if(num_big_buffer_show==10) params->stats_infos->show_buffer_stats=0; } } /*******************************************/ /* Periodically flush the logs if asked */ /*******************************************/ if((log_params.log_file) && (log_params.log_flush_interval !=-1)) { if(!last_flush_time) { last_flush_time=monitor_now; fflush(log_params.log_file); } if((monitor_now-last_flush_time)>=log_params.log_flush_interval) { log_message( log_module, MSG_FLOOD, "Flushing logs\n"); fflush(log_params.log_file); last_flush_time=monitor_now; } } /*******************************************/ /* Check if the chanel scrambling state */ /* has changed */ /*******************************************/ // Current thresholds for calculation // (<2%) FULLY_UNSCRAMBLED // (5%<=ratio<=75%) PARTIALLY_UNSCRAMBLED // (>80%) HIGHLY_SCRAMBLED // The gap is an hysteresis to avoid excessive jumping between states for (curr_channel = 0; curr_channel < params->chan_and_pids->number_of_channels; curr_channel++) { mumudvb_channel_t *current; current=¶ms->chan_and_pids->channels[curr_channel]; /* Calcultation of the ratio (percentage) of scrambled packets received*/ if (current->num_packet >0 && current->num_scrambled_packets>10) current->ratio_scrambled = (int)(current->num_scrambled_packets*100/(current->num_packet)); else current->ratio_scrambled = 0; /* Test if we have only unscrambled packets (<2%) - scrambled_channel=FULLY_UNSCRAMBLED : fully unscrambled*/ if ((current->ratio_scrambled < 2) && (current->scrambled_channel != FULLY_UNSCRAMBLED)) { log_message( log_module, MSG_INFO, "Channel \"%s\" is now fully unscrambled (%d%% of scrambled packets). Card %d\n", current->name, current->ratio_scrambled, params->tuneparams->card); current->scrambled_channel = FULLY_UNSCRAMBLED;// update } /* Test if we have partiallay unscrambled packets (5%<=ratio<=75%) - scrambled_channel=PARTIALLY_UNSCRAMBLED : partially unscrambled*/ if ((current->ratio_scrambled >= 5) && (current->ratio_scrambled <= 75) && (current->scrambled_channel != PARTIALLY_UNSCRAMBLED)) { log_message( log_module, MSG_INFO, "Channel \"%s\" is now partially unscrambled (%d%% of scrambled packets). Card %d\n", current->name, current->ratio_scrambled, params->tuneparams->card); current->scrambled_channel = PARTIALLY_UNSCRAMBLED;// update } /* Test if we have nearly only scrambled packets (>80%) - scrambled_channel=HIGHLY_SCRAMBLED : highly scrambled*/ if ((current->ratio_scrambled > 80) && current->scrambled_channel != HIGHLY_SCRAMBLED) { log_message( log_module, MSG_INFO, "Channel \"%s\" is now higly scrambled (%d%% of scrambled packets). Card %d\n", current->name, current->ratio_scrambled, params->tuneparams->card); current->scrambled_channel = HIGHLY_SCRAMBLED;// update } /* Check the PID scrambling state */ int curr_pid; for (curr_pid = 0; curr_pid < current->num_pids; curr_pid++) { if (current->pids_num_scrambled_packets[curr_pid]>0) current->pids_scrambled[curr_pid]=1; else current->pids_scrambled[curr_pid]=0; current->pids_num_scrambled_packets[curr_pid]=0; } } /*******************************************/ /* Check if the channel stream state */ /* has changed */ /*******************************************/ if(last_updown_check) { /* Check if the channel stream state has changed*/ for (curr_channel = 0; curr_channel < params->chan_and_pids->number_of_channels; curr_channel++) { mumudvb_channel_t *current; current=¶ms->chan_and_pids->channels[curr_channel]; double packets_per_sec; int num_scrambled; if(params->chan_and_pids->dont_send_scrambled) num_scrambled=current->num_scrambled_packets; else num_scrambled=0; if (monitor_now>last_updown_check) packets_per_sec=((double)current->num_packet-num_scrambled)/(monitor_now-last_updown_check); else packets_per_sec=0; if( params->stats_infos->debug_updown) { log_message( log_module, MSG_FLOOD, "Channel \"%s\" streamed_channel %f packets/s\n", current->name,packets_per_sec); } if ((packets_per_sec >= params->stats_infos->up_threshold) && (!current->streamed_channel)) { log_message( log_module, MSG_INFO, "Channel \"%s\" back.Card %d\n", current->name, params->tuneparams->card); current->streamed_channel = 1; // update if(params->sap_vars->sap == OPTION_ON) sap_update(¶ms->chan_and_pids->channels[curr_channel], params->sap_vars, curr_channel, *params->multicast_vars); //Channel status changed, we update the sap announces } else if ((current->streamed_channel) && (packets_per_sec < params->stats_infos->down_threshold)) { log_message( log_module, MSG_INFO, "Channel \"%s\" down.Card %d\n", current->name, params->tuneparams->card); current->streamed_channel = 0; // update if(params->sap_vars->sap == OPTION_ON) sap_update(¶ms->chan_and_pids->channels[curr_channel], params->sap_vars, curr_channel, *params->multicast_vars); //Channel status changed, we update the sap announces } } } /* reinit */ for (curr_channel = 0; curr_channel < params->chan_and_pids->number_of_channels; curr_channel++) { params->chan_and_pids->channels[curr_channel].num_packet = 0; params->chan_and_pids->channels[curr_channel].num_scrambled_packets = 0; } last_updown_check=monitor_now; /*******************************************/ /* we count active channels */ /*******************************************/ int count_of_active_channels=0; for (curr_channel = 0; curr_channel < params->chan_and_pids->number_of_channels; curr_channel++) if (params->chan_and_pids->channels[curr_channel].streamed_channel) count_of_active_channels++; /*Time no diff is the time when we got 0 active channels*/ /*if we have active channels, we reinit this counter*/ if(count_of_active_channels) time_no_diff=0; /*If we don't have active channels and this is the first time, we store the time*/ else if(!time_no_diff) time_no_diff=(long)monitor_now; /*******************************************/ /* If we don't stream data for */ /* a too long time, we exit */ /*******************************************/ if((timeout_no_diff)&& (time_no_diff&&((monitor_now-time_no_diff)>timeout_no_diff))) { log_message( log_module, MSG_ERROR, "No data from card %d in %ds, exiting.\n", params->tuneparams->card, timeout_no_diff); Interrupted=ERROR_NO_DIFF<<8; //the <<8 is to make difference beetween signals and errors } /*******************************************/ /* generation of the file which says */ /* the streamed channels */ /*******************************************/ if (write_streamed_channels) gen_file_streamed_channels(params->filename_channels_streamed, params->filename_channels_not_streamed, params->chan_and_pids->number_of_channels, params->chan_and_pids->channels); } for(i=0;iwait_time && !params->threadshutdown;i++) usleep(100000); } log_message(log_module,MSG_DEBUG, "Monitor thread stopping, it lasted %f seconds\n", monitor_now); return 0; } mumudvb-1.7.1/src/mumudvb.h000066400000000000000000000271051177353207000156300ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * Based on dvbstream by (C) Dave Chapman 2001, 2002. * * (C) 2004-2010 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /**@file * @brief Global parameters and structures */ #ifndef _MUMUDVB_H #define _MUMUDVB_H #include "network.h" //for the sockaddr #include "ts.h" #include "config.h" #include #include #ifdef ENABLE_TRANSCODING #include "transcode_common.h" #endif #define IPV6_CHAR_LEN 64 /*Do we support ATSC ?*/ #undef ATSC #if defined(DVB_API_VERSION_MINOR) #if DVB_API_VERSION == 3 && DVB_API_VERSION_MINOR >= 1 #define ATSC 1 #endif #endif #if DVB_API_VERSION > 3 #define ATSC 1 #endif /**the number of pids by channel*/ #define MAX_PIDS_PAR_CHAINE 18 /**the maximum channel number*/ #define MAX_CHANNELS 128 /**Size of an MPEG2-TS packet*/ #define TS_PACKET_SIZE 188 /**Default Maximum Number of TS packets in the TS buffer*/ #define DEFAULT_TS_BUFFER_SIZE 20 /**Default Maximum Number of TS packets in the thread buffer*/ #define DEFAULT_THREAD_BUFFER_SIZE 5000 #define ALARM_TIME_TIMEOUT 60 #define ALARM_TIME_TIMEOUT_NO_DIFF 600 /** MTU 1500 bytes - ip header (12bytes) - TCP header (biggest between TCP and udp) 24 : 7 mpeg2-ts packet per ethernet frame We cannot discover easily the MTU with unconnected UDP http://linuxgazette.net/149/melinte.html 7*188 plus margin */ #define MAX_UDP_SIZE 1320 /**the max mandatory pid number*/ #define MAX_MANDATORY_PID_NUMBER 32 /**config line length*/ #define CONF_LINELEN 512 #define MAX_NAME_LEN 256 #define CONFIG_FILE_SEPARATOR " =" /**Maximum number of polling tries (excepted EINTR)*/ #define MAX_POLL_TRIES 5 #define DEFAULT_PATH_LEN 256 /**The path for the auto generated config file*/ #define GEN_CONF_PATH "/var/run/mumudvb/mumudvb_generated_conf_card%d_tuner%d" /**The path for the list of streamed channels*/ #define STREAMED_LIST_PATH "/var/run/mumudvb/channels_streamed_adapter%d_tuner%d" /**The path for the list of *not* streamed channels*/ #define NOT_STREAMED_LIST_PATH "/var/run/mumudvb/channels_unstreamed_adapter%d_tuner%d" /**The path for the cam_info*/ #define CAM_INFO_LIST_PATH "/var/run/mumudvb/caminfo_adapter%d_tuner%d" /** The path for the pid file */ #define PIDFILE_PATH "/var/run/mumudvb/mumudvb_adapter%card_tuner%tuner.pid" /**RTP header length*/ #define RTP_HEADER_LEN 12 #define SAP_GROUP_LENGTH 20 enum { FULLY_UNSCRAMBLED=0, PARTIALLY_UNSCRAMBLED, HIGHLY_SCRAMBLED }; //for need_cam_ask enum { CAM_NO_ASK=0, CAM_NEED_ASK, CAM_NEED_UPDATE, CAM_ASKED }; /** Enum to tell if the option is set*/ typedef enum option_status { OPTION_UNDEFINED, OPTION_OFF, OPTION_ON } option_status_t; /** The different PID types*/ enum { PID_UNKNOW=0, PID_PMT, PID_PCR, PID_VIDEO_MPEG1, PID_VIDEO_MPEG2, PID_VIDEO_MPEG4_ASP, PID_VIDEO_MPEG4_AVC, PID_AUDIO_MPEG1, PID_AUDIO_MPEG2, PID_AUDIO_AAC_LATM, PID_AUDIO_AAC_ADTS, PID_AUDIO_ATSC, PID_AUDIO_AC3, PID_AUDIO_EAC3, PID_AUDIO_DTS, PID_AUDIO_AAC, PID_EXTRA_VBIDATA, PID_EXTRA_VBITELETEXT, PID_EXTRA_TELETEXT, PID_EXTRA_SUBTITLE }; /**@brief file descriptors*/ typedef struct { /** the dvb dvr*/ int fd_dvr; /** the dvb frontend*/ int fd_frontend; /** demuxer file descriptors */ int fd_demuxer[8193]; /** poll file descriptors */ struct pollfd *pfds; // DVR device + unicast http clients int pfdsnum; }fds_t; /**@brief Structure containing the card buffers*/ typedef struct card_buffer_t{ /** The two buffers (we put from the card with one, we read from the other one)*/ unsigned char *buffer1,*buffer2; int actual_read_buffer; /**The pointer to the reading buffer*/ unsigned char *reading_buffer; /**The pointer to the writing buffer*/ unsigned char *writing_buffer; /** The maximum number of packets in the buffer from DVR*/ int dvr_buffer_size; /** The position in the DVR buffer */ int read_buff_pos; /** number of bytes actually read */ int bytes_read; /** Do the read is made using a thread */ int threaded_read; /** The thread data buffer */ int bytes_in_write_buffer; int write_buffer_size; /** @todo put a size for each buffer*/ /** The number of partial packets received*/ int partial_packet_number; /** The number of overflow errors*/ int overflow_number; /**The maximum size of the thread buffer (in packets)*/ int max_thread_buffer_size; }card_buffer_t; struct unicast_client_t; /** @brief Structure for storing channels * */ typedef struct mumudvb_channel_t{ /** The logical channel number*/ int logical_channel_number; /**Tell the total packet number (without pmt) for the scrambling ratio and up/down detection*/ int num_packet; /**Tell the scrambled packet number (without pmt) for the scrambling ratio*/ int num_scrambled_packets; /**tell if this channel is actually streamed*/ int streamed_channel; /**Ratio of scrambled packet versus all packets*/ int ratio_scrambled; /**Tell if at least one of the PID related to the chanel is scrambled*/ int scrambled_channel; /**the channel name*/ char name[MAX_NAME_LEN]; /**the channel pids*/ int pids[MAX_PIDS_PAR_CHAINE]; /**the channel pids type (PMT, audio, video etc)*/ int pids_type[MAX_PIDS_PAR_CHAINE]; /**the channel pids language (ISO639 - 3 characters)*/ char pids_language[MAX_PIDS_PAR_CHAINE][4]; /**count the number of scrambled packets for the PID*/ int pids_num_scrambled_packets[MAX_PIDS_PAR_CHAINE]; /**tell if the PID is scrambled (1) or not (0)*/ char pids_scrambled[MAX_PIDS_PAR_CHAINE]; /**number of channel pids*/ int num_pids; /** Channel Type (Radio, TV, etc) / service type*/ int channel_type; /**Transport stream ID*/ int service_id; /**pmt pid number*/ int pmt_pid; /**Say if we need to ask this channel to the cam*/ int need_cam_ask; /** When did we asked the channel to the CAM */ long cam_asking_time; /**The ca system ids*/ int ca_sys_id[32]; /** The version of the pmt */ int pmt_version; /** Do the pmt needs to be updated ? */ int pmt_needs_update; /**The PMT packet*/ mumudvb_ts_packet_t *pmt_packet; #ifdef ENABLE_CAM_SUPPORT /** The PMT packet for CAM purposes*/ mumudvb_ts_packet_t *cam_pmt_packet; #endif /**the RTP header (just before the buffer so it can be sended together)*/ unsigned char buf_with_rtp_header[RTP_HEADER_LEN]; /**the buffer wich will be sent once it's full*/ unsigned char buf[MAX_UDP_SIZE]; /**number of bytes actually in the buffer*/ int nb_bytes; /**The data sent to this channel*/ long sent_data; /** The packet number for rtp*/ int rtp_packet_num; /**is the channel autoconfigurated ?*/ int autoconfigurated; /**The multicast ip address*/ char ip4Out[20]; /**The multicast port*/ int portOut; /**The multicast output socket*/ struct sockaddr_in sOut4; /**The multicast output socket*/ int socketOut4; /**The ipv6 multicast ip address*/ char ip6Out[IPV6_CHAR_LEN]; /**The multicast output socket*/ struct sockaddr_in6 sOut6; /**The multicast output socket*/ int socketOut6; /**Unicast clients*/ struct unicast_client_t *clients; /**Unicast port (listening socket per channel) */ int unicast_port; /**Unicast listening socket*/ struct sockaddr_in sIn; /**Unicast listening socket*/ int socketIn; /**The sap playlist group*/ char sap_group[SAP_GROUP_LENGTH]; /**The generated pat to be sent*/ unsigned char generated_pat[TS_PACKET_SIZE]; /**@todo: allocate dynamically*/ /** The version of the generated pat */ int generated_pat_version; /**The generated sdt to be sent*/ unsigned char generated_sdt[TS_PACKET_SIZE]; /**@todo: allocate dynamically*/ /** The version of the generated sdt */ int generated_sdt_version; /** If there is no channel found, we skip sdt rewrite */ int sdt_rewrite_skip; /** The occupied traffic (in kB/s) */ float traffic; /** Are we dropping the current EIT packet for this channel*/ int eit_dropping; /**The continuity counter for the EIT*/ int eit_continuity_counter; #ifdef ENABLE_TRANSCODING void *transcode_handle; struct transcode_options_t transcode_options; #endif }mumudvb_channel_t; /**The parameters concerning the multicast*/ typedef struct multicast_parameters_t{ /** Do we activate multicast ? */ int multicast; /** Do we activate multicast ? */ int multicast_ipv4; /** Do we activate multicast ? */ int multicast_ipv6; /** Time to live of sent packets */ int ttl; /** the default port*/ int common_port; /** Does MuMuDVB have to join the created multicast groups ?*/ int auto_join; /**Do we send the rtp header ? */ int rtp_header; /** The interface for IPv4 */ char iface4[IF_NAMESIZE+1]; /** The interface for IPv6 */ char iface6[IF_NAMESIZE+1]; }multicast_parameters_t; /** No PSI tables filtering */ #define PSI_TABLES_FILTERING_NONE 0 /** Keep only PAT and CAT */ #define PSI_TABLES_FILTERING_PAT_CAT_ONLY 1 /** Keep only PAT */ #define PSI_TABLES_FILTERING_PAT_ONLY 2 /** structure containing the channels and the asked pids information*/ typedef struct mumudvb_chan_and_pids_t{ /** The number of channels ... */ int number_of_channels; /** Do we send scrambled packets ? */ int dont_send_scrambled; /** Do we send packets with error bit set by decoder ? */ int filter_transport_error; /** Do we do filtering to keep only PSI tables (without DVB tables) ? **/ int psi_tables_filtering; /** The channels array */ mumudvb_channel_t channels[MAX_CHANNELS]; /**@todo use realloc*/ //Asked pids //used for filtering /** this array contains the pids we want to filter,*/ uint8_t asked_pid[8193]; /** the number of channels who want this pid (used by autoconfiguration update)*/ uint8_t number_chan_asked_pid[8193]; /** The number of TS discontinuities per PID **/ int16_t continuity_counter_pid[8193]; //on 16 bits for storing the initial -1 uint8_t check_cc; }mumudvb_chan_and_pids_t; typedef struct monitor_parameters_t{ int threadshutdown; int wait_time; struct autoconf_parameters_t *autoconf_vars; struct sap_parameters_t *sap_vars; mumudvb_chan_and_pids_t *chan_and_pids; multicast_parameters_t *multicast_vars; struct unicast_parameters_t *unicast_vars; struct tuning_parameters_t *tuneparams; struct stats_infos_t *stats_infos; int server_id; char *filename_channels_not_streamed; char *filename_channels_streamed; }monitor_parameters_t; /** struct containing a string */ typedef struct mumu_string_t{ char *string; int length; //string length (not including \0) }mumu_string_t; #define EMPTY_STRING {NULL,0} int mumu_string_append(mumu_string_t *string, const char *psz_format, ...); void mumu_free_string(mumu_string_t *string); int mumudvb_poll(fds_t *fds); char *mumu_string_replace(char *source, int *length, int can_realloc, char *toreplace, char *replacement); int string_comput(char *string); long int mumu_timing(); #endif mumudvb-1.7.1/src/mumudvb_common.c000066400000000000000000000171171177353207000171750ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * Based on dvbstream by (C) Dave Chapman 2001, 2002. * * (C) 2004-2011 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /** @file * @brief This file contains some common functions */ #include "mumudvb.h" #include "log.h" #include "errors.h" #include #include #include #include #include #include static char *log_module="Common: "; /** @brief : poll the file descriptors fds with a limit in the number of errors * * @param fds : the file descriptors */ int mumudvb_poll(fds_t *fds) { int poll_try; int poll_eintr=0; int last_poll_error; int Interrupted; poll_try=0; poll_eintr=0; last_poll_error=0; while((poll (fds->pfds, fds->pfdsnum, 500)<0)&&(poll_trylengthpattern) { tempstring=realloc(tempstring,sizeof(char)*(lengthtempstring+lengthreplacment-lengthpattern+1)); if(tempstring==NULL) { log_message(log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return NULL; } pospattern=strstr(tempstring,toreplace); } memmove(pospattern+lengthreplacment,pospattern+lengthpattern,lengthtempstring-((int)(pospattern-tempstring))-lengthpattern); memcpy(pospattern,replacement,lengthreplacment); lengthtempstring+=lengthreplacment-lengthpattern; pospattern=strstr(tempstring,toreplace); } tempstring[lengthtempstring-1]='\0'; if(can_realloc) { if(lengthtempstring>*length) { reallocresult=realloc(source,sizeof(char)*(lengthtempstring)); if(reallocresult==NULL) { log_message(log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return NULL; } source=reallocresult; *length=lengthtempstring; } strcpy(source,tempstring); } else if(lengthtempstring<=*length) { strcpy(source,tempstring); } else { strncpy(source,tempstring,*length-1); source[*length-1]='\0'; } free(tempstring); return source; } int string_mult(char *string); /** @brief Evaluate a string containing sum and mult keeping the priority of the mult over the + * Ex : string_sum("2+2*3") returns 8 * @param string the string to evaluate */ int string_comput(char *string) { int number1,len; char *pluspos=NULL; char *tempchar; if(string==NULL) return 0; pluspos=strchr(string,'+'); if(pluspos==NULL) { len=strlen(string); } else { len=pluspos-string; } tempchar=malloc(sizeof(char)*(len+1)); strncpy(tempchar,string,len); tempchar[len]='\0'; number1=string_mult(tempchar); free(tempchar); if(pluspos==NULL) return number1; if(strchr(pluspos+1,'+')!=NULL) return number1+string_comput(pluspos+1); return number1+string_mult(pluspos+1); } /** @brief Evaluate a string containing a multiplication. Doesn't work if there is a sum inside * Ex : string_sum("2*6") returns 6 * @param string the string to evaluate */ int string_mult(char *string) { int number1,len; char *multpos=NULL; char *tempchar; multpos=strchr(string,'*'); if(multpos==NULL) return atoi(string); len=multpos-string; tempchar=malloc(sizeof(char)*(len+1)); strncpy(tempchar,string,len); tempchar[len]='\0'; number1=atoi(tempchar); free(tempchar); if(strchr(multpos+1,'*')!=NULL) return number1*string_mult(multpos+1); return number1*atoi(multpos+1); } /** @brief Special sprintf wich append the text to an existing string and allocate the memory for it */ int mumu_string_append(mumu_string_t *string, const char *psz_format, ...) { int size; va_list args; va_start( args, psz_format ); size=vsnprintf(NULL, 0, psz_format, args); va_end( args ); string->string=realloc(string->string,(string->length+size+1)*sizeof(char)); if(string->string==NULL) { log_message(log_module,MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return ERROR_MEMORY<<8; } va_start( args, psz_format ); vsnprintf(string->string+string->length, size+1, psz_format, args); string->length=string->length+size; va_end( args ); return 0; } /** @brief Free a MuMuDVB string */ void mumu_free_string(mumu_string_t *string) { if(string->string) { free(string->string); string->string=NULL; string->length=0; } } /** @brief return the time (in usec) elapsed between the two last calls of this function. */ long int mumu_timing() { static int started=0; static struct timeval oldtime; struct timeval tv; long delta; gettimeofday(&tv,NULL); if(started) { delta=(tv.tv_sec-oldtime.tv_sec)*1000000+(tv.tv_usec-oldtime.tv_usec); } else { delta=0; started=1; } oldtime=tv; return delta; } mumudvb-1.7.1/src/mumudvb_test.c000066400000000000000000000470461177353207000166700ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * Testing suite * * (C) 2010 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* The test files can be found here : http://mumudvb.braice.net/mumudvb/test/ */ // To compile this code, run "make check" #define PRESS_ENTER 1 #define FILES_TEST_READ_SDT_TS "tests/BBC123_pids0_18.dump.ts", "tests/TestDump17.ts"//,"tests/test_autoconf_numericableparis_PAT_SDT.ts","tests/astra_TP_11856.00V_PAT_SDT.ts" #define NUM_READ_SDT 100 #define NUM_FILES_TEST_READ_SDT 2 #define FILES_TEST_READ_RAND "tests/random_1.ts","tests/random_2.ts" #define NUM_FILES_TEST_READ_RAND 2 #define TEST_STRING_COMPUT "2+2*3+100" #define TEST_STRING_COMPUT_RES 108 #define FILES_TEST_AUTOCONF "tests/astra_TP_11856.00V_pids_0_18.ts","tests/test_autoconf_numericableparis.ts","tests/astra_TP_11856.00V_pids_0_18__2.ts","tests/BBC123.dump.ts","tests/Astra19.2-12187.50-German.cap" #define NUM_FILES_TEST_AUTOCONF 5 #include #include #include #include "ts.h" #include "mumudvb.h" #include "log.h" #include "autoconf.h" #include "rewrite.h" //Prototypes void autoconf_free_services(mumudvb_service_t *services); int autoconf_read_sdt(unsigned char *buf,int len, mumudvb_service_t *services); void autoconf_sort_services(mumudvb_service_t *services); //Functions implemented here void autoconf_print_services(mumudvb_service_t *services); int autoconf_count_services(mumudvb_service_t *services); int Interrupted; long real_start_time; multicast_parameters_t multicast_vars; extern log_params_t log_params; static char *log_module="======TEST======: "; void press_enter_func(int press_enter) { if(press_enter) { log_message( log_module, MSG_INFO,"================= Press enter to continue =========================\n"); getchar(); } else log_message( log_module, MSG_INFO,"===================================================================\n"); } int main(void) { int press_enter = PRESS_ENTER; //We initalise the logging parameters log_params.verbosity = 999; log_params.log_type=LOGGING_CONSOLE; log_message( log_module, MSG_INFO,"===================================================================\n"); log_message( log_module, MSG_INFO,"Testing program for MuMuDVB\n"); log_message( log_module, MSG_INFO,"===================================================================\n"); /**************************** Very basic test ****************************************************/ log_message( log_module, MSG_INFO,"===================================================================\n"); log_message( log_module, MSG_INFO,"Display Ca system id 1\n" ); log_message( log_module, MSG_INFO,"===================================================================\n"); log_message( log_module, MSG_INFO,"%s\n\n" ,ca_sys_id_to_str(1)); /**************************** Testing string compute *********************************************/ log_message( log_module, MSG_INFO,"===================================================================\n"); log_message( log_module, MSG_INFO,"Testing string compute %s\n",TEST_STRING_COMPUT ); log_message( log_module, MSG_INFO,"===================================================================\n"); int resultat; resultat=string_comput(TEST_STRING_COMPUT); if(resultat==TEST_STRING_COMPUT_RES) log_message( log_module, MSG_INFO,"%d -- PASS\n\n" ,resultat); else log_message( log_module, MSG_INFO,"%d -- FAIL\n\n" ,resultat); char *ip0="239.100+3.%card+1.%number"; char ip[80]; char ipd[80]; strcpy(ip,ip0); int len=80; int n[4]; mumu_string_replace(ip,&len,0,"%number","1"); mumu_string_replace(ip,&len,0,"%card","42"); mumu_string_replace(ip,&len,0,"%tuner","0"); mumu_string_replace(ip,&len,0,"%server","0"); // Compute the string, ex: 239.255.130+0*10+2.1 log_message( log_module, MSG_DEBUG,"Computing expressions in string \"%s\"\n",ip); char *sptr; //Splitting and computing. use of strtok_r because it's safer n[0]=string_comput(strtok_r (ip,".",&sptr)); n[1]=string_comput(strtok_r (NULL,".",&sptr)); n[2]=string_comput(strtok_r (NULL,".",&sptr)); n[3]=string_comput(strtok_r (NULL,".",&sptr)); log_message( log_module, MSG_DEBUG,"%d.%d.%d.%d",n[0],n[1],n[2],n[3]); char *ip1="239.100+300.abcdef"; strcpy(ip,ip1); log_message( log_module, MSG_DEBUG,"Computing expressions in string \"%s\"\n",ip); //Splitting and computing. use of strtok_r because it's safer n[0]=string_comput(strtok_r (ip,".",&sptr)); n[1]=string_comput(strtok_r (NULL,".",&sptr)); n[2]=string_comput(strtok_r (NULL,".",&sptr)); n[3]=string_comput(strtok_r (NULL,".",&sptr)); log_message( log_module, MSG_DEBUG,"%d.%d.%d.%d",n[0],n[1],n[2],n[3]); /************************************* Testing the SDT parser *************************************/ char *files_sdt[NUM_FILES_TEST_READ_SDT]={FILES_TEST_READ_SDT_TS}; for(int i_file=0;i_filepid); if(pid != 17) continue; log_message( log_module, MSG_DEBUG,"New elementary (188bytes TS packet) pid %d continuity_counter %d", pid, ((ts_header_t *)ts_packet_raw)->continuity_counter ); iRet=get_ts_packet(ts_packet_raw, &ts_packet_mumu); //If it's the beginning of a new packet we display some information if(((ts_header_t *)ts_packet_raw)->payload_unit_start_indicator) log_message(log_module, MSG_FLOOD, "First two bytes of the packet 0x%02x %02x", ts_packet_mumu.data_partial[0], ts_packet_mumu.data_partial[1]); if(iRet==1)//packet is parsed { log_message( log_module, MSG_INFO,"New packet -- parsing\n" ); num_sdt_read++; autoconf_read_sdt(ts_packet_mumu.data_full,ts_packet_mumu.len_full,&services); } } log_message( log_module, MSG_INFO,"Final services list .... \n"); autoconf_print_services(&services); log_message( log_module, MSG_INFO,"===================================================================\n"); log_message( log_module, MSG_INFO,"Testing service sorting on this list\n" ); press_enter_func(press_enter); autoconf_sort_services(&services); autoconf_print_services(&services); //We free starting at the next since the first is not malloc'ed autoconf_free_services(services.next); fclose(testfile); } else log_message( log_module, MSG_INFO,"Test file %s cannot be open : %s\n", files_sdt[i_file],strerror(errno) ); } /************************************* Testing the resistance to strange data *********************/ log_message( log_module, MSG_INFO,"===================================================================\n"); char *files_rand[NUM_FILES_TEST_READ_RAND]={FILES_TEST_READ_RAND}; for(int i_file=0;i_filepacketmutex,NULL); while(fread(actual_ts_packet,TS_PACKET_SIZE,1, testfile)) { // get the pid of the received ts packet pid = ((actual_ts_packet[1] & 0x1f) << 8) | (actual_ts_packet[2]); if( (pid == 17) ) //This is a SDT PID { //we check the new packet and if it's fully updated we set the skip to 0 if(sdt_rewrite_new_global_packet(actual_ts_packet, &rewrite_vars)==1) { log_message( log_module, MSG_DETAIL,"The SDT version changed, we force the update of all the channels.\n"); for (int curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) chan_and_pids.channels[curr_channel].sdt_rewrite_skip=0; } for (int curr_channel = 0; curr_channel < chan_and_pids.number_of_channels; curr_channel++) { if(!chan_and_pids.channels[curr_channel].sdt_rewrite_skip ) //AND the generation was successful sdt_rewrite_new_channel_packet(actual_ts_packet, &rewrite_vars, &chan_and_pids.channels[curr_channel], curr_channel); } } } fclose(testfile); log_message( log_module, MSG_INFO,"===================================================================\n"); log_message( log_module, MSG_INFO,"End of testing SDT rewritef\n"); log_message( log_module, MSG_INFO,"===================================================================\n"); } } else log_message( log_module, MSG_INFO,"No channels generated by the autoconfiguration\n"); autoconf_freeing(&autoconf_vars); } else log_message( log_module, MSG_INFO,"Test file %s cannot be open : %s\n", files_rand[i_file], strerror(errno) ); } /**************************************************************************************************/ /**************************************************************************************************/ //log_message( log_module, MSG_INFO,"===================================================================\n"); //press_enter_func(press_enter); /**************************************************************************************************/ /**************************************************************************************************/ log_message( log_module, MSG_INFO,"===================================================================\n"); log_message( log_module, MSG_INFO,"=========================== Testing done ==========================\n"); } void autoconf_print_services(mumudvb_service_t *services) { mumudvb_service_t *act_service; if(services) act_service=services->next; else act_service=NULL; while(act_service!=NULL) { log_message( log_module, MSG_INFO,"Services listing\n"); log_message( log_module, MSG_INFO,"Service : id %d running_status %d free_ca_mode %d\n", act_service->id, act_service->running_status, act_service->free_ca_mode); log_message( log_module, MSG_INFO,"name %s\n", act_service->name); log_message( log_module, MSG_INFO,"pmt_pid %d\n", act_service->pmt_pid); display_service_type(act_service->type, MSG_DEBUG,log_module); act_service=act_service->next; } } mumudvb-1.7.1/src/network.c000066400000000000000000000227341177353207000156400ustar00rootroot00000000000000/* * udp.h fonction in order to send a multicast stream * mumudvb - UDP-ize a DVB transport stream. * * (C) 2004-2009 Brice DUBOST * (C) Dave Chapman 2001, 2002. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /**@file * @brief Networking functions */ #include "network.h" #include "errors.h" #include #include #include #include "log.h" #include extern int Interrupted; static char *log_module="Network: "; /**@brief Send data * just send the data over the socket fd */ int sendudp (int fd, struct sockaddr_in *sSockAddr, unsigned char *data, int len) { return sendto (fd, data, len, 0, (struct sockaddr *) sSockAddr, sizeof (*sSockAddr)); } /**@brief Send data * just send the data over the socket fd */ int sendudp6 (int fd, struct sockaddr_in6 *sSockAddr, unsigned char *data, int len) { return sendto (fd, data, len, 0, (struct sockaddr *) sSockAddr, sizeof (*sSockAddr)); } /** @brief create a sender socket. * * Create a socket for sending data, the socket is multicast, udp, with the options REUSE_ADDR et MULTICAST_LOOP set to 1 */ int makesocket (char *szAddr, unsigned short port, int TTL, char *iface, struct sockaddr_in *sSockAddr) { int iRet, iLoop = 1; struct sockaddr_in sin; int iReuse = 1; int iSocket = socket (AF_INET, SOCK_DGRAM, 0); if (iSocket < 0) { log_message( log_module, MSG_WARN, "socket() failed : %s\n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } sSockAddr->sin_family = sin.sin_family = AF_INET; sSockAddr->sin_port = sin.sin_port = htons (port); iRet=inet_aton (szAddr,&sSockAddr->sin_addr); if (iRet == 0) { log_message( log_module, MSG_ERROR,"inet_aton failed : %s\n", strerror(errno)); Interrupted=ERROR_NETWORK<<8; } iRet = setsockopt (iSocket, SOL_SOCKET, SO_REUSEADDR, &iReuse, sizeof (int)); if (iRet < 0) { log_message( log_module, MSG_ERROR,"setsockopt SO_REUSEADDR failed : %s\n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } iRet = setsockopt (iSocket, IPPROTO_IP, IP_MULTICAST_TTL, &TTL, sizeof (int)); if (iRet < 0) { log_message( log_module, MSG_ERROR,"setsockopt IP_MULTICAST_TTL failed. multicast in kernel? error : %s \n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } iRet = setsockopt (iSocket, IPPROTO_IP, IP_MULTICAST_LOOP, &iLoop, sizeof (int)); if (iRet < 0) { log_message( log_module, MSG_ERROR,"setsockopt IP_MULTICAST_LOOP failed. multicast in kernel? error : %s\n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } if(strlen(iface)) { int iface_index; iface_index = if_nametoindex(iface); log_message( log_module, MSG_FLOOD, "Setting Ipv4 multicast iface to %s, index %d",iface,iface_index); iRet = setsockopt (iSocket, IPPROTO_IP, IP_MULTICAST_IF, &iface_index, sizeof (int)); if (iRet < 0) { log_message( log_module, MSG_ERROR,"setsockopt IP_MULTICAST_IF failed. multicast in kernel? error : %s \n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } } return iSocket; } /** @brief create an IPv6 sender socket. * * Create a socket for sending data, the socket is multicast, udp, with the options REUSE_ADDR et MULTICAST_LOOP set to 1 */ int makesocket6 (char *szAddr, unsigned short port, int TTL, char *iface, struct sockaddr_in6 *sSockAddr) { int iRet; int iReuse=1; struct sockaddr_in6 sin; int iSocket = socket (AF_INET6, SOCK_DGRAM, IPPROTO_UDP); if (iSocket < 0) { log_message( log_module, MSG_WARN, "socket() failed : %s\n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } sSockAddr->sin6_family = sin.sin6_family = AF_INET6; sSockAddr->sin6_port = sin.sin6_port = htons (port); iRet=inet_pton (AF_INET6, szAddr,&sSockAddr->sin6_addr); if (iRet == 0) { log_message( log_module, MSG_ERROR,"inet_pton failed : %s\n", strerror(errno)); Interrupted=ERROR_NETWORK<<8; } iRet = setsockopt (iSocket, SOL_SOCKET, SO_REUSEADDR, &iReuse, sizeof (int)); if (iRet < 0) { log_message( log_module, MSG_ERROR,"setsockopt SO_REUSEADDR failed : %s\n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } iRet = setsockopt (iSocket, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &TTL, sizeof (int)); if (iRet < 0) { log_message( log_module, MSG_ERROR,"setsockopt IPV6_MULTICAST_HOPS failed. multicast in kernel? error : %s \n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } if(strlen(iface)) { int iface_index; iface_index = if_nametoindex(iface); log_message( log_module, MSG_FLOOD, "Setting Ipv6 multicast iface to %s, index %d",iface,iface_index); iRet = setsockopt (iSocket, IPPROTO_IPV6, IPV6_MULTICAST_IF, &iface_index, sizeof (int)); if (iRet < 0) { log_message( log_module, MSG_ERROR,"setsockopt IPV6_MULTICAST_IF failed. multicast in kernel? error : %s \n",strerror(errno)); Interrupted=ERROR_NETWORK<<8; } } return iSocket; } /** @brief create a receiver socket, i.e. join the multicast group. *@todo document */ int makeclientsocket (char *szAddr, unsigned short port, int TTL, char *iface, struct sockaddr_in *sSockAddr) { int socket = makesocket (szAddr, port, TTL, iface, sSockAddr); struct ip_mreq blub; struct sockaddr_in sin; unsigned int tempaddr; sin.sin_family = AF_INET; sin.sin_port = htons (port); sin.sin_addr.s_addr = inet_addr (szAddr); if (bind (socket, (struct sockaddr *) &sin, sizeof (sin))) { log_message( log_module, MSG_ERROR, "bind failed : %s\n", strerror(errno)); Interrupted=ERROR_NETWORK<<8; } tempaddr = inet_addr (szAddr); if ((ntohl (tempaddr) >> 28) == 0xe) { blub.imr_multiaddr.s_addr = inet_addr (szAddr); blub.imr_interface.s_addr = 0; if (setsockopt (socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &blub, sizeof (blub))) { log_message( log_module, MSG_ERROR, "setsockopt IP_ADD_MEMBERSHIP ipv4 failed (multicast kernel?) : %s\n", strerror(errno)); Interrupted=ERROR_NETWORK<<8; } } return socket; } /** @brief create a receiver socket, i.e. join the multicast group. *@todo document */ int makeclientsocket6 (char *szAddr, unsigned short port, int TTL, char *iface, struct sockaddr_in6 *sSockAddr) { int socket = makesocket6 (szAddr, port, TTL, iface, sSockAddr); struct ipv6_mreq blub; struct sockaddr_in6 sin; int iRet; sin.sin6_family = AF_INET; sin.sin6_port = htons (port); iRet=inet_pton (AF_INET6, szAddr,&sin.sin6_addr); if (iRet == 0) { log_message( log_module, MSG_ERROR,"inet_pton failed : %s\n", strerror(errno)); Interrupted=ERROR_NETWORK<<8; return 0; } if (bind (socket, (struct sockaddr *) &sin, sizeof (sin))) { log_message( log_module, MSG_ERROR, "bind failed : %s\n", strerror(errno)); Interrupted=ERROR_NETWORK<<8; } //join the group inet_pton (AF_INET6, szAddr,&blub.ipv6mr_multiaddr); blub.ipv6mr_interface = 0; if (setsockopt (socket, IPPROTO_IPV6, IPV6_JOIN_GROUP, &blub, sizeof (blub))) { log_message( log_module, MSG_ERROR, "setsockopt IPV6_JOIN_GROUP (ipv6) failed (multicast kernel?) : %s\n", strerror(errno)); Interrupted=ERROR_NETWORK<<8; } return socket; } /** @brief create a TCP receiver socket. * * Create a socket for waiting the HTTP connection */ int makeTCPclientsocket (char *szAddr, unsigned short port, struct sockaddr_in *sSockAddr) { int iRet, iLoop = 1; int iSocket = socket (AF_INET, SOCK_STREAM, 0); //TCP if (iSocket < 0) { log_message( log_module, MSG_ERROR, "socket() failed.\n"); return -1; } sSockAddr->sin_family = AF_INET; sSockAddr->sin_port = htons (port); iRet=inet_aton (szAddr,&sSockAddr->sin_addr); if (iRet == 0) { log_message( log_module, MSG_ERROR,"inet_aton failed : %s\n", strerror(errno)); return -1; } iRet = setsockopt (iSocket, SOL_SOCKET, SO_REUSEADDR, &iLoop, sizeof (int)); if (iRet < 0) { log_message( log_module, MSG_ERROR,"setsockopt SO_REUSEADDR failed : %s\n", strerror(errno)); return -1; } if (bind (iSocket, (struct sockaddr *) sSockAddr, sizeof (*sSockAddr))) { log_message( log_module, MSG_ERROR, "bind failed : %s\n", strerror(errno)); return -1; } iRet = listen(iSocket,10); if (iRet < 0) { log_message( log_module, MSG_ERROR,"listen failed : %s\n",strerror(errno)); return -1; } //Now we set this socket to be non blocking because we poll it int flags; flags = fcntl(iSocket, F_GETFL, 0); flags |= O_NONBLOCK; if (fcntl(iSocket, F_SETFL, flags) < 0) { log_message( log_module, MSG_ERROR,"Set non blocking failed : %s\n",strerror(errno)); return -1; } return iSocket; } mumudvb-1.7.1/src/network.h000066400000000000000000000037021177353207000156370ustar00rootroot00000000000000/* * mumudvb - UDP-ize a DVB transport stream. * Based on dvbstream by (C) Dave Chapman 2001, 2002. * * (C) 2004-2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /**@file * @brief Networking functions */ #ifndef _NETWORK_H #define _NETWORK_H #include #include #include #include #include #include #include #include /** The default time to live*/ #define DEFAULT_TTL 2 int makeclientsocket (char *szAddr, unsigned short port, int TTL, char *iface, struct sockaddr_in *sSockAddr); int sendudp (int fd, struct sockaddr_in *sSockAddr, unsigned char *data, int len); int makesocket (char *szAddr, unsigned short port, int TTL, char *iface, struct sockaddr_in *sSockAddr); int makeTCPclientsocket (char *szAddr, unsigned short port, struct sockaddr_in *sSockAddr); int makeclientsocket6 (char *szAddr, unsigned short port, int TTL, char *iface, struct sockaddr_in6 *sSockAddr); int sendudp6 (int fd, struct sockaddr_in6 *sSockAddr, unsigned char *data, int len); int makesocket6 (char *szAddr, unsigned short port, int TTL, char *iface, struct sockaddr_in6 *sSockAddr); #endif mumudvb-1.7.1/src/pat_rewrite.c000066400000000000000000000276261177353207000165010ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * * (C) 2004-2011 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /**@file * @brief This file contains the function for rewriting the pat pid * * The pat rewrite is made to announce only the video stream associated with the channel in the PAT pid * Some set top boxes need it. */ #include #include #include "mumudvb.h" #include "ts.h" #include "rewrite.h" #include "log.h" #include extern uint32_t crc32_table[256]; static char *log_module="PAT Rewrite: "; /** @brief, tell if the pat have a newer version than the one recorded actually * In the PAT pid there is a field to say if the PAT was updated * This function check if it has changed (in order to rewrite the pat only once) * General Note : in case it change during streaming it can be a problem ane we would have to deal with re-autoconfiguration * Note this function can give flase positive since it doesn't check the CRC32 * *@param rewrite_vars the parameters for pat rewriting *@param buf : the received buffer */ int pat_need_update(rewrite_parameters_t *rewrite_vars, unsigned char *buf) { pat_t *pat=(pat_t*)(get_ts_begin(buf)); if(pat) //It's the beginning of a new packet { /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(pat->current_next_indicator == 0) { return 0; } if(pat->version_number!=rewrite_vars->pat_version) { log_message( log_module, MSG_DEBUG,"Need update. stored version : %d, new: %d\n",rewrite_vars->pat_version,pat->version_number); return 1; } } return 0; } /** @brief update the version using the dowloaded pat*/ void update_pat_version(rewrite_parameters_t *rewrite_vars) { pat_t *pat=(pat_t*)(rewrite_vars->full_pat->data_full); if(rewrite_vars->pat_version!=pat->version_number) { log_message( log_module, MSG_DEBUG,"New pat version. Old : %d, new: %d\n",rewrite_vars->pat_version,pat->version_number); if(rewrite_vars->pat_version!=-1) log_message( log_module, MSG_WARN,"The PAT version changed, so the channels changed probably. If you are using autoconfiguration it's safer to relaunch MuMuDVB or if the PIDs are set manually, check the PMTs. It can also happend when services are added/removed\n"); } rewrite_vars->pat_version=pat->version_number; } /** @brief Main function for pat rewriting * The goal of this function is to make a new pat with only the announement for the streamed channel * by default it contains all the channels of the transponder. For each channel descriptor this function will search * the pmt pid of the channel in the given pid list. if found it keeps it otherwise it drops. * At the end, a new CRC32 is computed. The buffer is overwritten, so the caller have to save it before. * * @param rewrite_vars the parameters for pat rewriting * @param channels The array of channels * @param curr_channel the channel for wich we want to generate a PAT * @param buf : the received buffer, to get the TS header */ int pat_channel_rewrite(rewrite_parameters_t *rewrite_vars, mumudvb_channel_t *channel, unsigned char *buf, int curr_channel) { ts_header_t *ts_header=(ts_header_t *)buf; pat_t *pat=(pat_t*)(rewrite_vars->full_pat->data_full); pat_prog_t *prog; unsigned long crc32; //destination buffer unsigned char buf_dest[TS_PACKET_SIZE]; int buf_dest_pos=0; int delta=PAT_LEN; int section_length=0; int i; int new_section_length; if(ts_header->payload_unit_start_indicator) { log_message( log_module, MSG_DEBUG,"PAT rewrite : pointer field 0x%x \n", buf[TS_HEADER_LEN-1]); } section_length=HILO(pat->section_length); //lets start the copy //we copy the ts header and adapt it a bit //the continuity counter is updated elswhere ts_header->payload_unit_start_indicator=1; buf[TS_HEADER_LEN-1]=0;//we erase the pointer field memcpy(buf_dest,ts_header,TS_HEADER_LEN); //we copy the modified PAT header pat->current_next_indicator=1; //applicable immediately pat->section_number=0; //only one pat pat->last_section_number=0; memcpy(buf_dest+TS_HEADER_LEN,pat,PAT_LEN); buf_dest_pos=TS_HEADER_LEN+PAT_LEN; //We copy what we need : EIT announce and present PMT announce //strict comparaison due to the calc of section len cf down while((delta+PAT_PROG_LEN)<(section_length)) { prog=(pat_prog_t*)((char*)rewrite_vars->full_pat->data_full+delta); if(HILO(prog->program_number)!=0) { /*We check the transport stream id if present and the size of the packet*/ /* + 4 for the CRC32*/ if((buf_dest_pos+PAT_PROG_LEN+4service_id || (channel->service_id == HILO(prog->program_number)) )) { for(i=0;inum_pids;i++) if(channel->pids[i]==HILO(prog->network_pid)) { if(buf_dest_pos+PAT_PROG_LEN+4+1>TS_PACKET_SIZE) //The +4 is for CRC32 +1 is because indexing starts at 0 { log_message( log_module, MSG_WARN,"The generated PAT is too big for channel %d : \"%s\", we skip the other pids/programs\n", curr_channel, channel->name); i=channel->num_pids; } else { log_message( log_module, MSG_DETAIL,"NEW program for channel %d : \"%s\". PMT pid : %d\n", curr_channel, channel->name,channel->pids[i]); /*we found a announce for a PMT pid in our stream, we keep it*/ memcpy(buf_dest+buf_dest_pos,rewrite_vars->full_pat->data_full+delta,PAT_PROG_LEN); buf_dest_pos+=PAT_PROG_LEN; } } } else log_message( log_module, MSG_DEBUG,"Program dropped because of service_id. channel %d :\"%s\". service_id chan : %d service_id prog %d\n", curr_channel, channel->name, channel->service_id, HILO(prog->program_number)); } delta+=PAT_PROG_LEN; } //we compute the new section length //section lenght is the size of the section after section_length (crc32 included : 4 bytes) //so it's size of the crc32 + size of the pat prog + size of the pat header - 3 first bytes (the pat header until section length included) //Finally it's total_pat_data_size + 1 new_section_length=buf_dest_pos-TS_HEADER_LEN + 1; //We write the new section length buf_dest[1+TS_HEADER_LEN]=(((new_section_length)&0x0f00)>>8) | (0xf0 & buf_dest[1+TS_HEADER_LEN]); buf_dest[2+TS_HEADER_LEN]=new_section_length & 0xff; //CRC32 calculation inspired by the xine project //Now we must adjust the CRC32 //we compute the CRC32 crc32=0xffffffff; for(i = 0; i < new_section_length-1; i++) { crc32 = (crc32 << 8) ^ crc32_table[((crc32 >> 24) ^ buf_dest[i+TS_HEADER_LEN])&0xff]; } //We write the CRC32 to the buffer /** @todo check if Is this one safe with little/big endian ?*/ buf_dest[buf_dest_pos]=(crc32>>24) & 0xff; buf_dest_pos+=1; buf_dest[buf_dest_pos]=(crc32>>16) & 0xff; buf_dest_pos+=1; buf_dest[buf_dest_pos]=(crc32>>8) & 0xff; buf_dest_pos+=1; buf_dest[buf_dest_pos]=crc32 & 0xff; buf_dest_pos+=1; //Padding with 0xFF memset(buf_dest+buf_dest_pos,0xFF,TS_PACKET_SIZE-buf_dest_pos); //We copy the result to the intended buffer memcpy(channel->generated_pat,buf_dest,TS_PACKET_SIZE); //Everything is Ok .... return 1; } /** @brief This function is called when a new PAT packet for all channels is there and we asked for rewrite * this function save the full PAT wich will be the source PAT for all the channels */ void pat_rewrite_new_global_packet(unsigned char *ts_packet, rewrite_parameters_t *rewrite_vars) { /*Check the version before getting the full packet*/ if(!rewrite_vars->pat_needs_update) { rewrite_vars->pat_needs_update=pat_need_update(rewrite_vars,ts_packet); } /*We need to update the full packet, we download it*/ if(rewrite_vars->pat_needs_update) { if(get_ts_packet(ts_packet,rewrite_vars->full_pat)) { pat_t *pat=(pat_t*)(rewrite_vars->full_pat->data_full); /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(pat->current_next_indicator == 0) { log_message( log_module, MSG_FLOOD,"PAT not yet valid, we get a new one (current_next_indicator == 0)\n"); } else { log_message( log_module, MSG_DEBUG,"Full PAT updated\n"); /*We've got the FULL PAT packet*/ update_pat_version(rewrite_vars); rewrite_vars->pat_needs_update=0; rewrite_vars->full_pat_ok=1; ts_display_pat(log_module,rewrite_vars->full_pat->data_full); } } } //To avoid the duplicates, we have to update the continuity counter rewrite_vars->pat_continuity_counter++; rewrite_vars->pat_continuity_counter= rewrite_vars->pat_continuity_counter % 32; } /** @brief This function is called when a new PAT packet for a channel is there and we asked for rewrite * This function copy the rewritten PAT to the buffer. And checks if the PAT was changed so the rewritten version have to be updated */ int pat_rewrite_new_channel_packet(unsigned char *ts_packet, rewrite_parameters_t *rewrite_vars, mumudvb_channel_t *channel, int curr_channel) { if(rewrite_vars->full_pat_ok ) //the global full pat is ok { /*We check if it's the first pat packet ? or we send it each time ?*/ /*We check if the versions corresponds*/ if(!rewrite_vars->pat_needs_update && channel->generated_pat_version!=rewrite_vars->pat_version)//We check the version only if the PAT is not currently updated { log_message( log_module, MSG_DEBUG,"We need to rewrite the PAT for the channel %d : \"%s\"\n", curr_channel, channel->name); /*They mismatch*/ /*We generate the rewritten packet*/ if(pat_channel_rewrite(rewrite_vars, channel, ts_packet, curr_channel)) { /*We update the version*/ channel->generated_pat_version=rewrite_vars->pat_version; } else { log_message( log_module, MSG_DEBUG,"ERROR with the PAT for the channel %d : \"%s\"\n", curr_channel, channel->name); return 0; } } if(channel->generated_pat_version==rewrite_vars->pat_version) { /*We send the rewrited PAT from channel->generated_pat*/ memcpy(ts_packet,channel->generated_pat,TS_PACKET_SIZE); //To avoid the duplicates, we have to update the continuity counter set_continuity_counter(ts_packet,rewrite_vars->pat_continuity_counter); } else { return 0; log_message( log_module, MSG_DEBUG,"Bad pat channel version, we don't send the pat for the channel %d : \"%s\"\n", curr_channel, channel->name); } } else { return 0; log_message( log_module, MSG_DEBUG,"We need a global pat update, we don't send the pat for the channel %d : \"%s\"\n", curr_channel, channel->name); } return 1; } mumudvb-1.7.1/src/rewrite.c000066400000000000000000000107401177353207000156220ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * * (C) 2004-2010 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /**@file * @brief This file contains the general functions for rewriting */ #include #include #include "mumudvb.h" #include "ts.h" #include "rewrite.h" #include "log.h" #include static char *log_module="Rewrite: "; /** @brief Read a line of the configuration file to check if there is a rewrite parameter * * @param rewrite_vars the autoconfiguration parameters * @param substring The currrent line */ int read_rewrite_configuration(rewrite_parameters_t *rewrite_vars, char *substring) { char delimiteurs[] = CONFIG_FILE_SEPARATOR; if (!strcmp (substring, "rewrite_pat")) { substring = strtok (NULL, delimiteurs); if(atoi (substring)) { rewrite_vars->rewrite_pat = OPTION_ON; log_message( log_module, MSG_INFO, "You have enabled the PAT Rewriting\n"); } else rewrite_vars->rewrite_pat = OPTION_OFF; } else if (!strcmp (substring, "rewrite_sdt")) { substring = strtok (NULL, delimiteurs); if(atoi (substring)) { rewrite_vars->rewrite_sdt = OPTION_ON; log_message( log_module, MSG_INFO, "You have enabled the SDT Rewriting\n"); } else rewrite_vars->rewrite_sdt = OPTION_OFF; } else if (!strcmp (substring, "sort_eit")) { substring = strtok (NULL, delimiteurs); if(atoi (substring)) { rewrite_vars->eit_sort = OPTION_ON; log_message( log_module, MSG_INFO, "You have enabled the sort of the EIT PID\n"); } else rewrite_vars->eit_sort = OPTION_OFF; } else if (!strcmp (substring, "sdt_force_eit")) { substring = strtok (NULL, delimiteurs); if(atoi (substring)) { rewrite_vars->sdt_force_eit = OPTION_ON; log_message( log_module, MSG_INFO, "You have enabled the forcing of the EIT flag in the SDT rewrite\n"); } else rewrite_vars->sdt_force_eit = OPTION_OFF; } else return 0; //Nothing concerning rewrite, we return 0 to explore the other possibilities return 1;//We found something for rewrite, we tell main to go for the next line } /** @brief Just a small function to change the continuity counter of a packet * This function will overwrite the continuity counter of the packet with the one given in argument * */ void set_continuity_counter(unsigned char *buf,int continuity_counter) { ts_header_t *ts_header=(ts_header_t *)buf; ts_header->continuity_counter=continuity_counter; } /** @brief This function tells if we have to send the EIT packet */ int eit_sort_new_packet(unsigned char *ts_packet, mumudvb_channel_t *channel) { int send_packet=1; ts_header_t *ts_header=(ts_header_t *)ts_packet; eit_t *eit_header=(eit_t*)(get_ts_begin(ts_packet)); if(ts_header->payload_unit_start_indicator && eit_header) //New packet ? { if((channel->service_id) && (channel->service_id!= (HILO(eit_header->service_id)))) { send_packet=0; channel->eit_dropping=1; //We say that we will drop all the other parts of this packet } else { channel->eit_dropping=0;//We say that we will keep all the other parts of this packet } } else if(channel->eit_dropping) //It's not the beginning of a new packet and we drop the beginning, we continue dropping send_packet=0; if(send_packet) { /*We set the continuity counter*/ set_continuity_counter(ts_packet,channel->eit_continuity_counter); /*To avoid discontinuities, we have to update the continuity counter*/ channel->eit_continuity_counter++; channel->eit_continuity_counter= channel->eit_continuity_counter % 16; return 1; } return 0; } mumudvb-1.7.1/src/rewrite.h000066400000000000000000000062761177353207000156400ustar00rootroot00000000000000/* * mumudvb - UDP-ize a DVB transport stream. * * (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /**@file * @brief This file contains the headers for the functions for rewriting the pat pid * * The pat rewrite is made to announce only the video stream associated with the channel in the PAT pid * Some set top boxes need it */ #include #include #include "mumudvb.h" #include "ts.h" #include /** @brief the parameters for the rewriting * This structure contain the parameters needed for rewriting */ typedef struct rewrite_parameters_t{ /**Do we rewrite the PAT pid ?*/ option_status_t rewrite_pat; /**The actual version of the PAT pid*/ int pat_version; /**Do the actual full PAT needs to be updated ?*/ int pat_needs_update; /**Do the full PAT is ok ?*/ int full_pat_ok; /** The Complete PAT PID */ mumudvb_ts_packet_t *full_pat; /** The continuity counter of the sent PAT*/ int pat_continuity_counter; /**Do we rewrite the SDT pid ?*/ option_status_t rewrite_sdt; /**The actual version of the SDT pid*/ int sdt_version; /**Do the actual full SDT needs to be updated ?*/ int sdt_needs_update; /** Do we need to see other SDT ?*/ int sdt_need_others; /** The last_section_number of the current version */ int sdt_last_section_number; /** Array storing the section numbers we saw */ int sdt_section_numbers_seen[256]; /**Do the full SDT is ok ?*/ int full_sdt_ok; /** The Complete SDT PID */ mumudvb_ts_packet_t *full_sdt; /** The continuity counter of the sent SDT*/ int sdt_continuity_counter; /** Do we force the EIT presence ? */ int sdt_force_eit; /** Do we sort the EIT PID ?*/ option_status_t eit_sort; }rewrite_parameters_t; int read_rewrite_configuration(rewrite_parameters_t *rewrite_vars, char *substring); void pat_rewrite_new_global_packet(unsigned char *ts_packet, rewrite_parameters_t *rewrite_vars); int pat_rewrite_new_channel_packet(unsigned char *ts_packet, rewrite_parameters_t *rewrite_vars, mumudvb_channel_t *channel, int curr_channel); int sdt_rewrite_new_global_packet(unsigned char *ts_packet, rewrite_parameters_t *rewrite_vars); int sdt_rewrite_new_channel_packet(unsigned char *ts_packet, rewrite_parameters_t *rewrite_vars, mumudvb_channel_t *channel, int curr_channel); void set_continuity_counter(unsigned char *buf,int continuity_counter); int eit_sort_new_packet(unsigned char *ts_packet, mumudvb_channel_t *channel); mumudvb-1.7.1/src/rtp.c000066400000000000000000000071671177353207000147570ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * * (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * This file contains the functions concerning the RTP header */ #include "mumudvb.h" #include #include /**@brief : This function add the RTP header to a channel * * Note : it reset the buffer of the channel * * @param channel the channel to be initialised */ void init_rtp_header(mumudvb_channel_t *channel) { // See RFC 1889 channel->buf_with_rtp_header[0]=128; //version=2 padding=0 extension=0 CSRC=0 channel->buf_with_rtp_header[1]=33; // marker=0 payload type=33 (MP2T) channel->buf_with_rtp_header[2]=0; // sequence number channel->buf_with_rtp_header[3]=0; // sequence number channel->buf_with_rtp_header[4]=0; // timestamp channel->buf_with_rtp_header[5]=0; // timestamp channel->buf_with_rtp_header[6]=0; // timestamp channel->buf_with_rtp_header[7]=0; // timestamp channel->buf_with_rtp_header[8]= (char)(rand() % 256); // synchronization source channel->buf_with_rtp_header[9]= (char)(rand() % 256); // synchronization source channel->buf_with_rtp_header[10]=(char)(rand() % 256); // synchronization source channel->buf_with_rtp_header[11]=(char)(rand() % 256); // synchronization source } void rtp_update_sequence_number(mumudvb_channel_t *channel) { /* From RFC 2250 RTP Format for MPEG1/MPEG2 Video January 1998 Each RTP packet will contain a timestamp derived from the sender's 90KHz clock reference. This clock is synchronized to the system stream Program Clock Reference (PCR) or System Clock Reference (SCR) and represents the target transmission time of the first byte of the packet payload. The RTP timestamp will not be passed to the MPEG decoder. This use of the timestamp is somewhat different than normally is the case in RTP, in that it is not considered to be the media display or presentation timestamp. The primary purposes of the RTP timestamp will be to estimate and reduce any network-induced jitter and to synchronize relative time drift between the transmitter and receiver.*/ struct timeval tv; uint32_t timestamp; gettimeofday(&tv, NULL); timestamp=(uint32_t) (90000 * (tv.tv_sec + tv.tv_usec/1000000.0)); // 90 kHz Clock // Change the header (sequence number) channel->buf_with_rtp_header[2]=(char)((channel->rtp_packet_num >> 8) & 0xff); // sequence number (high) channel->buf_with_rtp_header[3]=(char)(channel->rtp_packet_num & 0xff); // sequence number (low) channel->buf_with_rtp_header[4]=(timestamp>>24)&0x0FF; // timestamp channel->buf_with_rtp_header[5]=(timestamp>>16)&0x0FF; // timestamp channel->buf_with_rtp_header[6]=(timestamp>>8)&0x0FF; // timestamp channel->buf_with_rtp_header[7]=(timestamp)&0x0FF; // timestamp channel->rtp_packet_num++; channel->rtp_packet_num &= 0xffff; } mumudvb-1.7.1/src/rtp.h000066400000000000000000000021441177353207000147520ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * * (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * This file contains the headers concerning the RTP header */ #ifndef _RTP_H #define _RTP_H void init_rtp_header(mumudvb_channel_t *channel); void rtp_update_sequence_number(mumudvb_channel_t *channel); #endifmumudvb-1.7.1/src/sap.c000066400000000000000000000507131177353207000147300ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * * (C) 2008-2010 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief File for Session Announcement Protocol Announces * @author Brice DUBOST * @date 2008-2010 */ #include "sap.h" #include "network.h" #include #include #include #include "log.h" extern uint32_t crc32_table[256]; static char *log_module="SAP: "; int sap_add_program(mumudvb_channel_t *channel, sap_parameters_t *sap_vars, mumudvb_sap_message_t *sap_message4, mumudvb_sap_message_t *sap_message6, multicast_parameters_t multicast_vars); /** @brief Read a line of the configuration file to check if there is a sap parameter * * @param sap_vars the sap parameters * @param substring The currrent line */ int read_sap_configuration(sap_parameters_t *sap_vars, mumudvb_channel_t *current_channel, int ip_ok, char *substring) { char delimiteurs[] = CONFIG_FILE_SEPARATOR; if (!strcmp (substring, "sap")) { substring = strtok (NULL, delimiteurs); if(atoi (substring) != 0) sap_vars->sap = OPTION_ON; else sap_vars->sap = OPTION_OFF; if(sap_vars->sap == OPTION_ON) { log_message( log_module, MSG_INFO, "Sap announces will be sent\n"); } } else if (!strcmp (substring, "sap_interval")) { substring = strtok (NULL, delimiteurs); sap_vars->sap_interval = atoi (substring); } else if (!strcmp (substring, "sap_ttl")) { substring = strtok (NULL, delimiteurs); sap_vars->sap_ttl = atoi (substring); } else if (!strcmp (substring, "sap_organisation")) { // other substring extraction method in order to keep spaces substring = strtok (NULL, "="); if (!(strlen (substring) >= 255 - 1)) strcpy(sap_vars->sap_organisation,strtok(substring,"\n")); else { log_message( log_module, MSG_WARN,"Sap Organisation name too long\n"); strncpy(sap_vars->sap_organisation,strtok(substring,"\n"),255 - 1); } } else if (!strcmp (substring, "sap_uri")) { // other substring extraction method in order to keep spaces substring = strtok (NULL, "="); if (!(strlen (substring) >= 255 - 1)) strcpy(sap_vars->sap_uri,strtok(substring,"\n")); else { log_message( log_module, MSG_WARN,"Sap URI too long\n"); strncpy(sap_vars->sap_uri,strtok(substring,"\n"),255 - 1); } } else if ((!strcmp (substring, "sap_sending_ip"))||(!strcmp (substring, "sap_sending_ip4"))) { if(!strcmp (substring, "sap_sending_ip")) log_message( log_module, MSG_WARN, "sap_sending_ip is Deprecated use sap_sending_ip4 instead"); substring = strtok (NULL, delimiteurs); if(strlen(substring)>19) { log_message( log_module, MSG_ERROR, "The sap sending ip is too long\n"); return -1; } sscanf (substring, "%s\n", sap_vars->sap_sending_ip4); } else if (!strcmp (substring, "sap_sending_ip6")) { substring = strtok (NULL, delimiteurs); if(strlen(substring)>(IPV6_CHAR_LEN-1)) { log_message( log_module, MSG_ERROR, "The sap sending ipv6 is too long\n"); return -1; } sscanf (substring, "%s\n", sap_vars->sap_sending_ip6); } else if (!strcmp (substring, "sap_group")) { if ( ip_ok == 0) { log_message( log_module, MSG_ERROR, "sap_group : this is a channel option, You have to start a channel first (using ip= or channel_next)\n"); return -1; } substring = strtok (NULL, "="); if(strlen(substring)>(SAP_GROUP_LENGTH-1)) { log_message( log_module, MSG_ERROR, "The sap group is too long\n"); return -1; } strcpy (current_channel->sap_group, substring); } else if (!strcmp (substring, "sap_default_group")) { substring = strtok (NULL, "="); if(strlen(substring)>(SAP_GROUP_LENGTH-1)) { log_message( log_module, MSG_ERROR, "The sap default group is too long\n"); return -1; } strcpy (sap_vars->sap_default_group, substring); } else return 0; //Nothing concerning sap, we return 0 to explore the other possibilities return 1;//We found something for sap, we tell main to go for the next line } /** @brief init the sap * Alloc the memory for the messages, open the socket */ int init_sap(sap_parameters_t *sap_vars, multicast_parameters_t multicast_vars) { if(sap_vars->sap == OPTION_ON) { if(multicast_vars.multicast_ipv4) { log_message( log_module, MSG_DETAIL, "init sap v4\n"); sap_vars->sap_messages4=malloc(sizeof(mumudvb_sap_message_t)*MAX_CHANNELS); if(sap_vars->sap_messages4==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } memset (sap_vars->sap_messages4, 0, sizeof( mumudvb_sap_message_t)*MAX_CHANNELS);//we clear it //For sap announces, we open the socket //See the README about multicast_auto_join if(multicast_vars.auto_join) sap_vars->sap_socketOut4 = makeclientsocket (SAP_IP4, SAP_PORT, sap_vars->sap_ttl, multicast_vars.iface4, &sap_vars->sap_sOut4); else sap_vars->sap_socketOut4 = makesocket (SAP_IP4, SAP_PORT, sap_vars->sap_ttl, multicast_vars.iface4, &sap_vars->sap_sOut4); } if(multicast_vars.multicast_ipv6) { log_message( log_module, MSG_DETAIL, "init sap v6\n"); sap_vars->sap_messages6=malloc(sizeof(mumudvb_sap_message_t)*MAX_CHANNELS); if(sap_vars->sap_messages6==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } memset (sap_vars->sap_messages6, 0, sizeof( mumudvb_sap_message_t)*MAX_CHANNELS);//we clear it //For sap announces, we open the socket //See the README about multicast_auto_join if(multicast_vars.auto_join) sap_vars->sap_socketOut6 = makeclientsocket6 (SAP_IP6, SAP_PORT, sap_vars->sap_ttl, multicast_vars.iface6, &sap_vars->sap_sOut6); else sap_vars->sap_socketOut6 = makesocket6 (SAP_IP6, SAP_PORT, sap_vars->sap_ttl, multicast_vars.iface6, &sap_vars->sap_sOut6); } sap_vars->sap_serial= 1 + (int) (424242.0 * (rand() / (RAND_MAX + 1.0))); sap_vars->sap_last_time_sent = 0; /** @todo : loop to create the version*/ } return 0; } /** @brief Send the sap message * * @param sap_vars the sap variables * @param num_messages the number of sap messages */ void sap_send(sap_parameters_t *sap_vars, int num_messages) { int curr_message; mumudvb_sap_message_t *sap_messages4; mumudvb_sap_message_t *sap_messages6; sap_messages4=sap_vars->sap_messages4; sap_messages6=sap_vars->sap_messages6; for( curr_message=0; curr_messagesap_socketOut4, &sap_vars->sap_sOut4, sap_messages4[curr_message].buf, sap_messages4[curr_message].len); if(sap_messages6 && sap_messages6[curr_message].to_be_sent) sendudp6 (sap_vars->sap_socketOut6, &sap_vars->sap_sOut6, sap_messages6[curr_message].buf, sap_messages6[curr_message].len); } return; } /** @brief update the contents of the sap message * This function read the informations of the channel and update the sap message * @param channel : the channel to be updated * @param sap_vars the sap variables * @param curr_channel the number of the updated channel */ int sap_update(mumudvb_channel_t *channel, sap_parameters_t *sap_vars, int curr_channel, multicast_parameters_t multicast_vars) { /** @todo check PACKET Size < MTU*/ //This function is called when the channel changes so it increases the version and update the packet char temp_string[256]; struct in_addr ip_struct4; struct sockaddr_in6 ip_struct6; in_addr_t ip4; struct in6_addr ip6; mumudvb_sap_message_t *sap_message4=NULL; mumudvb_sap_message_t *sap_message6=NULL; if(channel->socketOut4) { sap_message4=&(sap_vars->sap_messages4[curr_channel]); //paranoia memset(sap_message4->buf,0, MAX_UDP_SIZE * sizeof (unsigned char)); sap_message4->version=(sap_message4->version+1)&0x000f; sap_message4->buf[0]=SAP_HEADER4_BYTE0; sap_message4->buf[1]=SAP_HEADER4_BYTE1; //Hash of SAP message: see end of this function sap_message4->buf[2]=0; sap_message4->buf[3]=0; } if(channel->socketOut6) { sap_message6=&(sap_vars->sap_messages6[curr_channel]); //paranoia memset(sap_message6->buf,0, MAX_UDP_SIZE * sizeof (unsigned char)); sap_message6->version=(sap_message6->version+1)&0x000f; sap_message6->buf[0]=SAP_HEADER6_BYTE0; sap_message6->buf[1]=SAP_HEADER6_BYTE1; //Hash of SAP message: see end of this function sap_message6->buf[2]=0; sap_message6->buf[3]=0; } if(channel->socketOut4) { if( inet_aton(sap_vars->sap_sending_ip4, &ip_struct4)) { ip4=ip_struct4.s_addr; /* Bytes 4-7 (or 4-19) byte: Originating source */ log_message( log_module, MSG_DEBUG,"sap sending ipv4 address : %s (binary : 0x%x)\n",sap_vars->sap_sending_ip4, ip4); memcpy (sap_message4->buf + 4, &ip4, 4); } else { log_message( log_module, MSG_WARN,"Invalid SAP sending Ip address, using 0.0.0.0 as Ip address\n"); sap_message4->buf[4]=0; sap_message4->buf[5]=0; sap_message4->buf[6]=0; sap_message4->buf[7]=0; } } if(channel->socketOut6) { if( inet_pton(AF_INET6, sap_vars->sap_sending_ip6, &ip_struct6)) { ip6=ip_struct6.sin6_addr; log_message( log_module, MSG_DEBUG,"sap sending ipv6 address : %s\n",sap_vars->sap_sending_ip6); /* Bytes 4-7 (or 4-19) byte: Originating source */ memcpy (sap_message6->buf + 4, &ip6.s6_addr, 16); } else { log_message( log_module, MSG_WARN,"Invalid SAP sending IPv6 address, using :: as IPv6 address\n"); memset(sap_message6->buf+4,0,16*sizeof(char)); } } //the mime type sprintf(temp_string,"application/sdp"); if(channel->socketOut4) { memcpy(sap_message4->buf + SAP_HEAD_LEN4, temp_string, strlen(temp_string)); sap_message4->len=SAP_HEAD_LEN4+strlen(temp_string); sap_message4->buf[sap_message4->len]=0; sap_message4->len++; } if(channel->socketOut6) { memcpy(sap_message6->buf + SAP_HEAD_LEN6, temp_string, strlen(temp_string)); sap_message6->len=SAP_HEAD_LEN6+strlen(temp_string); sap_message6->buf[sap_message6->len]=0; sap_message6->len++; } // one program per message sap_add_program(channel, sap_vars, sap_message4, sap_message6, multicast_vars); //we compute the CRC32 of the message in order to generate a hash unsigned long crc32; int i; crc32=0xffffffff; if(channel->socketOut4) { for(i = 0; i < sap_message4->len-1; i++) { crc32 = (crc32 << 8) ^ crc32_table[((crc32 >> 24) ^ sap_message4->buf[i])&0xff]; } //Hash of SAP message : we use the CRC32 that we merge onto 16bits sap_message4->buf[2]=(((crc32>>24) & 0xff)+((crc32>>16) & 0xff)) & 0xff; sap_message4->buf[3]=(((crc32>>8) & 0xff)+(crc32 & 0xff)) & 0xff; } crc32=0xffffffff; if(channel->socketOut6) { for(i = 0; i < sap_message6->len-1; i++) { crc32 = (crc32 << 8) ^ crc32_table[((crc32 >> 24) ^ sap_message6->buf[i])&0xff]; } //Hash of SAP message : we use the CRC32 that we merge onto 16bits sap_message6->buf[2]=(((crc32>>24) & 0xff)+((crc32>>16) & 0xff)) & 0xff; sap_message6->buf[3]=(((crc32>>8) & 0xff)+(crc32 & 0xff)) & 0xff; } return 0; } /** @brief Add a program to a sap message * When this function is called the header of the sap message is already done * it adds the payload (sdp). For mare information refer to RFC 2327 and RFC 1890 * @param channel the channel * @param sap_vars the sap variables * @param sap_message the sap message */ int sap_add_program(mumudvb_channel_t *channel, sap_parameters_t *sap_vars, mumudvb_sap_message_t *sap_message4, mumudvb_sap_message_t *sap_message6, multicast_parameters_t multicast_vars) { //See RFC 2327 mumu_string_t payload4; payload4.string=NULL; payload4.length=0; mumu_string_t payload6; payload6.string=NULL; payload6.length=0; if(sap_message4) sap_message4->to_be_sent=0; if(sap_message6) sap_message6->to_be_sent=0; //we check if it's an alive channel if(!channel->streamed_channel) return 1; //Now we write the sdp part, in two times to avoid heavy code /** @section payload @subsection version v=0 @subsection owner/creator and session identifier o=username session_id version network_type address_type address ex : o=mumudvb 123134 1 IN IP4 235.255.215.1 @subsection session name (basically channel name) s= ... */ if(channel->socketOut4) mumu_string_append(&payload4, "v=0\r\no=%s %d %d IN IP4 %s\r\ns=%s\r\n", sap_vars->sap_organisation, sap_vars->sap_serial, sap_message4->version, channel->ip4Out, channel->name); if(channel->socketOut6) mumu_string_append(&payload6, "v=0\r\no=%s %d %d IN IP6 %s\r\ns=%s\r\n", sap_vars->sap_organisation, sap_vars->sap_serial, sap_message6->version, channel->ip6Out, channel->name); /** @subsection URI ex : u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps u= o A URI is a Universal Resource Identifier as used by WWW clients o The URI should be a pointer to additional information about the conference o This field is optional, but if it is present it should be specified before the first media field o No more than one URI field is allowed per session description */ if(strlen(sap_vars->sap_uri)) { if(channel->socketOut4) mumu_string_append(&payload4, "u=%s\r\n", sap_vars->sap_uri); if(channel->socketOut6) mumu_string_append(&payload6, "u=%s\r\n", sap_vars->sap_uri); } /** @subsection connection information ex : c=IN IP4 235.214.225.1/2 the /2 is the TTL of the media (IPv4 only) */ if(channel->socketOut4) mumu_string_append(&payload4, "c=IN IP4 %s/%d\r\n", channel->ip4Out, multicast_vars.ttl); if(channel->socketOut6) mumu_string_append(&payload6, "c=IN IP6 %s\r\n", channel->ip6Out); /**@subsection time session : tell when the session is active t=... permanent program : t=0 0 @subsection attributes : group and co, we'll take the minisapserver ones a=... a=tool:mumudvb-VERSION a=type:broadcast a=x-plgroup: //channel's group */ if(channel->socketOut4) mumu_string_append(&payload4,"t=0 0\r\na=tool:mumudvb-%s\r\na=type:broadcast\r\n", VERSION); if(channel->socketOut6) mumu_string_append(&payload6,"t=0 0\r\na=tool:mumudvb-%s\r\na=type:broadcast\r\n", VERSION); /** @subsection "source-filter" attribute RFC 4570 SDP Source Filters ex : a=source-filter: incl IN IP4 235.255.215.1 192.168.1.1 only defined when the sending ip address is defined */ if(channel->socketOut4) { struct in_addr ip_struct4; if( inet_aton(sap_vars->sap_sending_ip4, &ip_struct4) && ip_struct4.s_addr) mumu_string_append(&payload4, "a=source-filter: incl IN IP4 %s %s\r\n", channel->ip4Out, sap_vars->sap_sending_ip4); } if(channel->socketOut6) { struct sockaddr_in6 ip_struct6; if( inet_pton(AF_INET6, sap_vars->sap_sending_ip6, &ip_struct6)) { //ugly way to test non zero ipv6 addr but I didn found a better one u_int8_t *s6; s6=ip_struct6.sin6_addr.s6_addr; if(s6[0]||s6[1]||s6[2]||s6[3]||s6[4]||s6[5]||s6[6]||s6[7]||s6[8]||s6[9]||s6[10]||s6[11]||s6[12]||s6[13]||s6[14]||s6[15]) mumu_string_append(&payload6, "a=source-filter: incl IP6 %s %s\r\n", channel->ip6Out, sap_vars->sap_sending_ip6); } } /**@subsection channel's group a=cat channel's group a=x-plgroup backward compatibility */ if(strlen(channel->sap_group)||strlen(sap_vars->sap_default_group)) { if(!strlen(channel->sap_group)) { int len=SAP_GROUP_LENGTH; strcpy(channel->sap_group,sap_vars->sap_default_group); mumu_string_replace(channel->sap_group,&len,0,"%type",simple_service_type_to_str(channel->channel_type) ); } if(channel->socketOut4) mumu_string_append(&payload4,"a=cat:%s\r\n", channel->sap_group); /* backward compatibility with VLC 0.7.3-2.0.0 senders */ mumu_string_append(&payload4,"a=x-plgroup:%s\r\n", channel->sap_group); if(channel->socketOut6) mumu_string_append(&payload6,"a=cat:%s\r\n", channel->sap_group); /* backward compatibility with VLC 0.7.3-2.0.0 senders */ mumu_string_append(&payload6,"a=x-plgroup:%s\r\n", channel->sap_group); } /** @subsection media name and transport address See RFC 1890 m=... Without RTP m=video channel_port udp 33 With RTP m=video channel_port rtp/avp 33 */ if(!multicast_vars.rtp_header) { if(channel->socketOut4) mumu_string_append(&payload4,"m=video %d udp 33\r\n", channel->portOut); if(channel->socketOut6) mumu_string_append(&payload6,"m=video %d udp 33\r\n", channel->portOut); } else { if(channel->socketOut4) mumu_string_append(&payload4,"m=video %d RTP/AVP 33\r\na=rtpmap:33 MP2T/90000\r\n", channel->portOut); if(channel->socketOut6) mumu_string_append(&payload6,"m=video %d RTP/AVP 33\r\na=rtpmap:33 MP2T/90000\r\n", channel->portOut); } if(channel->socketOut4) { if( (sap_message4->len+payload4.length)>1024) { log_message( log_module, MSG_WARN,"SAP message v4 too long for channel %s\n",channel->name); goto epicfail; } memcpy(sap_message4->buf + sap_message4->len, payload4.string, payload4.length); log_message( log_module, MSG_DEBUG,"SAP payload v4"); log_message( log_module, MSG_DEBUG, (char *) &sap_message4->buf[sap_message4->len]); log_message( log_module, MSG_DEBUG,"end of SAP payload v4"); sap_message4->len+=payload4.length; sap_message4->to_be_sent=1; } if(channel->socketOut6) { if( (sap_message6->len+payload6.length)>1024) { log_message( log_module, MSG_WARN,"SAP message v4 too long for channel %s\n",channel->name); goto epicfail; } memcpy(sap_message6->buf + sap_message6->len, payload6.string, payload6.length); log_message( log_module, MSG_DEBUG,"SAP payload v6"); log_message( log_module, MSG_DEBUG, (char *) &sap_message6->buf[sap_message6->len]); log_message( log_module, MSG_DEBUG,"end of SAP payload v6"); sap_message6->len+=payload6.length; sap_message6->to_be_sent=1; } mumu_free_string(&payload4); mumu_free_string(&payload6); return 0; epicfail: mumu_free_string(&payload4); mumu_free_string(&payload6); return 1; } /** @brief Sap function called periodically * This function checks if there is sap messages to send * @param number_of_channels the number of channels * @param channels the channels * @param sap_vars the sap variables * @param multicast_vars the multicast variables * @param now the time */ void sap_poll(sap_parameters_t *sap_vars,int number_of_channels,mumudvb_channel_t *channels, multicast_parameters_t multicast_vars, long now) { int curr_channel; //we check if SAP is initialised if(sap_vars->sap_messages4==NULL && sap_vars->sap_messages6==NULL) return; if(sap_vars->sap == OPTION_ON) { if(!sap_vars->sap_last_time_sent) { // it's the first time we are here, we initialize all the channels for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) sap_update(&channels[curr_channel], sap_vars, curr_channel, multicast_vars); sap_vars->sap_last_time_sent=now-sap_vars->sap_interval-1; } if((now-sap_vars->sap_last_time_sent)>=sap_vars->sap_interval) { sap_send(sap_vars, number_of_channels); sap_vars->sap_last_time_sent=now; } } } mumudvb-1.7.1/src/sap.h000066400000000000000000000076211177353207000147350ustar00rootroot00000000000000/* * mumudvb - UDP-ize a DVB transport stream. * File for Session Announcement Protocol Announces * * (C) 2008-2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief Header File for Session Announcement Protocol Announces * @author Brice DUBOST * @date 2008-2009 */ #ifndef _SAP_H #define _SAP_H #include "mumudvb.h" /**refer to RFC 2974 : sap IP address*/ #define SAP_IP4 "224.2.127.254" /**refer to RFC 2974 : sap IP address*/ #define SAP_IP6 "FF05::2:7FFE" /**refer to RFC 2974 : sap port*/ #define SAP_PORT 9875 /**refer to RFC 2974 : sap time to live*/ #define SAP_DEFAULT_TTL 255 /**intervall between sap announces*/ #define SAP_DEFAULT_INTERVAL 5 #define SAP_HEADER4_BYTE0 0x20 /**00100000 : version 1 and nothing else*/ #define SAP_HEADER4_BYTE1 0x00 /**No auth header*/ #define SAP_HEADER6_BYTE0 0x30 /**00110000 : version 1 and IPv6*/ #define SAP_HEADER6_BYTE1 0x00 /**No auth header*/ #define SAP_HEAD_LEN4 8 #define SAP_HEAD_LEN6 20 /**@brief sap_message*/ typedef struct{ /**the buffer*/ unsigned char buf[MAX_UDP_SIZE]; /**Lenght of the sap message*/ int len; /**the version of the sap message, MUST be changed when sap changes*/ int version; /** Do we have to send this message ?*/ int to_be_sent; }mumudvb_sap_message_t; /**@brief General parameter for sap announces*/ typedef struct sap_parameters_t{ /**the sap messages array*/ mumudvb_sap_message_t *sap_messages4; /**the sap messages array*/ mumudvb_sap_message_t *sap_messages6; /**do we send sap announces ?*/ option_status_t sap; /**Interval between two sap announces in second*/ int sap_interval; /** The ip address of the server that sends the sap announces*/ char sap_sending_ip4[20]; /** The ip address of the server that sends the sap announces*/ char sap_sending_ip6[IPV6_CHAR_LEN]; /**the default cat : ie the playlist group (mainly for vlc)*/ char sap_default_group[SAP_GROUP_LENGTH]; /**The URI The URI should be a pointer to additional information about the conference*/ char sap_uri[256]; /**The organisation wich made the announces*/ char sap_organisation[256]; /** The socket for sending the announces*/ int sap_socketOut4; /** The socket for sending the announces*/ struct sockaddr_in sap_sOut4; /** The socket for sending the announces*/ int sap_socketOut6; /** The socket for sending the announces*/ struct sockaddr_in6 sap_sOut6; /** The serial number for the sap announces*/ int sap_serial; /** The time when the last sap announces have been sent*/ long sap_last_time_sent; /** The sap ttl (the norm ask it to be 255)*/ int sap_ttl; }sap_parameters_t; int init_sap(sap_parameters_t *sap_vars, multicast_parameters_t multicast_vars); void sap_send(sap_parameters_t *sap_vars, int num_messages); int sap_update(mumudvb_channel_t *channel, sap_parameters_t *sap_vars, int curr_channel, multicast_parameters_t multicast_vars); int read_sap_configuration(sap_parameters_t *sap_vars, mumudvb_channel_t *current_channel, int ip_ok, char *substring); void sap_poll(sap_parameters_t *sap_vars,int number_of_channels,mumudvb_channel_t *channels, multicast_parameters_t multicast_vars, long now); #endif mumudvb-1.7.1/src/sdt_rewrite.c000066400000000000000000000414101177353207000164720ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * * (C) 2004-2011 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ /**@file * @brief This file contains the function for rewriting the sdt pid * * The SDT rewrite is made to announce only the video stream associated with the channel in the SDT pid * It avoids to have ghost channels which can disturb the clients */ #include #include #include "mumudvb.h" #include "ts.h" #include "rewrite.h" #include "log.h" #include extern uint32_t crc32_table[256]; static char *log_module="SDT rewrite: "; int sdt_rewrite_all_sections_seen(rewrite_parameters_t *rewrite_vars) { int all_seen,i; all_seen=1; for(i=0;i<=rewrite_vars->sdt_last_section_number;i++) if(rewrite_vars->sdt_section_numbers_seen[i]==0) all_seen=0; return all_seen; } /** @brief, tell if the sdt have a newer version than the one recorded actually * In the SDT pid there is a field to say if the SDT was updated * This function check if it has changed (in order to rewrite the sdt only once) * General Note : in case it change during streaming it can be a problem ane we would have to deal with re-autoconfiguration * Note this function can give flase positive since it doesn't check the CRC32 * *@param rewrite_vars the parameters for sdt rewriting *@param buf : the received buffer */ int sdt_need_update(rewrite_parameters_t *rewrite_vars, unsigned char *buf) { sdt_t *sdt=(sdt_t*)(get_ts_begin(buf)); if(sdt) //It's the beginning of a new packet if((sdt->version_number!=rewrite_vars->sdt_version) && (sdt->table_id==0x42)) { /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(sdt->current_next_indicator == 0) { return 0; } log_message( log_module, MSG_DEBUG,"Need update. stored version : %d, new: %d\n",rewrite_vars->sdt_version,sdt->version_number); if(rewrite_vars->sdt_version!=-1) log_message( log_module, MSG_INFO,"The SDT version changed, so the channels names changed probably.\n"); return 1; } return 0; } /** @brief update the version using the dowloaded SDT*/ void update_sdt_version(rewrite_parameters_t *rewrite_vars) { sdt_t *sdt=(sdt_t*)(rewrite_vars->full_sdt->data_full); if(rewrite_vars->sdt_version!=sdt->version_number) log_message( log_module, MSG_DEBUG,"New sdt version. Old : %d, new: %d\n",rewrite_vars->sdt_version,sdt->version_number); rewrite_vars->sdt_version=sdt->version_number; } /** @brief Tells if we copy this descriptor for the rewriting*/ int sdt_rewrite_copy_descriptor(int descriptor_tag) { /* * 0x47 bouquet_name_descriptor * 0x48 service_descriptor * 0x50 component_descriptor * 0x51 mosaic_descriptor * 0x53 CA_identifier_descriptor * 0x5D multilingual_service_name_descriptor * 0x6E announcement_support_descriptor */ int allowed_descriptors[]={0x47, 0x48, 0x50, 0x51, 0x53, 0x5D, 0x6E}; int num_allowed=sizeof(allowed_descriptors)/sizeof(int); for(int i=0;ifull_sdt->data_full); sdt_descr_t *sdt_descr; //was prog unsigned long crc32; int found=0; //destination buffer unsigned char buf_dest[TS_PACKET_SIZE]; int buf_dest_pos=0; int buffer_pos=SDT_LEN; int section_length=0; int new_section_length; int descriptors_length; if(!channel->service_id) { log_message( log_module, MSG_WARN,"Cannot rewrite a program without the service_id set. We deactivate SDT rewrititng for this channel %d : \"%s\"\n", curr_channel, channel->name); channel->sdt_rewrite_skip=1; return 0; } section_length=HILO(sdt->section_length); //lets start the copy //we copy the ts header and adapt it a bit //the continuity counter is updated elswhere if(ts_header->payload_unit_start_indicator) { if(buf[TS_HEADER_LEN-1]) log_message( log_module, MSG_DEBUG,"pointer field 0x%x \n", buf[TS_HEADER_LEN-1]); } ts_header->payload_unit_start_indicator=1; buf[TS_HEADER_LEN-1]=0;//we erase the pointer field memcpy(buf_dest,ts_header,TS_HEADER_LEN); //we copy the modified SDT header sdt->current_next_indicator=1; //applicable immediately sdt->section_number=0; //only one sdt sdt->last_section_number=0; memcpy(buf_dest+TS_HEADER_LEN,sdt,SDT_LEN); buf_dest_pos=TS_HEADER_LEN+SDT_LEN; log_message( log_module, MSG_DEBUG,"table id 0x%x \n", sdt->table_id); if(sdt->table_id!=0x42) { rewrite_vars->sdt_needs_update=1; log_message( log_module, MSG_DETAIL,"We didn't got the good SDT (wrong table id) we search for a new one\n"); return 0; } //We copy what we need : EIT announce and present PMT announce //strict comparaison due to the calc of section len cf down while((buffer_pos+SDT_DESCR_LEN)<(section_length) && !found) { sdt_descr=(sdt_descr_t *)((char*)rewrite_vars->full_sdt->data_full+buffer_pos); descriptors_length=HILO(sdt_descr->descriptors_loop_length); //We check the transport stream id if present and the size of the packet // + 4 for the CRC32 if(channel->service_id == HILO(sdt_descr->service_id)) { //Not much size checking here, the packet passed the CRC32, so it should be OK log_message( log_module, MSG_DEBUG,"Program found, we search for interesting descriptors\n"); //We loop on the descriptors int loop_length; loop_length=0; unsigned char t_buffer[MAX_TS_SIZE]; sdt_descr_t *t_buffer_ptr; t_buffer_ptr = ((sdt_descr_t *)t_buffer); int pos=0; //we copy the header memcpy(t_buffer,rewrite_vars->full_sdt->data_full+buffer_pos,SDT_DESCR_LEN); while(posfull_sdt->data_full[buffer_pos+SDT_DESCR_LEN+pos]; unsigned char descriptor_len; descriptor_len = rewrite_vars->full_sdt->data_full[buffer_pos+SDT_DESCR_LEN+pos]+2; if(sdt_rewrite_copy_descriptor(descriptor_tag)) { //We keep the descriptor we copy it log_message( log_module, MSG_FLOOD,"We copy this descriptor : descriptor_tag 0x%02x descriptor_len %d loop length %d pos %d\n",descriptor_tag,descriptor_len, loop_length, pos); memcpy(t_buffer+SDT_DESCR_LEN+loop_length,rewrite_vars->full_sdt->data_full+buffer_pos+SDT_DESCR_LEN+pos,descriptor_len); loop_length += descriptor_len; } else log_message( log_module, MSG_FLOOD," descriptor_tag 0x%02x descriptor_len %d\n",descriptor_tag,descriptor_len); pos+=descriptor_len; } if(buf_dest_pos+SDT_DESCR_LEN+loop_length+4+1>TS_PACKET_SIZE) //The +4 is for CRC32 +1 is because indexing starts at 0 { log_message( log_module, MSG_WARN,"The generated SDT is too big for channel %d : \"%s\"\n", curr_channel, channel->name); } else { log_message( log_module, MSG_DETAIL,"NEW program for channel %d : \"%s\". service_id : %d\n", curr_channel, channel->name,channel->service_id); //we found a announce for a program in our stream, we keep it //We fill the descriptor loop length t_buffer_ptr->descriptors_loop_length_lo = (loop_length & 0x00FF); t_buffer_ptr->descriptors_loop_length_hi = (loop_length & 0xFF00)>>8; if(HILO(t_buffer_ptr->descriptors_loop_length) != loop_length) { log_message( log_module, MSG_WARN,"BUG file %s line %d\n",__FILE__,__LINE__); return 0; } // We force some flags if asked if(rewrite_vars->sdt_force_eit) { t_buffer_ptr->eit_present_following_flag=1; t_buffer_ptr->eit_schedule_flag=1; } //We copy the data memcpy(buf_dest+buf_dest_pos,t_buffer,SDT_DESCR_LEN+loop_length); buf_dest_pos+=SDT_DESCR_LEN+loop_length; found=1; } } else log_message( log_module, MSG_DEBUG,"Program dropped. channel %d :\"%s\". service_id chan : %d service_id prog %d\n", curr_channel, channel->name, channel->service_id, HILO(sdt_descr->service_id)); buffer_pos+=SDT_DESCR_LEN+descriptors_length; } //we compute the new section length //section lenght is the size of the section after section_length (crc32 included : 4 bytes) //so it's size of the crc32 + size of the sdt descriptors + size of the sdt header - 3 first bytes (the sdt header until section length included) //Finally it's total_sdt_data_size + 1 new_section_length=buf_dest_pos-TS_HEADER_LEN + 1; //We write the new section length buf_dest[1+TS_HEADER_LEN]=(((new_section_length)&0x0f00)>>8) | (0xf0 & buf_dest[1+TS_HEADER_LEN]); buf_dest[2+TS_HEADER_LEN]=new_section_length & 0xff; //CRC32 calculation inspired by the xine project //Now we must adjust the CRC32 //we compute the CRC32 crc32=0xffffffff; int i; for(i = 0; i < new_section_length-1; i++) { crc32 = (crc32 << 8) ^ crc32_table[((crc32 >> 24) ^ buf_dest[i+TS_HEADER_LEN])&0xff]; } //We write the CRC32 to the buffer buf_dest[buf_dest_pos]=(crc32>>24) & 0xff; buf_dest_pos+=1; buf_dest[buf_dest_pos]=(crc32>>16) & 0xff; buf_dest_pos+=1; buf_dest[buf_dest_pos]=(crc32>>8) & 0xff; buf_dest_pos+=1; buf_dest[buf_dest_pos]=crc32 & 0xff; buf_dest_pos+=1; //Padding with 0xFF memset(buf_dest+buf_dest_pos,0xFF,TS_PACKET_SIZE-buf_dest_pos); if(found) { //We copy the result to the intended buffer memcpy(channel->generated_sdt,buf_dest,TS_PACKET_SIZE); channel->sdt_rewrite_skip=0; } else { //We check if we saw all the section numbers if(sdt_rewrite_all_sections_seen(rewrite_vars)) { log_message( log_module, MSG_WARN,"The SDT rewrite failed (no program found, wrong service_id ?) we deactivate for this channel %d : \"%s\"\n", curr_channel, channel->name); channel->sdt_rewrite_skip=1; } else { log_message( log_module, MSG_DETAIL,"The program was not found in this SDT, we search for others. Channel %d : \"%s\"\n", curr_channel, channel->name); rewrite_vars->sdt_need_others = 1; return 0; //We indicate that there was a problem } } /*We update the version*/ channel->generated_sdt_version=rewrite_vars->sdt_version; //Everything is Ok .... return 1; } /** @brief This function is called when a new SDT packet for all channels is there and we asked for rewrite * this function save the full SDT wich will be the source SDT for all the channels * @return return 1 when the packet is updated */ int sdt_rewrite_new_global_packet(unsigned char *ts_packet, rewrite_parameters_t *rewrite_vars) { sdt_t *sdt=NULL; /*Check the version before getting the full packet*/ if(!rewrite_vars->sdt_needs_update) { rewrite_vars->sdt_needs_update=sdt_need_update(rewrite_vars,ts_packet); if(rewrite_vars->sdt_needs_update) //It needs update we mark the packet as empty and we clear the sections seen { //We clear the section numbers seen memset(&rewrite_vars->sdt_section_numbers_seen,0,sizeof(rewrite_vars->sdt_section_numbers_seen)); } } /*We need to update the full packet, we download it*/ if(rewrite_vars->sdt_needs_update || rewrite_vars->sdt_need_others) { if(get_ts_packet(ts_packet,rewrite_vars->full_sdt)) { sdt=(sdt_t*)(rewrite_vars->full_sdt->data_full); /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(sdt->current_next_indicator == 0) { log_message( log_module, MSG_FLOOD,"SDT not yet valid, we get a new one (current_next_indicator == 0)\n"); } else if(sdt->table_id!=0x42) { rewrite_vars->sdt_needs_update=1; log_message( log_module, MSG_DEBUG,"We didn't got the good SDT (wrong table id) we search for a new one\n"); return 0; } else { rewrite_vars->sdt_last_section_number = sdt->last_section_number; log_message( log_module, MSG_DETAIL,"Full SDT updated. section number %d, last_section_number %d\n", sdt->section_number, rewrite_vars->sdt_last_section_number); //We store that we saw this section number rewrite_vars->sdt_section_numbers_seen[sdt->section_number]=1; /*We've got the FULL SDT packet*/ update_sdt_version(rewrite_vars); rewrite_vars->sdt_needs_update = 0; rewrite_vars->full_sdt_ok=1; if(rewrite_vars->sdt_need_others == 0) return 1; //We force the update of all channels, see mumudvb.c else { rewrite_vars->sdt_need_others = 0; return 0; } } } } //To avoid the duplicates, we have to update the continuity counter rewrite_vars->sdt_continuity_counter++; rewrite_vars->sdt_continuity_counter= rewrite_vars->sdt_continuity_counter % 32; return 0; } /** @brief This function is called when a new SDT packet for a channel is there and we asked for rewrite * This function copy the rewritten SDT to the buffer. And checks if the SDT was changed so the rewritten version have to be updated */ int sdt_rewrite_new_channel_packet(unsigned char *ts_packet, rewrite_parameters_t *rewrite_vars, mumudvb_channel_t *channel, int curr_channel) { if(rewrite_vars->full_sdt_ok ) //the global full sdt is ok { /*We check if it's the first sdt packet ? or we send it each time ?*/ /*We check if the versions corresponds*/ if(!rewrite_vars->sdt_needs_update && channel->generated_sdt_version!=rewrite_vars->sdt_version)//We check the version only if the SDT is not currently updated { log_message( log_module, MSG_DEBUG,"We need to rewrite the SDT for the channel %d : \"%s\"\n", curr_channel, channel->name); /*They mismatch*/ /*We generate the rewritten packet*/ if(!sdt_channel_rewrite(rewrite_vars, channel, ts_packet, curr_channel)) { log_message( log_module, MSG_DEBUG,"Cannot rewrite (for the moment) the SDT for the channel %d : \"%s\"\n", curr_channel, channel->name); return 0; } } if(channel->generated_sdt_version==rewrite_vars->sdt_version) { /*We send the rewrited SDT from channel->generated_sdt*/ memcpy(ts_packet,channel->generated_sdt,TS_PACKET_SIZE); //To avoid the duplicates, we have to update the continuity counter set_continuity_counter(ts_packet,rewrite_vars->sdt_continuity_counter); } else { return 0; log_message( log_module, MSG_DEBUG,"Bad SDT channel version, we don't send the SDT for the channel %d : \"%s\"\n", curr_channel, channel->name); } } else { return 0; log_message( log_module, MSG_DEBUG,"We need a global SDT update, we don't send the SDT for the channel %d : \"%s\"\n", curr_channel, channel->name); } return 1; } mumudvb-1.7.1/src/transcode.c000066400000000000000000000517431177353207000161330ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Code for transcoding * * Code written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * Copyright (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "transcode.h" #include "transcode_queues.h" #include "transcode_avlib.h" #include "mumudvb.h" #include "errors.h" #include "log.h" #include #include #include #ifdef HAVE_LIBAVCODEC_AVCODEC_H # include #elif defined(HAVE_FFMPEG_AVCODEC_H) # include #endif #define TRANSCODE_QUEUE_SIZE (5 * 1024 * 1024) static char *log_module="Transcode : "; void* transcode_thread_routine(void *p) { transcode_thread_data_t *transcode_thread_data = p; while (!transcode_thread_data->terminate_thread_flag) { if (0 >= transcode_thread_data->data_queue.data_size) { log_message( log_module, MSG_DEBUG, "No data for transcoding.\n"); /* Sleep 100 times for 0.1 sec with checking transcode_thread_data->terminate_thread_flag */ int i; for (i = 0; i < 100 && !transcode_thread_data->terminate_thread_flag; i++) { usleep(100000); } continue; /* No data - go to beginning of this loop */ } /* Initialize transcode */ void *transcode_handle = initialize_transcode(transcode_thread_data); if (NULL == transcode_handle) { log_message( log_module, MSG_ERROR, "Failed to initialize transcoding.\n"); /* Sleep 100 times for 0.1 sec with checking transcode_thread_data->terminate_thread_flag */ int i; for (i = 0; i < 100 && !transcode_thread_data->terminate_thread_flag; i++) { usleep(100000); } continue; } log_message( log_module, MSG_INFO, "Transcoding sarted.\n"); transcode_thread_data->is_initialized = 1; /* Transcode */ transcode(transcode_handle, transcode_thread_data); transcode_thread_data->is_initialized = 0; log_message( log_module, MSG_INFO, "Transcoding finished.\n"); /* Free transcode data - requires threadsafety */ free_transcode(transcode_handle, transcode_thread_data); } return NULL; } void* transcode_start_thread(int socket, struct sockaddr_in *socket_addr, transcode_options_t *options) { /* Create transcode thread data */ transcode_thread_data_t *transcode_thread_data = malloc(sizeof(transcode_thread_data_t)); if (NULL == transcode_thread_data) { return NULL; } /* Initialize properties and data queue */ transcode_thread_data->socket = socket; transcode_thread_data->socket_addr = socket_addr; transcode_thread_data->options = options; transcode_thread_data->is_initialized = 0; data_queue_init(&transcode_thread_data->data_queue, TRANSCODE_QUEUE_SIZE); /* Initialize and create transcode thread and mutexes */ transcode_thread_data->terminate_thread_flag = 0; if (pthread_mutex_init(&transcode_thread_data->queue_mutex, NULL) != 0) { /* Mutext initialization failed */ log_message( log_module, MSG_ERROR, "pthread_mutex_init failed.\n"); free(transcode_thread_data); return NULL; } if (pthread_create(&transcode_thread_data->thread, NULL, transcode_thread_routine, transcode_thread_data) != 0) { /* Thread initialization failed */ log_message( log_module, MSG_ERROR, "pthread_create failed.\n"); pthread_mutex_destroy(&transcode_thread_data->queue_mutex); free(transcode_thread_data); return NULL; } return (void*)transcode_thread_data; } void transcode_request_thread_end(void *transcode_handle) { if (NULL == transcode_handle) { return; } transcode_thread_data_t *transcode_thread_data = transcode_handle; transcode_thread_data->terminate_thread_flag = 1; } void transcode_wait_thread_end(void *transcode_handle) { if (NULL == transcode_handle) { return; } transcode_thread_data_t *transcode_thread_data = transcode_handle; /* Finish thread, destroy mutexes */ pthread_join(transcode_thread_data->thread, NULL); pthread_mutex_destroy(&transcode_thread_data->queue_mutex); /* Free thread data */ data_queue_free(&transcode_thread_data->data_queue); free(transcode_thread_data); } int transcode_enqueue_data(void *transcode_handle, void *data, int data_size) { if (NULL == transcode_handle) { return -1; } transcode_thread_data_t *transcode_thread_data = transcode_handle; /* Lock mutext and add data into the queue */ pthread_mutex_lock(&transcode_thread_data->queue_mutex); int result = data_queue_enqueue(&transcode_thread_data->data_queue, data, data_size); if (-1 == result) { log_message( log_module, MSG_ERROR, "Failed to enqueue data.\n"); } else if (0 == result) { if (transcode_thread_data->is_initialized) { if(!transcode_thread_data->data_queue_full) { transcode_thread_data->data_queue_full=1; log_message( log_module, MSG_INFO, "Data queue is full.\n"); } } } else if(transcode_thread_data->data_queue_full) { log_message( log_module, MSG_DETAIL, "Data queue is NOT full anymore.\n"); transcode_thread_data->data_queue_full=0; } pthread_mutex_unlock(&transcode_thread_data->queue_mutex); return result; } #define SET_OPTION_INT(config_option_name, struct_option_name)\ else if (!strcmp(*substring, config_option_name)) {\ if (NULL == struct_option_name) {\ struct_option_name = malloc(sizeof(int));\ }\ *(struct_option_name) = atoi(strtok(NULL, delimiteurs));\ } #define SET_OPTION_FLT(config_option_name, struct_option_name)\ else if (!strcmp(*substring, config_option_name)) {\ if (NULL == struct_option_name) {\ struct_option_name = malloc(sizeof(float));\ }\ *(struct_option_name) = atof(strtok(NULL, delimiteurs));\ } #define SET_OPTION_STR(config_option_name, struct_option_name, max_length)\ else if (!strcmp(*substring, config_option_name)) {\ *substring = strtok(NULL, delimiteurs);\ int length = strlen(*substring);\ if (length <= max_length) {\ if (NULL != struct_option_name) {\ free(struct_option_name);\ }\ struct_option_name = malloc(length + 1);\ strcpy(struct_option_name, *substring);\ trim(struct_option_name);\ }\ } // Trim spaces, tabs and '\n' void trim(char *s) { size_t i = 0; while (s[i] == ' ' || s[i] == '\t' || s[i] == '\n') { i++; } if (i > 0) { size_t j; for (j = 0; j < strlen(s); j++) { s[j] = s[j+i]; } s[j] = '\0'; } i = strlen(s) - 1; while (s[i] == ' ' || s[i] == '\t' || s[i] == '\n') { i--; } if (i < strlen(s) - 1) { s[i+1] = '\0'; } } int transcode_read_option(struct transcode_options_t *transcode_options, char *delimiteurs, char **substring) { if (!strcmp(*substring, "transcode_streaming_type")) { *substring = strtok(NULL, delimiteurs); if (strlen(*substring) <= TRANSCODE_STREAMING_TYPE_MAX) { int streaming_type; int streaming_type_set = 0; char *stremaing_type_string = malloc(strlen(*substring) + 1); strcpy(stremaing_type_string, *substring); trim(stremaing_type_string); if (0 == strcmp(stremaing_type_string, "mpegts")) { streaming_type_set = 1; streaming_type = STREAMING_TYPE_MPEGTS; } else if (0 == strcmp(stremaing_type_string, "rtp")) { streaming_type_set = 1; streaming_type = STREAMING_TYPE_RTP; } else if (0 == strcmp(stremaing_type_string, "ffm")) { streaming_type_set = 1; streaming_type = STREAMING_TYPE_FFM; } if (streaming_type_set) { if (NULL == transcode_options->streaming_type) { transcode_options->streaming_type = malloc(sizeof(int)); } *(transcode_options->streaming_type) = streaming_type; } free(stremaing_type_string); } } else if (!strcmp(*substring, "transcode_x264_profile")) { *substring = strtok(NULL, delimiteurs); if (strlen(*substring) <= TRANSCODE_PROFILE_MAX) { int profile_set = 0; char *profile_string = malloc(strlen(*substring) + 1); strcpy(profile_string, *substring); trim(profile_string); if (strcmp(profile_string, "baseline") == 0) { transcode_options->coder_type = (NULL == transcode_options->coder_type ? malloc(sizeof(int)) : transcode_options->coder_type); transcode_options->enable_8x8dct = (NULL == transcode_options->enable_8x8dct ? malloc(sizeof(int)) : transcode_options->enable_8x8dct); *(transcode_options->coder_type) = 0; *(transcode_options->enable_8x8dct) = 0; profile_set = 1; } else if (strcmp(profile_string, "main") == 0) { transcode_options->coder_type = (NULL == transcode_options->coder_type ? malloc(sizeof(int)) : transcode_options->coder_type); transcode_options->enable_8x8dct = (NULL == transcode_options->enable_8x8dct ? malloc(sizeof(int)) : transcode_options->enable_8x8dct); *(transcode_options->coder_type) = 1; *(transcode_options->enable_8x8dct) = 0; profile_set = 1; } else if (strcmp(profile_string, "high") == 0) { transcode_options->coder_type = (NULL == transcode_options->coder_type ? malloc(sizeof(int)) : transcode_options->coder_type); transcode_options->enable_8x8dct = (NULL == transcode_options->enable_8x8dct ? malloc(sizeof(int)) : transcode_options->enable_8x8dct); *(transcode_options->coder_type) = 1; *(transcode_options->enable_8x8dct) = 1; profile_set = 1; } free(profile_string); if (profile_set) { transcode_options->loop_filter = (NULL == transcode_options->loop_filter ? malloc(sizeof(int)) : transcode_options->loop_filter); transcode_options->sc_threshold = (NULL == transcode_options->sc_threshold ? malloc(sizeof(int)) : transcode_options->sc_threshold); transcode_options->x264_partitions = (NULL == transcode_options->x264_partitions ? malloc(sizeof(int)) : transcode_options->x264_partitions); *(transcode_options->loop_filter) = 1; *(transcode_options->sc_threshold) = 1; *(transcode_options->x264_partitions) = 1; if (NULL != transcode_options->video_codec) { free(transcode_options->video_codec); } char *codec_str = "libx264"; transcode_options->video_codec = malloc(strlen(codec_str) + 1); strcpy(transcode_options->video_codec, codec_str); } } } else if (!strcmp(*substring, "transcode_aac_profile")) { *substring = strtok(NULL, delimiteurs); if (strlen(*substring) <= TRANSCODE_AAC_PROFILE_MAX) { int aac_profile_set = 0; int aac_profile; char *aac_profile_string = malloc(strlen(*substring) + 1); strcpy(aac_profile_string, *substring); trim(aac_profile_string); if (0 == strcmp(aac_profile_string, "low")) { aac_profile_set = 1; aac_profile = FF_PROFILE_AAC_LOW; } else if (0 == strcmp(aac_profile_string, "main")) { aac_profile_set = 1; aac_profile = FF_PROFILE_AAC_MAIN; } else if (0 == strcmp(aac_profile_string, "ssr")) { aac_profile_set = 1; aac_profile = FF_PROFILE_AAC_SSR; } else if (0 == strcmp(aac_profile_string, "ltp")) { aac_profile_set = 1; aac_profile = FF_PROFILE_AAC_LTP; } if (aac_profile_set) { if (NULL == transcode_options->aac_profile) { transcode_options->aac_profile = malloc(sizeof(int)); } *(transcode_options->aac_profile) = aac_profile; } free(aac_profile_string); } } SET_OPTION_INT("transcode_enable", transcode_options->enable) SET_OPTION_INT("transcode_video_bitrate", transcode_options->video_bitrate) SET_OPTION_INT("transcode_audio_bitrate", transcode_options->audio_bitrate) SET_OPTION_INT("transcode_gop", transcode_options->gop) SET_OPTION_INT("transcode_b_frames", transcode_options->b_frames) SET_OPTION_INT("transcode_mbd", transcode_options->mbd) SET_OPTION_INT("transcode_cmp", transcode_options->cmp) SET_OPTION_INT("transcode_subcmp", transcode_options->subcmp) SET_OPTION_STR("transcode_video_codec", transcode_options->video_codec, TRANSCODE_CODEC_MAX) SET_OPTION_STR("transcode_audio_codec", transcode_options->audio_codec, TRANSCODE_CODEC_MAX) SET_OPTION_FLT("transcode_crf", transcode_options->crf) SET_OPTION_INT("transcode_refs", transcode_options->refs) SET_OPTION_INT("transcode_b_strategy", transcode_options->b_strategy) SET_OPTION_INT("transcode_coder_type", transcode_options->coder_type) SET_OPTION_INT("transcode_me_method", transcode_options->me_method) SET_OPTION_INT("transcode_me_range", transcode_options->me_range) SET_OPTION_INT("transcode_subq", transcode_options->subq) SET_OPTION_INT("transcode_trellis", transcode_options->trellis) SET_OPTION_INT("transcode_sc_threshold", transcode_options->sc_threshold) SET_OPTION_STR("transcode_rc_eq", transcode_options->rc_eq, TRANSCODE_RC_EQ_MAX) SET_OPTION_FLT("transcode_qcomp", transcode_options->qcomp) SET_OPTION_INT("transcode_qmin", transcode_options->qmin) SET_OPTION_INT("transcode_qmax", transcode_options->qmax) SET_OPTION_INT("transcode_qdiff", transcode_options->qdiff) SET_OPTION_INT("transcode_loop_filter", transcode_options->loop_filter) SET_OPTION_INT("transcode_mixed_refs", transcode_options->mixed_refs) SET_OPTION_INT("transcode_enable_8x8dct", transcode_options->enable_8x8dct) SET_OPTION_INT("transcode_x264_partitions", transcode_options->x264_partitions) SET_OPTION_INT("transcode_level", transcode_options->level) SET_OPTION_STR("transcode_sdp_filename", transcode_options->sdp_filename, TRANSCODE_SDP_FILENAME_MAX) SET_OPTION_FLT("transcode_video_scale", transcode_options->video_scale) SET_OPTION_INT("transcode_aac_latm", transcode_options->aac_latm) SET_OPTION_STR("transcode_ffm_url", transcode_options->ffm_url, TRANSCODE_FFM_URL_MAX) SET_OPTION_INT("transcode_audio_channels", transcode_options->audio_channels) SET_OPTION_INT("transcode_audio_sample_rate", transcode_options->audio_sample_rate) SET_OPTION_INT("transcode_video_frames_per_second", transcode_options->video_frames_per_second) SET_OPTION_STR("transcode_rtp_port", transcode_options->s_rtp_port,TRANSCODE_RTP_PORT_MAX) SET_OPTION_INT("transcode_keyint_min", transcode_options->keyint_min) SET_OPTION_INT("transcode_send_transcoded_only", transcode_options->send_transcoded_only) else { return 0; } return 1; } /********** Functions to copy transcode options *********************/ #define COPY_OPTION_INT(option_name, struct_source, struct_dest)\ if(NULL != struct_source->option_name){\ if (NULL == struct_dest->option_name) {\ struct_dest->option_name = malloc(sizeof(int));\ }\ *(struct_dest->option_name) = *(struct_source->option_name);\ } #define COPY_OPTION_FLT(option_name, struct_source, struct_dest)\ if(NULL != struct_source->option_name){\ if (NULL == struct_dest->option_name) {\ struct_dest->option_name = malloc(sizeof(float));\ }\ *(struct_dest->option_name) = *(struct_source->option_name);\ } #define COPY_OPTION_STR(option_name, struct_source, struct_dest)\ if(NULL != struct_source->option_name){\ length = strlen(struct_source->option_name);\ if (NULL != struct_dest->option_name) {\ free(struct_dest->option_name);\ }\ struct_dest->option_name = malloc(length + 1);\ strcpy(struct_dest->option_name, struct_source->option_name);\ } /******* End of functions to copy transcode options *****************/ void transcode_copy_options(struct transcode_options_t *src, struct transcode_options_t *dst) { int length=0; COPY_OPTION_INT(enable,src,dst) COPY_OPTION_INT(video_bitrate,src,dst) COPY_OPTION_INT(audio_bitrate,src,dst) COPY_OPTION_INT(gop,src,dst) COPY_OPTION_INT(b_frames,src,dst) COPY_OPTION_INT(mbd,src,dst) COPY_OPTION_INT(cmp,src,dst) COPY_OPTION_INT(subcmp,src,dst) COPY_OPTION_STR(video_codec,src,dst) COPY_OPTION_STR(audio_codec,src,dst) COPY_OPTION_FLT(crf,src,dst) COPY_OPTION_INT(refs,src,dst) COPY_OPTION_INT(b_strategy,src,dst) COPY_OPTION_INT(coder_type,src,dst) COPY_OPTION_INT(me_method,src,dst) COPY_OPTION_INT(me_range,src,dst) COPY_OPTION_INT(subq,src,dst) COPY_OPTION_INT(trellis,src,dst) COPY_OPTION_INT(sc_threshold,src,dst) COPY_OPTION_STR(rc_eq,src,dst) COPY_OPTION_FLT(qcomp,src,dst) COPY_OPTION_INT(qmin,src,dst) COPY_OPTION_INT(qmax,src,dst) COPY_OPTION_INT(qdiff,src,dst) COPY_OPTION_INT(loop_filter,src,dst) COPY_OPTION_INT(mixed_refs,src,dst) COPY_OPTION_INT(enable_8x8dct,src,dst) COPY_OPTION_INT(x264_partitions,src,dst) COPY_OPTION_INT(level,src,dst) COPY_OPTION_INT(streaming_type,src,dst) COPY_OPTION_STR(sdp_filename,src,dst) COPY_OPTION_INT(aac_profile,src,dst) COPY_OPTION_INT(aac_latm,src,dst) COPY_OPTION_FLT(video_scale,src,dst) COPY_OPTION_STR(ffm_url,src,dst) COPY_OPTION_INT(audio_channels,src,dst) COPY_OPTION_INT(audio_sample_rate,src,dst) COPY_OPTION_INT(video_frames_per_second,src,dst) COPY_OPTION_STR(s_rtp_port,src,dst) COPY_OPTION_INT(keyint_min,src,dst) COPY_OPTION_INT(send_transcoded_only,src,dst) } void transcode_options_apply_templates(struct transcode_options_t *opt, int card, int tuner, int server, int channel_number) { char c_number[10]; char c_card[10]; char c_tuner[10]; char c_server[10]; int len; sprintf(c_number,"%d",channel_number+1); sprintf(c_card,"%d",card); sprintf(c_tuner,"%d",tuner); sprintf(c_server,"%d",server); if(opt->sdp_filename) { len=strlen(opt->sdp_filename)+1; opt->sdp_filename=mumu_string_replace(opt->sdp_filename,&len,1,"%number",c_number); opt->sdp_filename=mumu_string_replace(opt->sdp_filename,&len,1,"%card",c_card); opt->sdp_filename=mumu_string_replace(opt->sdp_filename,&len,1,"%tuner",c_tuner); opt->sdp_filename=mumu_string_replace(opt->sdp_filename,&len,1,"%server",c_server); log_message(log_module,MSG_DETAIL,"Channel %d, sdp_filename %s\n",channel_number,opt->sdp_filename); } if(opt->ffm_url) { len=strlen(opt->ffm_url)+1; opt->ffm_url=mumu_string_replace(opt->ffm_url,&len,1,"%number",c_number); opt->ffm_url=mumu_string_replace(opt->ffm_url,&len,1,"%card",c_card); opt->ffm_url=mumu_string_replace(opt->ffm_url,&len,1,"%tuner",c_tuner); opt->ffm_url=mumu_string_replace(opt->ffm_url,&len,1,"%server",c_server); log_message(log_module,MSG_DETAIL,"Channel %d, ffm_url %s\n",channel_number,opt->ffm_url); } if(opt->s_rtp_port) { len=strlen(opt->s_rtp_port)+1; opt->s_rtp_port=mumu_string_replace(opt->s_rtp_port,&len,1,"%number",c_number); opt->s_rtp_port=mumu_string_replace(opt->s_rtp_port,&len,1,"%card",c_card); opt->s_rtp_port=mumu_string_replace(opt->s_rtp_port,&len,1,"%tuner",c_tuner); opt->s_rtp_port=mumu_string_replace(opt->s_rtp_port,&len,1,"%server",c_server); opt->rtp_port=malloc(sizeof(int)); *opt->rtp_port=string_comput(opt->s_rtp_port); log_message(log_module,MSG_DETAIL,"Channel %d, computed RTP port %d\n",channel_number,*opt->rtp_port); } } mumudvb-1.7.1/src/transcode.h000066400000000000000000000033131177353207000161260ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Code for transcoding * * Code written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef _TRANSCODE_H #define _TRANSCODE_H #include "mumudvb.h" #include "transcode_common.h" #include void* transcode_start_thread(int socket, struct sockaddr_in *socket_addr, transcode_options_t *options); void transcode_request_thread_end(void *transcode_handle); void transcode_wait_thread_end(void *transcode_handle); int transcode_enqueue_data(void *transcode_handle, void *data, int data_size); int transcode_read_option(struct transcode_options_t *transcode_options, char *delimiteurs, char **substring); void transcode_copy_options(struct transcode_options_t *src, struct transcode_options_t *dst); void transcode_options_apply_templates(struct transcode_options_t *opt, int card, int tuner, int server, int channel_number); #endifmumudvb-1.7.1/src/transcode_avlib.c000066400000000000000000002416451177353207000173120ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Code for transcoding * * Code written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * Copyright (c) 2000-2003 Fabrice Bellard * Copyright (c) 2009-2010 Brice Dubost * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "transcode_avlib.h" #include "transcode_queues.h" #include "network.h" #include "mumudvb.h" #include "log.h" #include #include #include #include #include #ifdef HAVE_LIBAVCODEC_AVCODEC_H # include #elif defined(HAVE_FFMPEG_AVCODEC_H) # include #endif #ifdef HAVE_LIBAVFORMAT_AVFORMAT_H # include #elif defined(HAVE_FFMPEG_AVFORMAT_H) # include #endif #ifdef HAVE_LIBSWSCALE_SWSCALE_H # include #elif defined(HAVE_FFMPEG_SWSCALE_H) # include #endif #include static char *log_module="Transcode : "; #define TRANSCODE_BUF_SIZE (5 * 1024 * 1024) #define TRANSCODE_INPUT_BUFFER_SIZE (5 * 1024 * 1024) #define TRANSCODE_OUTPUT_BUFFER_SIZE (TS_PACKET_SIZE * 7) #define PACKETS_QUEUE_LENGTH 500 #define DEFAULT_RTP_PORT 6643 #if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(21<<8)+0) #define STREAM_SAMPLE_ASPECT_RATIO #endif #if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(26<<8)+0) #define av_alloc_format_context avformat_alloc_context #endif #define AAC_LATM_CODEC_ID 0x20032 /* Some random ID */ #define SET_CODEC_OPTION_INT(codec_option, config_option) \ if (NULL != options->config_option) {\ /*printf(#config_option"=%d\n", out_stream->codec->codec_option);*/\ out_stream->codec->codec_option = *options->config_option;\ } #define SET_CODEC_OPTION_FLT(codec_option, config_option) \ if (NULL != options->config_option) {\ /*printf(#config_option"=%f\n", out_stream->codec->codec_option);*/\ out_stream->codec->codec_option = *options->config_option;\ } /************ Compatibility for "old" libavcodec ********************/ //see http://lists.mplayerhq.hu/pipermail/ffmpeg-cvslog/2009-February/019812.html #if LIBAVCODEC_VERSION_INT < ((52<<16)+(15<<8)+0) #warning You are using an "old" version of libavcodec, the audio resampling might not work ReSampleContext *av_audio_resample_init(int output_channels, int input_channels, int output_rate, int input_rate, enum SampleFormat sample_fmt_out, enum SampleFormat sample_fmt_in, int filter_length, int log2_phase_count, int linear, double cutoff) { (void) sample_fmt_out; (void) sample_fmt_in; (void) filter_length; //to make compiler happy (void) log2_phase_count; (void) linear; (void) cutoff; return audio_resample_init( output_channels, input_channels, output_rate, input_rate); } #endif /************ End of Compatibility for "old" libavcodec *****************/ void show_codecs(void); //see http://git.ffmpeg.org/?p=ffmpeg;a=commitdiff;h=a9cef968e49190daf68ad824f71994bd6579bb34 #ifdef HAVE_URL_SPLIT /* FIXME: don't know another way to include this ffmpeg function */ void url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url); #define URL_SPLIT_MUMU url_split #endif #ifdef HAVE_FF_URL_SPLIT /* FIXME: don't know another way to include this ffmpeg function */ void ff_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url); #define URL_SPLIT_MUMU ff_url_split #endif #ifndef URL_SPLIT_MUMU #error "url_split not present, please report" #endif typedef struct output_stream_transcode_data_t { /* Output stream and format context */ AVStream *out_stream; AVFormatContext *out_context; /* Stream's frame counters */ int64_t frame_no; int64_t written_frames; /* Video stream transcoding data */ struct SwsContext *sws_context; AVFrame temp_picture; /* Other transcoding data */ double frame_rate_factor; /* Audio stream transcoding data */ int frame_buf_data_length; void *frame_buf; int frame_size; int sample_size; struct ReSampleContext *resample_context; /* Packet queue */ ref_queue_t packets; } output_stream_transcode_data_t; typedef struct input_stream_transcode_data_t { /* Stream start PTS */ int64_t stream_start_pts; /* Factor for synchronization */ int pts_duration_factor; int sample_size; output_stream_transcode_data_t *output_streams_transcode_data; int output_streams_count; // int x; } input_stream_transcode_data_t; typedef struct transcode_data_t { AVFormatContext *in_context; ref_queue_t out_contexts; input_stream_transcode_data_t *input_streams_transcode_data; int input_streams_count; struct timeval start_time; } transcode_data_t; typedef struct input_context_data_t { pthread_mutex_t *queue_mutex; data_queue_t *queue; int *terminate_thread_flag; int no_data_counter; int data_counter; } input_context_data_t; typedef struct output_context_data_t { int socket; struct sockaddr_in *socket_addr; } output_context_data_t; pthread_mutex_t avlib_mutex = PTHREAD_MUTEX_INITIALIZER; AVCodec aac_latm_encoder; AVCodec *aac_encoder = NULL; int aac_latm_encode(AVCodecContext *c, uint8_t *buf, int buf_size, void *data) { /* Encode data */ int out_size = aac_encoder->encode(c, buf, buf_size, data); if (0 > out_size) { return out_size; /* Error while encoding */ } /* Skip ADTS header (7 bytes), if present - approach from libavformat */ int adts_size = ((0 == c->extradata_size && 0 != out_size) ? 7 : 0); out_size -= adts_size; /* Calculate LATM header size */ int latm_header_size = out_size / 0xff + 1; if (out_size + latm_header_size > buf_size) { return -1; /* Buffer is too small */ } /* Move data to insert LATM header */ memmove(buf + latm_header_size, buf + adts_size, out_size); /* Create LATM header */ int cur_size = out_size; uint8_t *p_header = buf; while (cur_size > 0xfe) { *p_header = 0xff; p_header++; cur_size -= 0xff; } *p_header = cur_size; /* Return size of output data */ return out_size + latm_header_size; } AVCodec* get_latm_encoder() { if (NULL == aac_encoder) { /* Encoder is not initialized */ /* Find AAC encoder */ aac_encoder = avcodec_find_encoder(CODEC_ID_AAC); if (NULL == aac_encoder) { return NULL; /* Failed to find AAC encoder */ } /* AAC LATM is almost copy of built in AAC encoder */ aac_latm_encoder = *aac_encoder; /* Change CODEC_ID_AAC to something else so it will be not defined as AAC encoder */ /* RTP muxer will not enable AAC specific routines for such codec */ aac_latm_encoder.id = AAC_LATM_CODEC_ID; /* Override encode function */ aac_latm_encoder.encode = (NULL == aac_encoder->encode ? NULL : aac_latm_encode); } return &aac_latm_encoder; } /* Copy of ffmpeg function */ char *ff_data_to_hex(char *buff, const uint8_t *src, int s) { int i; static const char hex_table[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; for (i = 0; i < s; i++) { buff[i * 2] = hex_table[src[i] >> 4]; buff[i * 2 + 1] = hex_table[src[i] & 0xF]; } return buff; } int create_sdp(AVFormatContext *ac[], int n_files, char *buff, int size) { /* Create SDP 'header' using default ffmpeg routine */ if (0 != avf_sdp_create(ac, n_files, buff, size)) { return -1; } /* Define SDP 'header' */ char *p = strstr(buff, "m="); if (NULL == p) { return -1; } int buff_len = p - buff; /* Copy "c=..." line to output */ if (NULL == (p = strstr(buff, "c="))) { return -1; } else { char *p2 = strstr(p, "\r\n"); if (NULL == p2) { return -1; } if (buff_len + (p2 - p) + 2 > size) { return -1; } strncpy(buff + buff_len, p, p2 - p + 2); buff_len += (p2 - p) + 2; } /* Create SDP lines for each stream */ char *buff2 = (char*)malloc(size); int i; for (i = 0; i < n_files; i++) { int len; AVCodecContext *codec = ac[i]->streams[0]->codec; switch (codec->codec_id) { case AAC_LATM_CODEC_ID: /* Create SDP lines using specific AAC LATM config */ { /* Create hex config */ int aacsrates[15] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0 }; int j; for (j = 0; j < 15; j++) { if (codec->sample_rate == aacsrates[j]) { break; } } uint8_t config[6] = { 0x40, 0, 0x20 | j, codec->channels << 4, 0x3f, 0xc0 }; char config_hexa[13]; ff_data_to_hex(config_hexa, config, 6); config_hexa[12] = 0; /* Get port */ int port; URL_SPLIT_MUMU(NULL, 0, NULL, 0, NULL, 0, &port, NULL, 0, ac[i]->filename); /* Generate SDP lines for MP4A-LATM */ len = snprintf(buff2, size, "m=audio %d RTP/AVP 96\r\n" "b=AS:%d\r\n" "a=rtpmap:96 MP4A-LATM/%d/%d\r\n" "a=fmtp:96 nobject=2; cpresent=0; config=%s\r\n", port, codec->bit_rate / 1000, codec->sample_rate, codec->channels, config_hexa); if (len + buff_len >= size) { break; /* Buffer is too small */ } /* Copy stream lines to output */ strncpy(buff + buff_len, buff2, len); buff_len += len; break; } default: /* Create SDP lines using default ffmpeg routine */ if (0 == avf_sdp_create(ac + i, 1, buff2, size) && NULL != (p = strstr(buff2, "m="))) { len = strlen(p); if (len != 0 && len + buff_len < size) { /* Copy stream lines to output */ strncpy(buff + buff_len, p, len); buff_len += len; } } break; } } free(buff2); /* End SDP creation */ buff[buff_len] = 0; return 0; } int read_input_packet(void *opaque, uint8_t *buf, int buf_size) { input_context_data_t *context_data = opaque; context_data->no_data_counter = 0; while (0 == *context_data->terminate_thread_flag) { /* Terminate if it requested */ /* Lock mutext and dequeue data from queue */ pthread_mutex_lock(context_data->queue_mutex); int dequeued_size = data_queue_dequeue(context_data->queue, buf, buf_size); pthread_mutex_unlock(context_data->queue_mutex); if (0 < dequeued_size) { context_data->no_data_counter = 0; context_data->data_counter += dequeued_size; return dequeued_size; /* We have data */ } else { if (6 == context_data->no_data_counter) { /* 3 Sec */ log_message( log_module, MSG_INFO, "No data for transcoding.\n"); return -1; } context_data->no_data_counter++; usleep(500000); /* No data yet. Sleep for 0.5 sec */ } } return -1; } int write_output_packet(void *opaque, uint8_t *buf, int buf_size) { /*log_message( log_module, MSG_INFO, "Sending data %d.\n", buf_size);*/ output_context_data_t *context_data = opaque; sendudp(context_data->socket, context_data->socket_addr, buf, buf_size); return buf_size; } ByteIOContext* create_input_byte_context(data_queue_t *queue, pthread_mutex_t *queue_mutex, int *terminate_thread_flag, int input_buffer_size) { /* Allocate input buffer */ unsigned char *input_buffer = (unsigned char*)av_malloc(input_buffer_size); if (NULL == input_buffer) { log_message( log_module, MSG_ERROR, "Couldn't allocate input buffer.\n"); return NULL; } /* Creating input context data */ input_context_data_t *context_data = malloc(sizeof(input_context_data_t)); if (NULL == context_data) { log_message( log_module, MSG_ERROR, "Couldn't allocate input context data.\n"); av_free(input_buffer); return NULL; } context_data->queue = queue; context_data->queue_mutex = queue_mutex; context_data->terminate_thread_flag = terminate_thread_flag; context_data->no_data_counter = 0; context_data->data_counter = 0; /* Creating ByteIOContext using input_buffer */ ByteIOContext *input_io = av_alloc_put_byte(input_buffer, input_buffer_size, 0, context_data, read_input_packet, NULL, NULL); if (NULL == input_io) { log_message( log_module, MSG_ERROR, "Couldn't create input IO context.\n"); free(context_data); av_free(input_buffer); return NULL; } input_io->is_streamed = 1; /* Disallow seek operations */ return input_io; } ByteIOContext* create_output_byte_context(int socket, struct sockaddr_in *socket_addr, int output_buffer_size) { /* Allocate output buffer */ unsigned char *output_buffer = (unsigned char*)av_malloc(output_buffer_size); if (NULL == output_buffer) { log_message( log_module, MSG_ERROR, "Couldn't allocate output buffer.\n"); return NULL; } /* Creating output context data */ output_context_data_t *context_data = malloc(sizeof(output_context_data_t)); if (NULL == context_data) { log_message( log_module, MSG_ERROR, "Couldn't allocate output context data.\n"); av_free(output_buffer); return NULL; } context_data->socket = socket; context_data->socket_addr = socket_addr; /* Creating ByteIOContext using input_buffer */ ByteIOContext *output_io = av_alloc_put_byte(output_buffer, output_buffer_size, 1, context_data, NULL, write_output_packet, NULL); if (NULL == output_io) { log_message( log_module, MSG_ERROR, "Couldn't create output IO context.\n"); free(context_data); av_free(output_buffer); return NULL; } output_io->is_streamed = 1; /* Disallow seek operations */ output_io->max_packet_size = output_buffer_size; /* TODO: am I right? */ return output_io; } void free_byte_context(ByteIOContext *input_output_context) { av_free(input_output_context->buffer); free(input_output_context->opaque); av_free(input_output_context); } void free_format_context(AVFormatContext *context, int input, int streaming_type) { if (input || STREAMING_TYPE_MPEGTS == streaming_type) { free_byte_context(context->pb); } else if (NULL != context->pb && (STREAMING_TYPE_RTP == streaming_type || STREAMING_TYPE_FFM == streaming_type)) { url_fclose(context->pb); } unsigned int i; /* Clear input/output codecs */ pthread_mutex_lock(&avlib_mutex); for (i = 0; i < context->nb_streams; i++) { if (NULL != context->streams[i]->codec->codec) { avcodec_close(context->streams[i]->codec); } } pthread_mutex_unlock(&avlib_mutex); if (input) { av_close_input_stream(context); } else { /* Free output streams */ for (i = 0; i < context->nb_streams; i++) { av_freep(&context->streams[i]->codec); av_freep(&context->streams[i]->priv_data); av_freep(&context->streams[i]); } av_free(context->priv_data); av_free(context); } } AVFormatContext *create_input_format_context(data_queue_t *queue, pthread_mutex_t *queue_mutex, int *terminate_thread_flag, int input_buffer_size) { ByteIOContext *input_io = create_input_byte_context(queue, queue_mutex, terminate_thread_flag, input_buffer_size); if (NULL == input_io) { return NULL; } /* Setting input format as MPEG-2 TS */ AVInputFormat *input_format = av_find_input_format("mpegts"); if (NULL == input_format) { log_message( log_module, MSG_ERROR, "Couldn't find input format.\n"); free_byte_context(input_io); return NULL; } /* Creating input context */ AVFormatContext *in_context; if (0 != av_open_input_stream(&in_context, input_io, "stream", input_format, NULL)) { log_message( log_module, MSG_ERROR, "Couldn't open input stream.\n"); free_byte_context(input_io); return NULL; } /* Retrieve stream information */ pthread_mutex_lock(&avlib_mutex); /*avcodec_open\close require thread safety */ if (0 > av_find_stream_info(in_context)) { log_message( log_module, MSG_ERROR, "Couldn't find stream information.\n"); pthread_mutex_unlock(&avlib_mutex); free_format_context(in_context, 1, 0); return NULL; } pthread_mutex_unlock(&avlib_mutex); return in_context; } AVFormatContext *create_output_format_context(int socket, struct sockaddr_in *socket_addr, int output_buffer_size, char *url, int streaming_type, int open_byte_context) { /* Select output format */ AVOutputFormat *fmt = NULL; switch (streaming_type) { case STREAMING_TYPE_MPEGTS: fmt = guess_format("mpegts", NULL, NULL); break; case STREAMING_TYPE_RTP: fmt = guess_format("rtp", NULL, NULL); break; case STREAMING_TYPE_FFM: fmt = guess_format("ffm", NULL, NULL); break; } if (NULL == fmt) { log_message( log_module, MSG_ERROR, "Couldn't define output format.\n"); return NULL; } else log_message( log_module, MSG_ERROR, "Output format: %s\n",fmt->long_name); /* Create output context */ AVFormatContext *out_context = av_alloc_format_context(); if (NULL == out_context) { log_message( log_module, MSG_ERROR, "Couldn't create output format context.\n"); return NULL; } out_context->pb = NULL; if (NULL != url) { if (open_byte_context) { url_fopen(&out_context->pb, url, URL_WRONLY); } strcpy(out_context->filename, url); } else { if (open_byte_context) { out_context->pb = create_output_byte_context(socket, socket_addr, output_buffer_size); } } if (open_byte_context && NULL == out_context->pb) { log_message( log_module, MSG_ERROR, "Couldn't create output format context.\n"); av_free(out_context); return NULL; } out_context->oformat = fmt; return out_context; } int initialize_out_video_stream(AVStream *out_stream, AVStream *in_stream, transcode_options_t *options) { /* Setting codec */ AVCodec *codec = avcodec_find_encoder_by_name(NULL != options->video_codec ? options->video_codec : "mpeg4"); if (NULL == codec || CODEC_TYPE_VIDEO != codec->type) { log_message( log_module, MSG_ERROR, "Couldn't find video encoder.\n"); return 0; } avcodec_get_context_defaults2(out_stream->codec, CODEC_TYPE_VIDEO); out_stream->codec->codec_type = CODEC_TYPE_VIDEO; out_stream->codec->codec_id = codec->id; /* Other configurable parameters */ SET_CODEC_OPTION_INT(gop_size, gop) SET_CODEC_OPTION_INT(max_b_frames, b_frames) SET_CODEC_OPTION_INT(bit_rate, video_bitrate) SET_CODEC_OPTION_INT(me_cmp, cmp) SET_CODEC_OPTION_INT(me_sub_cmp, subcmp) SET_CODEC_OPTION_INT(mb_decision, mbd) SET_CODEC_OPTION_FLT(crf, crf) SET_CODEC_OPTION_INT(refs, refs) SET_CODEC_OPTION_INT(b_frame_strategy, b_strategy) SET_CODEC_OPTION_INT(coder_type, coder_type) SET_CODEC_OPTION_INT(me_method, me_method) SET_CODEC_OPTION_INT(me_range, me_range) SET_CODEC_OPTION_INT(me_subpel_quality, subq) SET_CODEC_OPTION_INT(trellis, trellis) SET_CODEC_OPTION_INT(scenechange_threshold, sc_threshold) SET_CODEC_OPTION_INT(keyint_min, keyint_min) if (NULL != options->rc_eq) { out_stream->codec->rc_eq = options->rc_eq; } SET_CODEC_OPTION_FLT(qcompress, qcomp) SET_CODEC_OPTION_INT(qmin, qmin) SET_CODEC_OPTION_INT(qmax, qmax) SET_CODEC_OPTION_INT(max_qdiff, qdiff) if (NULL != options->loop_filter && 1 == *options->loop_filter) { out_stream->codec->flags |= CODEC_FLAG_LOOP_FILTER; } if (NULL != options->mixed_refs && 1 == *options->mixed_refs) { out_stream->codec->flags2 |= CODEC_FLAG2_MIXED_REFS; } if (NULL != options->enable_8x8dct && 1 == *options->enable_8x8dct) { out_stream->codec->flags2 |= CODEC_FLAG2_8X8DCT; } if (NULL != options->x264_partitions && 1 == *options->x264_partitions) { out_stream->codec->partitions = X264_PART_I4X4 | X264_PART_I8X8 | X264_PART_P8X8 | X264_PART_B8X8; } if (NULL != options->video_scale && 1 != *options->video_scale && *options->video_scale > 0) { out_stream->codec->width = (int)((double)in_stream->codec->width * *options->video_scale + 0.5); out_stream->codec->height = (int)((double)in_stream->codec->height * *options->video_scale + 0.5); out_stream->codec->width = out_stream->codec->width == 0 ? 1 : out_stream->codec->width; out_stream->codec->height = out_stream->codec->width == 0 ? 1 : out_stream->codec->height; } else { out_stream->codec->width = in_stream->codec->width; out_stream->codec->height = in_stream->codec->height; } SET_CODEC_OPTION_INT(level, level) /* Copy some input stream parameters */ if (NULL != options->video_frames_per_second && *(options->video_frames_per_second) > 0) { out_stream->codec->time_base.num = 1; out_stream->codec->time_base.den = *(options->video_frames_per_second); } else if (25 == in_stream->r_frame_rate.num && 1 == in_stream->r_frame_rate.den) { /* We have estimated framerate 25 FPS */ out_stream->codec->time_base.num = in_stream->r_frame_rate.den; out_stream->codec->time_base.den = in_stream->r_frame_rate.num; } else { out_stream->codec->time_base = in_stream->codec->time_base; } out_stream->codec->pix_fmt = in_stream->codec->pix_fmt; /* TODO: own pixel format??? yuv420p = 0 */ #ifdef STREAM_SAMPLE_ASPECT_RATIO if (0 != in_stream->sample_aspect_ratio.num) { out_stream->sample_aspect_ratio = in_stream->sample_aspect_ratio; out_stream->codec->sample_aspect_ratio = in_stream->sample_aspect_ratio; } else { out_stream->sample_aspect_ratio = in_stream->codec->sample_aspect_ratio; out_stream->codec->sample_aspect_ratio = in_stream->codec->sample_aspect_ratio; } #else out_stream->codec->sample_aspect_ratio = in_stream->codec->sample_aspect_ratio; #endif /*if (out_context->oformat->flags & AVFMT_GLOBALHEADER) {*/ out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; /*}*/ if (0 > avcodec_open(out_stream->codec, codec)) { log_message( log_module, MSG_ERROR, "Couldn't open codec for encoding.\n"); return 0; } return 1; } int initialize_out_audio_stream(AVStream *out_stream, AVStream *in_stream, AVFormatContext *out_context, transcode_options_t *options) { /* Setting codec */ AVCodec *codec = avcodec_find_encoder_by_name( NULL != options->audio_codec ? options->audio_codec : "libmp3lame"); if (NULL == codec || codec->type != CODEC_TYPE_AUDIO) { log_message( log_module, MSG_ERROR, "Couldn't find audio encoder.\n"); return 0; } if (CODEC_ID_AAC == codec->id && NULL != options->streaming_type && STREAMING_TYPE_RTP == *options->streaming_type && 1 == (options->aac_latm == NULL ? 0 : *options->aac_latm)) { codec = get_latm_encoder(); } avcodec_get_context_defaults2(out_stream->codec, CODEC_TYPE_AUDIO); out_stream->codec->codec_type = CODEC_TYPE_AUDIO; out_stream->codec->codec_id = codec->id; /* Other configurable parameters */ SET_CODEC_OPTION_INT(bit_rate, audio_bitrate) SET_CODEC_OPTION_INT(profile, aac_profile) /* Copy some input stream parameters */ out_stream->time_base = in_stream->time_base; if (NULL != options->audio_channels && *(options->audio_channels) > 0) { out_stream->codec->channels = *(options->audio_channels); } else { out_stream->codec->channels = in_stream->codec->channels; } if (NULL != options->audio_sample_rate && *(options->audio_sample_rate) > 0) { out_stream->codec->sample_rate = *(options->audio_sample_rate); } else { out_stream->codec->sample_rate = in_stream->codec->sample_rate; } out_stream->codec->sample_fmt = in_stream->codec->sample_fmt; out_context = out_context; /* He-he. Just hiding warning. This line can be safely removed. */ /* FIXME: is it good for audio stream to set always CODEC_FLAG_GLOBAL_HEADER? RTP output format is not CODEC_FLAG_GLOBAL_HEADER but AAC codec requires it. Strange. */ /*if (out_context->oformat->flags & AVFMT_GLOBALHEADER) { */ out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; /*}*/ //out_stream->pts.v-al = 100; if (0 > avcodec_open(out_stream->codec, codec)) { log_message( log_module, MSG_ERROR, "Couldn't open codec for encoding.\n"); return 0; } return 1; } void initialize_transcode_common_free(AVCodecContext *in_stream_codec, int is_avlib_mutex_locked, AVFormatContext *out_context, int *streaming_type, struct SwsContext *sws_context, AVFrame *temp_picture, struct ReSampleContext *resample_context, void *frame_buf) { if (!is_avlib_mutex_locked) { pthread_mutex_lock(&avlib_mutex); } if (NULL != in_stream_codec) { avcodec_close(in_stream_codec); } pthread_mutex_unlock(&avlib_mutex); if (NULL != out_context && NULL != streaming_type && STREAMING_TYPE_RTP == *streaming_type) { free_format_context(out_context, 0, *streaming_type); } if (NULL != sws_context) { sws_freeContext(sws_context); } if (NULL != temp_picture) { avpicture_free((AVPicture*)temp_picture); } if (NULL != resample_context) { audio_resample_close(resample_context); } if (NULL != frame_buf) { free(frame_buf); } } transcode_data_t* initialize_transcode_data(transcode_thread_data_t *transcode_thread_data) { /* Create input format context */ AVFormatContext *in_context = NULL; log_message( log_module, MSG_INFO, "Initializing transcoding.\n"); in_context = create_input_format_context(&transcode_thread_data->data_queue, &transcode_thread_data->queue_mutex, &transcode_thread_data->terminate_thread_flag, TRANSCODE_INPUT_BUFFER_SIZE); if (NULL == in_context) { /* CAM not initialized or wrong stream */ log_message( log_module, MSG_ERROR, "Failed to initialize input format context.\n"); return NULL; } /* Input format initialized */ dump_format(in_context, 0, "stream", 0); transcode_data_t *transcode_data = malloc(sizeof(transcode_data_t)); if (NULL == transcode_data) { log_message( log_module, MSG_ERROR, "Failed to initialize transcode data.\n"); free_format_context(in_context, 1, 0); return NULL; } transcode_data->in_context = in_context; transcode_data->start_time.tv_sec = transcode_data->start_time.tv_usec = 0; ref_queue_init(&transcode_data->out_contexts, 0); transcode_data->input_streams_transcode_data = calloc(in_context->nb_streams, sizeof(input_stream_transcode_data_t)); transcode_data->input_streams_count = in_context->nb_streams; if (NULL == transcode_data->input_streams_transcode_data) { log_message( log_module, MSG_ERROR, "Failed to initialize transcode data.\n"); free_format_context(in_context, 1, 0); free(transcode_data); return NULL; } return transcode_data; } int initialize_video_parameters(input_stream_transcode_data_t *input_stream_transcode_data, output_stream_transcode_data_t *output_stream_transcode_data, AVStream *in_stream, AVStream *out_stream) { input_stream_transcode_data->pts_duration_factor = (int)((double)in_stream->time_base.den * in_stream->codec->time_base.num / in_stream->codec->time_base.den / in_stream->time_base.num + 0.5); output_stream_transcode_data->frame_rate_factor = (double)out_stream->codec->time_base.num * in_stream->codec->time_base.den / out_stream->codec->time_base.den / in_stream->codec->time_base.num; /* Initialize image scaling */ if (in_stream->codec->width != out_stream->codec->width || in_stream->codec->height != out_stream->codec->height) { output_stream_transcode_data->sws_context = sws_getContext( in_stream->codec->width, in_stream->codec->height, in_stream->codec->pix_fmt, out_stream->codec->width, out_stream->codec->height, out_stream->codec->pix_fmt, SWS_BICUBIC, NULL, NULL, NULL); if (NULL == output_stream_transcode_data->sws_context) { log_message( log_module, MSG_ERROR, "Image scaling initialization failed.\n"); return 0; } avcodec_get_frame_defaults(&output_stream_transcode_data->temp_picture); if (avpicture_alloc((AVPicture*)&output_stream_transcode_data->temp_picture, out_stream->codec->pix_fmt, out_stream->codec->width, out_stream->codec->height) != 0) { log_message( log_module, MSG_ERROR, "Image scaling initialization failed.\n"); sws_freeContext(output_stream_transcode_data->sws_context); return 0; } } return 1; } int initialize_audio_parameters(input_stream_transcode_data_t *input_stream_transcode_data, output_stream_transcode_data_t *output_stream_transcode_data, AVStream *in_stream, AVStream *out_stream) { if (out_stream->codec->frame_size < 1) { log_message( log_module, MSG_ERROR, "Initialize audio frame buffer failed: frame size < 1.\n"); return 0; } /* Initialize audio frame buffer */ input_stream_transcode_data->sample_size = av_get_bits_per_sample_format(in_stream->codec->sample_fmt) * in_stream->codec->channels / 8; output_stream_transcode_data->sample_size = av_get_bits_per_sample_format(out_stream->codec->sample_fmt) * out_stream->codec->channels / 8; output_stream_transcode_data->frame_size = output_stream_transcode_data->sample_size * out_stream->codec->frame_size; output_stream_transcode_data->frame_buf = malloc(output_stream_transcode_data->frame_size); if (NULL == output_stream_transcode_data->frame_buf) { log_message( log_module, MSG_ERROR, "Initialize audio frame buffer failed.\n"); return 0; } output_stream_transcode_data->frame_buf_data_length = 0; input_stream_transcode_data->pts_duration_factor = (int)((double)in_stream->time_base.den * in_stream->codec->frame_size / in_stream->time_base.num / in_stream->codec->sample_rate + 0.5); output_stream_transcode_data->frame_rate_factor = (double)out_stream->codec->frame_size * in_stream->codec->sample_rate / in_stream->codec->frame_size / out_stream->codec->sample_rate; /* Initialize audio resampling */ if (in_stream->codec->sample_rate != out_stream->codec->sample_rate || in_stream->codec->channels != out_stream->codec->channels || in_stream->codec->sample_fmt != out_stream->codec->sample_fmt) { output_stream_transcode_data->resample_context = av_audio_resample_init( out_stream->codec->channels, in_stream->codec->channels, out_stream->codec->sample_rate, in_stream->codec->sample_rate, out_stream->codec->sample_fmt, in_stream->codec->sample_fmt, 16, 10, 0, 0.8); if (NULL == output_stream_transcode_data->resample_context) { log_message( log_module, MSG_ERROR, "Can not initialize audio resampling.\n"); free(output_stream_transcode_data->frame_buf); return 0; } } return 1; } void* initialize_transcode_common(transcode_thread_data_t *transcode_thread_data) { /* Initialize transcode data and open input context */ transcode_data_t *transcode_data = initialize_transcode_data(transcode_thread_data); if (NULL == transcode_data) { return NULL; } AVFormatContext *in_context = transcode_data->in_context; AVFormatContext **out_contexts = calloc(in_context->nb_streams, sizeof(AVFormatContext*)); if (NULL == out_contexts) { log_message( log_module, MSG_ERROR, "Failed to initialize output contexts buffer.\n"); free_format_context(in_context, 1, 0); free(transcode_data->input_streams_transcode_data); free(transcode_data); return NULL; } AVFormatContext *out_context = NULL; if (NULL == transcode_thread_data->options->streaming_type || STREAMING_TYPE_MPEGTS == *transcode_thread_data->options->streaming_type) { /* Need single output format context for all streams */ out_context = create_output_format_context(transcode_thread_data->socket, transcode_thread_data->socket_addr, TRANSCODE_OUTPUT_BUFFER_SIZE, NULL, NULL == transcode_thread_data->options->streaming_type ? STREAMING_TYPE_MPEGTS : *transcode_thread_data->options->streaming_type, 1); if (NULL == out_context) { log_message( log_module, MSG_ERROR, "Failed to create output context.\n"); free_format_context(in_context, 1, 0); free(transcode_data->input_streams_transcode_data); free(transcode_data); free(out_contexts); return NULL; } ref_queue_enqueue(&transcode_data->out_contexts, out_context); } int output_streams_counter = 0; int output_contexts_counter = 0; unsigned int i; /* Loop through all input streams and duplicate video/audio/subtitles in output streams */ int64_t smallest_start_time = 0; int rtp_port = NULL == transcode_thread_data->options->rtp_port ? DEFAULT_RTP_PORT : *transcode_thread_data->options->rtp_port; rtp_port = (rtp_port + 1) / 2 * 2; /* get even port */ for (i = 0; i < in_context->nb_streams; i++) { AVStream *in_stream = transcode_data->in_context->streams[i]; output_stream_transcode_data_t output_stream_transcode_data; output_stream_transcode_data.out_stream = NULL; output_stream_transcode_data.frame_no = 0; output_stream_transcode_data.written_frames = -1; output_stream_transcode_data.sws_context = NULL; output_stream_transcode_data.resample_context = NULL; output_stream_transcode_data.frame_buf = NULL; ref_queue_init(&output_stream_transcode_data.packets, PACKETS_QUEUE_LENGTH); transcode_data->input_streams_transcode_data[i].output_streams_transcode_data = NULL; transcode_data->input_streams_transcode_data[i].output_streams_count = 0; // transcode_data->input_streams_transcode_data[i].x = 0; if (CODEC_TYPE_VIDEO == in_stream->codec->codec_type || CODEC_TYPE_AUDIO == in_stream->codec->codec_type /*|| CODEC_TYPE_SUBTITLE == in_stream->codec->codec_type*/) { /* Initialize decoder for input stream */ AVCodec *codec = avcodec_find_decoder(in_stream->codec->codec_id); if (NULL == codec) { log_message( log_module, MSG_ERROR, "Couldn't find codec for decoding.\n"); continue; } pthread_mutex_lock(&avlib_mutex); if (0 > avcodec_open(in_stream->codec, codec)) { log_message( log_module, MSG_ERROR, "Couldn't open codec for decoding.\n"); pthread_mutex_unlock(&avlib_mutex); continue; } /* WORKAROUND: specific bug - empty subtitle stream detected as audio one. Skip it. */ if (0 == in_stream->codec->sample_rate && CODEC_TYPE_AUDIO == in_stream->codec->codec_type) { initialize_transcode_common_free(in_stream->codec, 1, NULL, NULL, NULL, NULL, NULL, NULL); /* Fix memory leak in av_read_paket when reading this stream */ in_stream->need_parsing = AVSTREAM_PARSE_NONE; continue; } if (NULL != transcode_thread_data->options->streaming_type && STREAMING_TYPE_RTP == *transcode_thread_data->options->streaming_type) { /* Creating separate output format context for each stream */ out_context = NULL; /* URL for RTP sreaming */ char url[30]; sprintf(url, "rtp://%s:%d", transcode_thread_data->options->ip, rtp_port); out_context = create_output_format_context(transcode_thread_data->socket, transcode_thread_data->socket_addr, TRANSCODE_OUTPUT_BUFFER_SIZE, url, *transcode_thread_data->options->streaming_type, 1); if (NULL == out_context) { initialize_transcode_common_free(in_stream->codec, 1, NULL, NULL, NULL, NULL, NULL, NULL); continue; } } /* Create output stream - analog of input stream, but with another codec */ AVStream *out_stream = av_new_stream(out_context, i); if (!out_stream) { log_message( log_module, MSG_ERROR, "Couldn't create new output stream.\n"); initialize_transcode_common_free(in_stream->codec, 1, out_context, transcode_thread_data->options->streaming_type, NULL, NULL, NULL, NULL); continue; } /* Initialize encoder for output stream */ if ((CODEC_TYPE_VIDEO == in_stream->codec->codec_type && !initialize_out_video_stream(out_stream, in_stream, transcode_thread_data->options)) || (CODEC_TYPE_AUDIO == in_stream->codec->codec_type && !initialize_out_audio_stream(out_stream, in_stream, out_context, transcode_thread_data->options))) { initialize_transcode_common_free(in_stream->codec, 1, out_context, transcode_thread_data->options->streaming_type, NULL, NULL, NULL, NULL); continue; } pthread_mutex_unlock(&avlib_mutex); /* Add stream info to transcoding data */ /* Calculating start time for all streams */ if (in_stream->start_time < smallest_start_time || 0 == smallest_start_time) { smallest_start_time = in_stream->start_time; } /* Calculating various options */ if (CODEC_TYPE_VIDEO == in_stream->codec->codec_type) { if (!initialize_video_parameters(transcode_data->input_streams_transcode_data + i, &output_stream_transcode_data, in_stream, out_stream)) { initialize_transcode_common_free(in_stream->codec, 0, out_context, transcode_thread_data->options->streaming_type, NULL, NULL, NULL, NULL); continue; } } else if (CODEC_TYPE_AUDIO == in_stream->codec->codec_type) { if (!initialize_audio_parameters(transcode_data->input_streams_transcode_data + i, &output_stream_transcode_data, in_stream, out_stream)) { initialize_transcode_common_free(in_stream->codec, 0, out_context, transcode_thread_data->options->streaming_type, NULL, NULL, NULL, NULL); continue; } } else if (CODEC_TYPE_SUBTITLE == in_stream->codec->codec_type) { /* Add subtitles support here */ } if (NULL != transcode_thread_data->options->streaming_type && STREAMING_TYPE_RTP == *transcode_thread_data->options->streaming_type) { /* Set output context parameters */ if (0 > av_set_parameters(out_context, NULL)) { log_message( log_module, MSG_ERROR, "Couldn't set output context parameters.\n"); initialize_transcode_common_free(in_stream->codec, 0, out_context, transcode_thread_data->options->streaming_type, output_stream_transcode_data.sws_context, &output_stream_transcode_data.temp_picture, output_stream_transcode_data.resample_context, output_stream_transcode_data.frame_buf); continue; } /* Write output context header */ if (0 != av_write_header(out_context)) { log_message( log_module, MSG_ERROR, "Writing header failed.\n"); initialize_transcode_common_free(in_stream->codec, 0, out_context, transcode_thread_data->options->streaming_type, output_stream_transcode_data.sws_context, &output_stream_transcode_data.temp_picture, output_stream_transcode_data.resample_context, output_stream_transcode_data.frame_buf); continue; } dump_format(out_context, 0, out_context->filename, 1); ref_queue_enqueue(&transcode_data->out_contexts, out_context); out_contexts[output_contexts_counter] = out_context; output_contexts_counter++; rtp_port += 2; } transcode_data->input_streams_transcode_data[i].output_streams_transcode_data = malloc(sizeof(output_stream_transcode_data_t)); if (NULL == transcode_data->input_streams_transcode_data[i].output_streams_transcode_data) { log_message( log_module, MSG_ERROR, "Failed to allocate memory for output_streams_transcode_data.\n"); initialize_transcode_common_free(in_stream->codec, 0, out_context, transcode_thread_data->options->streaming_type, output_stream_transcode_data.sws_context, &output_stream_transcode_data.temp_picture, output_stream_transcode_data.resample_context, output_stream_transcode_data.frame_buf); continue; } output_stream_transcode_data.out_context = out_context; output_stream_transcode_data.out_stream = out_stream; transcode_data->input_streams_transcode_data[i].output_streams_transcode_data[0] = output_stream_transcode_data; transcode_data->input_streams_transcode_data[i].output_streams_count = 1; output_streams_counter++; } } if (0 == output_streams_counter) { goto INITIALIZE_TRANSCODING_ERROR; } /* Creating SDP file if needed */ if (NULL != transcode_thread_data->options->streaming_type && STREAMING_TYPE_RTP == *transcode_thread_data->options->streaming_type && NULL != transcode_thread_data->options->sdp_filename) { FILE *sdp_file = fopen(transcode_thread_data->options->sdp_filename, "w+"); if (NULL != sdp_file) { char *buff = malloc(10240); if (NULL != buff) { /*avf_sdp_create(out_contexts, output_contexts_counter, buff, 10240);*/ if (0 == create_sdp(out_contexts, output_contexts_counter, buff, 10240)) { fprintf(sdp_file, "%s", buff); } free(buff); } fclose(sdp_file); } } /* Synchronizing start time to latest one */ for (i = 0; i < in_context->nb_streams; i++) { transcode_data->input_streams_transcode_data[i].stream_start_pts = smallest_start_time; } //transcode_data->input_streams_transcode_data[0].stream_start_pts += 3600 * 100; if (NULL == transcode_thread_data->options->streaming_type || STREAMING_TYPE_MPEGTS == *transcode_thread_data->options->streaming_type) { /* Set output context parameters */ if (0 > av_set_parameters(out_context, NULL)) { log_message( log_module, MSG_ERROR, "Couldn't set output context parameters.\n"); goto INITIALIZE_TRANSCODING_ERROR; } /* Write output context header */ if (0 != av_write_header(out_context)) { log_message( log_module, MSG_ERROR, "Writing header failed.\n"); goto INITIALIZE_TRANSCODING_ERROR; } dump_format(out_context, 0, out_context->filename, 1); } free(out_contexts); return transcode_data; INITIALIZE_TRANSCODING_ERROR: free(out_contexts); free_transcode(transcode_data, transcode_thread_data); return NULL; } void* initialize_transcode_ffm(transcode_thread_data_t *transcode_thread_data) { if (NULL == transcode_thread_data->options->ffm_url) { log_message( log_module, MSG_ERROR, "URL of FFM feed was not specified (transcode_ffm_url).\n"); return NULL; } int streaming_type = *transcode_thread_data->options->streaming_type; /* Initialize transcode data and open input context */ transcode_data_t *transcode_data = initialize_transcode_data(transcode_thread_data); if (NULL == transcode_data) { return NULL; } AVFormatContext *in_context = transcode_data->in_context; /* Create output format context */ AVFormatContext *out_context = create_output_format_context(transcode_thread_data->socket, transcode_thread_data->socket_addr, TRANSCODE_OUTPUT_BUFFER_SIZE, transcode_thread_data->options->ffm_url, streaming_type, 0); if (NULL == out_context) { log_message( log_module, MSG_ERROR, "Failed to initialize output format context.\n"); free_format_context(in_context, 1, 0); free(transcode_data->input_streams_transcode_data); free(transcode_data); return NULL; } ref_queue_enqueue(&transcode_data->out_contexts, out_context); /* Read FFM streams */ pthread_mutex_lock(&avlib_mutex); AVFormatContext *ffm_format_context; if (0 > av_open_input_file(&ffm_format_context, transcode_thread_data->options->ffm_url, NULL, FFM_PACKET_SIZE, NULL)) { log_message( log_module, MSG_ERROR, "Failed to read FFM feed.\n"); pthread_mutex_unlock(&avlib_mutex); free_format_context(out_context, 0, streaming_type); free_format_context(in_context, 1, 0); free(transcode_data->input_streams_transcode_data); free(transcode_data); return NULL; } pthread_mutex_unlock(&avlib_mutex); dump_format(ffm_format_context, 0, transcode_thread_data->options->ffm_url, 0); /* Copy FFM streams to output context (approach from ffmpeg sources) */ out_context->nb_streams = ffm_format_context->nb_streams; unsigned int i; for(i = 0; i < ffm_format_context->nb_streams; i++) { /* TODO: Add checks and free routines for this loop */ AVStream *st; st = av_mallocz(sizeof(AVStream)); memcpy(st, ffm_format_context->streams[i], sizeof(AVStream)); st->codec = avcodec_alloc_context(); memcpy(st->codec, ffm_format_context->streams[i]->codec, sizeof(AVCodecContext)); st->codec->thread_count = 1; out_context->streams[i] = st; } av_close_input_file(ffm_format_context); url_fopen(&out_context->pb, out_context->filename, URL_WRONLY); if (NULL == out_context->pb) { log_message( log_module, MSG_ERROR, "Failed to open FFM feed.\n"); free_format_context(out_context, 0, streaming_type); free_format_context(in_context, 1, 0); free(transcode_data->input_streams_transcode_data); free(transcode_data); return NULL; } dump_format(out_context, 0, out_context->filename, 1); /* Open output streams for transcoding */ int output_video_streams = 0; int output_audio_streams = 0; for (i = 0; i < out_context->nb_streams; i++) { AVCodec *codec = avcodec_find_encoder(out_context->streams[i]->codec->codec_id); if (NULL == codec || (CODEC_TYPE_VIDEO != codec->type && CODEC_TYPE_AUDIO != codec->type)) { continue; } pthread_mutex_lock(&avlib_mutex); if (0 > avcodec_open(out_context->streams[i]->codec, codec)) { log_message( log_module, MSG_ERROR, "Couldn't open codec for encoding.\n"); pthread_mutex_unlock(&avlib_mutex); continue; } pthread_mutex_unlock(&avlib_mutex); if (CODEC_TYPE_VIDEO == codec->type) { output_video_streams++; } else if (CODEC_TYPE_AUDIO == codec->type) { output_audio_streams++; } } if (0 == output_video_streams && 0 == output_audio_streams) { log_message( log_module, MSG_ERROR, "No output streams for transcoding.\n"); free_transcode(transcode_data, transcode_thread_data); return NULL; } /* Open input streams for transcoding */ int is_audio_initialized = 0; int is_video_initialized = 0; int64_t smallest_start_time = 0; for (i = 0; i < in_context->nb_streams; i++) { AVStream *in_stream = transcode_data->in_context->streams[i]; transcode_data->input_streams_transcode_data[i].output_streams_transcode_data = NULL; transcode_data->input_streams_transcode_data[i].output_streams_count = 0; if (CODEC_TYPE_VIDEO == in_stream->codec->codec_type || CODEC_TYPE_AUDIO == in_stream->codec->codec_type) { /* Initialize decoder for input stream */ AVCodec *codec = avcodec_find_decoder(in_stream->codec->codec_id); if (NULL == codec) { log_message( log_module, MSG_ERROR, "Couldn't find codec for decoding.\n"); continue; } pthread_mutex_lock(&avlib_mutex); if (0 > avcodec_open(in_stream->codec, codec)) { log_message( log_module, MSG_ERROR, "Couldn't open codec for decoding.\n"); pthread_mutex_unlock(&avlib_mutex); continue; } /* WORKAROUND: specific bug - empty subtitle stream detected as audio one. Skip it. */ if (0 == in_stream->codec->sample_rate && CODEC_TYPE_AUDIO == in_stream->codec->codec_type) { initialize_transcode_common_free(in_stream->codec, 1, NULL, NULL, NULL, NULL, NULL, NULL); /* Fix memory leak in av_read_paket when reading this stream */ in_stream->need_parsing = AVSTREAM_PARSE_NONE; continue; } if ((CODEC_TYPE_VIDEO == in_stream->codec->codec_type && is_video_initialized) || (CODEC_TYPE_AUDIO == in_stream->codec->codec_type && is_audio_initialized)) { /* Audio or video already initialized - skipping */ initialize_transcode_common_free(in_stream->codec, 1, NULL, NULL, NULL, NULL, NULL, NULL); continue; } pthread_mutex_unlock(&avlib_mutex); if (CODEC_TYPE_VIDEO == in_stream->codec->codec_type) { transcode_data->input_streams_transcode_data[i].output_streams_count = output_video_streams; } else if (CODEC_TYPE_AUDIO == in_stream->codec->codec_type) { transcode_data->input_streams_transcode_data[i].output_streams_count = output_audio_streams; } if (0 != transcode_data->input_streams_transcode_data[i].output_streams_count) { transcode_data->input_streams_transcode_data[i].output_streams_transcode_data = calloc(sizeof(output_stream_transcode_data_t), transcode_data->input_streams_transcode_data[i].output_streams_count); } else { initialize_transcode_common_free(in_stream->codec, 0, NULL, NULL, NULL, NULL, NULL, NULL); continue; } unsigned int j; int good_streams_counter = 0; for (j = 0; j < out_context->nb_streams; j++) { if (out_context->streams[j]->codec->codec_type == in_stream->codec->codec_type) { output_stream_transcode_data_t *output_stream_transcode_data = transcode_data->input_streams_transcode_data[i].output_streams_transcode_data + good_streams_counter; if (CODEC_TYPE_VIDEO == in_stream->codec->codec_type) { if (!initialize_video_parameters(transcode_data->input_streams_transcode_data + i, output_stream_transcode_data, in_stream, out_context->streams[j])) { continue; } } else if (CODEC_TYPE_AUDIO == in_stream->codec->codec_type) { if (!initialize_audio_parameters(transcode_data->input_streams_transcode_data + i, output_stream_transcode_data, in_stream, out_context->streams[j])) { continue; } } output_stream_transcode_data->out_context = out_context; output_stream_transcode_data->out_stream = out_context->streams[j]; output_stream_transcode_data->frame_no = 0; output_stream_transcode_data->written_frames = -1; ref_queue_init(&output_stream_transcode_data->packets, PACKETS_QUEUE_LENGTH); good_streams_counter++; } } transcode_data->input_streams_transcode_data[i].output_streams_count = good_streams_counter; if (0 != good_streams_counter) { /* Calculating start time for all streams */ if (in_stream->start_time < smallest_start_time || 0 == smallest_start_time) { smallest_start_time = in_stream->start_time; } if (CODEC_TYPE_VIDEO == in_stream->codec->codec_type) { is_video_initialized = 1; } else if (CODEC_TYPE_AUDIO == in_stream->codec->codec_type) { is_audio_initialized = 1; } } } } if (!is_video_initialized && !is_audio_initialized) { log_message( log_module, MSG_ERROR, "No input streams for transcoding.\n"); free_transcode(transcode_data, transcode_thread_data); return NULL; } /* Synchronizing start time */ for (i = 0; i < in_context->nb_streams; i++) { transcode_data->input_streams_transcode_data[i].stream_start_pts = smallest_start_time; } /* Set output context pameters */ if (0 > av_set_parameters(out_context, NULL)) { log_message( log_module, MSG_ERROR, "Couldn't set output context parameters.\n"); free_transcode(transcode_data, transcode_thread_data); return NULL; } /* Write output context header */ if (0 != av_write_header(out_context)) { log_message( log_module, MSG_ERROR, "Writing header failed.\n"); free_transcode(transcode_data, transcode_thread_data); return NULL; } //dump_format(out_context, 0, out_context->filename, 1); return transcode_data; } void* initialize_transcode(transcode_thread_data_t *transcode_thread_data) { /* Initialize all codecs */ pthread_mutex_lock(&avlib_mutex); static int avlib_initialized = 0; if (!avlib_initialized) { log_message( log_module, MSG_INFO, "Initializing avlibs.\n"); avlib_initialized = 1; avcodec_register_all(); av_register_all(); show_codecs(); //show the available codecs } pthread_mutex_unlock(&avlib_mutex); if (NULL != transcode_thread_data->options->streaming_type && STREAMING_TYPE_FFM == *(transcode_thread_data->options->streaming_type)) { return initialize_transcode_ffm(transcode_thread_data); } return initialize_transcode_common(transcode_thread_data); } void free_transcode(void *transcode_avlib_handle, transcode_thread_data_t *transcode_thread_data) { transcode_data_t *transcode_data = transcode_avlib_handle; /* Close output format context(s) */ AVFormatContext *out_context; while (NULL != (out_context = ref_queue_dequeue(&transcode_data->out_contexts))) { /* Writing trailer */ if (0 != av_write_trailer(out_context)) { log_message( log_module, MSG_ERROR, "Couldn't write trailer.\n"); } free_format_context(out_context, 0, NULL == transcode_thread_data->options->streaming_type ? STREAMING_TYPE_MPEGTS : *transcode_thread_data->options->streaming_type); } /* Free steams transcoding data */ int i; for (i = 0; i < transcode_data->input_streams_count; i++) { if (NULL != transcode_data->input_streams_transcode_data[i].output_streams_transcode_data) { int j; for (j = 0; j < transcode_data->input_streams_transcode_data[i].output_streams_count; j++) { output_stream_transcode_data_t *output_stream_transcode_data = transcode_data->input_streams_transcode_data[i].output_streams_transcode_data + j; /* Free packets queue */ ref_queue_t *queue = &(output_stream_transcode_data->packets); AVPacket *packet; while (NULL != (packet = ref_queue_dequeue(queue))) { av_free(packet->data); free(packet); } /* Free video scale data */ if (NULL != output_stream_transcode_data->sws_context) { sws_freeContext(output_stream_transcode_data->sws_context); avpicture_free((AVPicture*)&output_stream_transcode_data->temp_picture); } if (NULL != output_stream_transcode_data->resample_context) { audio_resample_close(output_stream_transcode_data->resample_context); } /* Free audio stream transcode data */ if (NULL != output_stream_transcode_data->frame_buf) { free(output_stream_transcode_data->frame_buf); } } free(transcode_data->input_streams_transcode_data[i].output_streams_transcode_data); } } free(transcode_data->input_streams_transcode_data); /* Close input format context */ free_format_context(transcode_data->in_context, 1, 0); free(transcode_data); } int copy_packet_to_queue(ref_queue_t *queue, AVPacket *packet) { AVPacket *copy = malloc(sizeof(AVPacket)); if (NULL == copy) { return 0; } av_init_packet(copy); copy->stream_index = packet->stream_index; copy->pts = packet->pts; copy->dts = packet->dts; copy->flags = packet->flags; copy->size = packet->size; copy->data = (uint8_t*)av_malloc(packet->size); if (NULL == copy->data) { free(copy); return 0; } int result = ref_queue_enqueue(queue, copy); if (1 != result) { if (0 == result) { log_message( log_module, MSG_INFO, "Frames queue is full.\n"); } else if (-1 == result) { log_message( log_module, MSG_ERROR, "Failed to add video frame to queue.\n"); } av_free(copy->data); free(copy); return 0; } memcpy(copy->data, packet->data, packet->size); return 1; } int write_frames_from_queue(AVFormatContext *out_context, ref_queue_t *queue, int count) { int counter = 0; AVPacket *packet; while (NULL != (packet= ref_queue_dequeue(queue))) { /*if (out_context->streams[packet->stream_index]->codec->codec_type == CODEC_TYPE_VIDEO) { printf("video\n"); } else { printf("audio\n"); }*/ if (0 > av_interleaved_write_frame(out_context, packet)) { log_message( log_module, MSG_ERROR, "Couldn't write frame.\n"); av_free(packet->data); free(packet); /* Error writing frame */ return -1; } av_free(packet->data); free(packet); counter++; if (count != -1) { count--; if (count == 0) { break; } } } return counter; } int write_succeeded_frame(transcode_data_t *transcode_data, int input_stream_index, int output_stream_index, uint8_t *outbuf, int out_size) { input_stream_transcode_data_t *input_stream_data = transcode_data->input_streams_transcode_data + input_stream_index; output_stream_transcode_data_t *output_stream_data = input_stream_data->output_streams_transcode_data + output_stream_index; /* Create output packet */ AVPacket out_packet; AVStream *out_stream = output_stream_data->out_stream; AVFrame *coded_frame = out_stream->codec->coded_frame; av_init_packet(&out_packet); out_packet.stream_index = out_stream->index; if ((coded_frame && coded_frame->key_frame) || CODEC_TYPE_AUDIO == out_stream->codec->codec_type) { out_packet.flags |= PKT_FLAG_KEY; } out_packet.data = outbuf; out_packet.size = out_size; /*if (0 > av_interleaved_write_frame(output_stream_data->out_context, &out_packet)) { log_message( log_module, MSG_ERROR, "Couldn't write frame.\n"); return -1; } return 0;*/ /* Enqueue packet */ copy_packet_to_queue(&output_stream_data->packets, &out_packet); /* Output packets from queues */ /* Get elapsed time since transcoding start */ if (0 == transcode_data->start_time.tv_sec) { gettimeofday(&transcode_data->start_time, NULL); } struct timeval current_time; gettimeofday(¤t_time, NULL); double time_elapsed_sec = (double)(current_time.tv_usec - transcode_data->start_time.tv_usec) / 1000000 + current_time.tv_sec - transcode_data->start_time.tv_sec; while (1) { int is_frames_written = 0; int i, j; for (i = 0; i < transcode_data->input_streams_count; i++) { for (j = 0; j < transcode_data->input_streams_transcode_data[i].output_streams_count; j++) { output_stream_transcode_data_t *stream_data = transcode_data->input_streams_transcode_data[i].output_streams_transcode_data + j; /* Do we need to output packet?*/ int do_packet_output = 0; if (CODEC_TYPE_VIDEO == stream_data->out_stream->codec->codec_type) { do_packet_output = (double)stream_data->written_frames * stream_data->out_stream->codec->time_base.num / stream_data->out_stream->codec->time_base.den <= time_elapsed_sec; /*if (do_packet_output) { printf("------------- Video\n"); }*/ } else if (CODEC_TYPE_AUDIO == stream_data->out_stream->codec->codec_type) { do_packet_output = (double)stream_data->written_frames * stream_data->out_stream->codec->frame_size / stream_data->out_stream->codec->sample_rate <= time_elapsed_sec; /*if (do_packet_output) { printf("-------------- Audio\n"); }*/ } if (!do_packet_output) { continue; } /* Output packet */ int written_frames = write_frames_from_queue( stream_data->out_context, &stream_data->packets, 2); if (0 == written_frames) { continue; } else if (0 > written_frames) { log_message( log_module, MSG_ERROR, "Error writing frame\n"); return -1; /* Error writing frame */ } is_frames_written = 1; stream_data->written_frames += written_frames; } } if (!is_frames_written) { break; } } return 0; } void transcode(void *transcode_avlib_handle, transcode_thread_data_t *transcode_thread_data) { transcode_data_t *transcode_data = transcode_avlib_handle; AVFormatContext *in_context = transcode_data->in_context; input_stream_transcode_data_t *input_streams_transcode_data = transcode_data->input_streams_transcode_data; /* Initializing data for transcoding */ AVPacket packet; AVFrame *frame = avcodec_alloc_frame(); if (NULL == frame) { log_message( log_module, MSG_ERROR, "Couldn't allocate frame.\n"); return; } uint8_t *outbuf = (uint8_t*)av_malloc(TRANSCODE_BUF_SIZE); if (NULL == outbuf) { log_message( log_module, MSG_ERROR, "Couldn't allocate buffer.\n"); av_free(frame); return; } int16_t *inbuf = (int16_t*)av_malloc(TRANSCODE_BUF_SIZE); if (NULL == inbuf) { log_message( log_module, MSG_ERROR, "Couldn't allocate buffer.\n"); av_free(frame); av_free(outbuf); return; } int16_t *inbuf2 = (int16_t*)av_malloc(TRANSCODE_BUF_SIZE); if (NULL == inbuf2) { log_message( log_module, MSG_ERROR, "Couldn't allocate buffer.\n"); av_free(frame); av_free(inbuf); av_free(outbuf); return; } int bytes_decoded; int is_frame_finished; int out_size; int64_t input_frame_no; int terminate_loop_flag = 0; /* Reading -> decoding -> encoding -> writing all frames */ while (!transcode_thread_data->terminate_thread_flag && !terminate_loop_flag) { if (0 > av_read_frame(in_context, &packet)) { log_message( log_module, MSG_ERROR, "Ending transcoding - av_read_frame returned error.\n"); break; } input_stream_transcode_data_t *cur_input_stream_transcode_data = input_streams_transcode_data + packet.stream_index; AVStream *in_stream = in_context->streams[packet.stream_index]; // cur_input_stream_transcode_data->x++; /* Get PTS and rescale it to duration_factor */ input_frame_no = ((int64_t)AV_NOPTS_VALUE != packet.dts ? packet.dts : ((int64_t)AV_NOPTS_VALUE != packet.pts ? packet.pts : (int64_t)AV_NOPTS_VALUE)); if ((int64_t)AV_NOPTS_VALUE != input_frame_no) { /* Input frame number in format 1, 2, 3, ... */ input_frame_no = (int64_t)((double)(input_frame_no - cur_input_stream_transcode_data->stream_start_pts) / cur_input_stream_transcode_data->pts_duration_factor + 0.5); } if (0 == cur_input_stream_transcode_data->output_streams_count || NULL == cur_input_stream_transcode_data->output_streams_transcode_data) { goto FREE_PACKET_AND_CONTINUE; } if (CODEC_TYPE_VIDEO == in_stream->codec->codec_type) { /* Decode video */ bytes_decoded = avcodec_decode_video(in_stream->codec, frame, &is_frame_finished, packet.data, packet.size); if (0 >= bytes_decoded) { /* Video was not decoded */ log_message( log_module, MSG_ERROR, "Video was not decoded.\n"); } else if (!is_frame_finished) { /* Video was not decoded */ /* log_message( log_module, MSG_ERROR, "Frame not finished.\n"); */ } else { /* Video was decoded. Encode video for each output stream */ int i; for (i = 0; i < cur_input_stream_transcode_data->output_streams_count; i++) { output_stream_transcode_data_t *cur_output_stream_transcode_data = cur_input_stream_transcode_data->output_streams_transcode_data + i; /* Skip frames with wrong PTS or late PTS */ if ((int64_t)AV_NOPTS_VALUE == input_frame_no || input_frame_no < 0 || input_frame_no < cur_output_stream_transcode_data->frame_no * cur_output_stream_transcode_data->frame_rate_factor) { if (input_frame_no < 0) { log_message( log_module, MSG_INFO, "Reset transcoding: input frame number < 0.\n"); terminate_loop_flag = 1; } goto FREE_PACKET_AND_CONTINUE; } AVFrame encode_frame; if (cur_output_stream_transcode_data->sws_context) { /* Rescale video */ sws_scale(cur_output_stream_transcode_data->sws_context, frame->data, frame->linesize, 0, in_stream->codec->height, cur_output_stream_transcode_data->temp_picture.data, cur_output_stream_transcode_data->temp_picture.linesize); encode_frame = cur_output_stream_transcode_data->temp_picture; } else { encode_frame = *frame; } encode_frame.interlaced_frame = frame->interlaced_frame; encode_frame.pict_type = 0; encode_frame.quality = cur_output_stream_transcode_data->out_stream->quality; encode_frame.pts = AV_NOPTS_VALUE; //printf("Entering loop\n"); do { /* Encode frame and write it to output */ out_size = avcodec_encode_video(cur_output_stream_transcode_data->out_stream->codec, outbuf, TRANSCODE_BUF_SIZE, &encode_frame); if (0 > out_size) { /* Error encoding video frame */ log_message( log_module, MSG_ERROR, "Error encoding video frame.\n"); break; } else { /* Video was encoded - saving it */ cur_output_stream_transcode_data->frame_no++; if (0 != out_size) { //printf("Frame out\n"); if (0 > write_succeeded_frame(transcode_data, packet.stream_index, i, outbuf, out_size)) { terminate_loop_flag = 1; goto FREE_PACKET_AND_CONTINUE; } } else { //printf("Frame is buffered\n"); } /* else frame is buffered (happens when b-frames present in output stream) */ } } while (input_frame_no >= (cur_output_stream_transcode_data->frame_no) * cur_output_stream_transcode_data->frame_rate_factor); /* Duplicating */ } } } else if (CODEC_TYPE_AUDIO == in_stream->codec->codec_type) { /* Decode audio */ int result_bytes = TRANSCODE_BUF_SIZE; /* Decoding audio to input buffer */ bytes_decoded = avcodec_decode_audio2(in_stream->codec, inbuf, &result_bytes, packet.data, packet.size); if (0 > bytes_decoded) { log_message( log_module, MSG_ERROR, "Error decoding audio frame.\n"); } else if (0 == bytes_decoded || 0 == result_bytes) { log_message( log_module, MSG_ERROR, "Frame could not be decoded.\n"); } else { if (bytes_decoded != packet.size) { log_message( log_module, MSG_ERROR, "bytes_decoded != packet.size.\n"); } /* Audio was decoded. Encode audio */ int i; for (i = 0; i < cur_input_stream_transcode_data->output_streams_count; i++) { output_stream_transcode_data_t *cur_output_stream_transcode_data = cur_input_stream_transcode_data->output_streams_transcode_data + i; /* Skip frames with wrong pts */ if ((int64_t)AV_NOPTS_VALUE == input_frame_no || input_frame_no < 0 || input_frame_no < cur_output_stream_transcode_data->frame_no * cur_output_stream_transcode_data->frame_rate_factor) { if (input_frame_no < 0) { log_message( log_module, MSG_INFO, "Reset transcoding: input frame number < 0.\n"); terminate_loop_flag = 1; } goto FREE_PACKET_AND_CONTINUE; } int16_t *cur_buf; if (NULL != cur_output_stream_transcode_data->resample_context) { int out_samples = audio_resample(cur_output_stream_transcode_data->resample_context, inbuf2, inbuf, result_bytes / cur_input_stream_transcode_data->sample_size); cur_buf = inbuf2; result_bytes = out_samples * cur_output_stream_transcode_data->sample_size; } else { cur_buf = inbuf; } int data_was_encoded; do { data_was_encoded = 0; char* buf_pos = (char*)cur_buf; while (buf_pos < (char*)cur_buf + result_bytes) { /* Copy cur_buf data to frame_buf */ int data_size_to_copy = cur_output_stream_transcode_data->frame_size - cur_output_stream_transcode_data->frame_buf_data_length; data_size_to_copy = data_size_to_copy < result_bytes - (buf_pos - (char*)cur_buf) ? data_size_to_copy : result_bytes - (buf_pos - (char*)cur_buf); memcpy( (char*)cur_output_stream_transcode_data->frame_buf + cur_output_stream_transcode_data->frame_buf_data_length, buf_pos, data_size_to_copy); buf_pos += data_size_to_copy; cur_output_stream_transcode_data->frame_buf_data_length += data_size_to_copy; if (cur_output_stream_transcode_data->frame_buf_data_length != cur_output_stream_transcode_data->frame_size) { break; /* Not enough data for encoding */ } out_size = avcodec_encode_audio( cur_output_stream_transcode_data->out_stream->codec, outbuf, TRANSCODE_BUF_SIZE, cur_output_stream_transcode_data->frame_buf); cur_output_stream_transcode_data->frame_buf_data_length = 0; if (0 > out_size) { log_message( log_module, MSG_ERROR, "Error encoding audio.\n"); continue; } if (0 == out_size) { //log_message( log_module, MSG_ERROR, "Error not enough data for encoding audio frame.\n"); continue; } else { data_was_encoded = 1; /* Audio was encoded - saving it */ cur_output_stream_transcode_data->frame_no++; if (0 > write_succeeded_frame(transcode_data, packet.stream_index, i, outbuf, out_size)) { terminate_loop_flag = 1; goto FREE_PACKET_AND_CONTINUE; } } } } while (data_was_encoded && input_frame_no >= (cur_output_stream_transcode_data->frame_no + 1) * cur_output_stream_transcode_data->frame_rate_factor); } } } else if (CODEC_TYPE_SUBTITLE == in_stream->codec->codec_type) { } FREE_PACKET_AND_CONTINUE: av_free_packet(&packet); } /* Free allocated data */ av_free(outbuf); av_free(inbuf); av_free(inbuf2); av_free(frame); return; } /** @brief Show the available codecs * This code is from the ffmpeg source code, snapshotted 16 june 2010 * slightly modified by Brice Dubost * * Copyright (c) 2000-2003 Fabrice Bellard */ void show_codecs(void) { AVCodec *p=NULL, *p2; const char *last_name; log_message (log_module, MSG_DETAIL, "Codecs available:\n" " D.. = Decoding supported\n" " .E. = Encoding supported\n" " ..V = Video codec\n" " ..A = Audio codec\n" " ..S = Subtitle codec\n"); last_name= "000"; for(;;){ int decode=0; int encode=0; const char *type_str; p2=NULL; while((p= av_codec_next(p))) { if((p2==NULL || strcmp(p->name, p2->name)<0) && strcmp(p->name, last_name)>0){ p2= p; decode= encode= 0; } if(p2 && strcmp(p->name, p2->name)==0){ if(p->decode) decode=1; if(p->encode) encode=1; } } if(p2==NULL) break; last_name= p2->name; switch(p2->type) { case CODEC_TYPE_VIDEO: type_str = "V"; break; case CODEC_TYPE_AUDIO: type_str = "A"; break; case CODEC_TYPE_SUBTITLE: type_str = "S"; break; default: type_str = "?"; break; } log_message (log_module, MSG_DETAIL, " %s%s%s %-15s %s\n", decode ? "D":" ", encode ? "E":" ", type_str, p2->name, //see http://git.ffmpeg.org/?p=ffmpeg;a=commitdiff;h=639cd7fb3af2e40b67e054c2218e6366d17fc0c2 #if LIBAVCODEC_VERSION_INT < ((51<<16)+(55<<8)+0) ""); #else p2->long_name ? p2->long_name : ""); #endif } } mumudvb-1.7.1/src/transcode_avlib.h000066400000000000000000000026061177353207000173070ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Code for transcoding * * Code written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef _TRANSCODE_AVLIB_H #define _TRANSCODE_AVLIB_H #include "transcode_common.h" void* initialize_transcode(transcode_thread_data_t *transcode_thread_data); void free_transcode(void *transcode_avlib_handle, transcode_thread_data_t *transcode_thread_data); void transcode(void *transcode_avlib_handle, transcode_thread_data_t *transcode_thread_data); void transcode_simple(transcode_thread_data_t *transcode_thread_data); #endif mumudvb-1.7.1/src/transcode_common.c000066400000000000000000000053521177353207000174760ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Code for transcoding * * Code written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "transcode_common.h" #include #define FREE_TRANSOCDE_OPTION(option_name)\ if (transcode_options->option_name) {\ free(transcode_options->option_name);\ } void free_transcode_options(transcode_options_t *transcode_options) { FREE_TRANSOCDE_OPTION(enable) FREE_TRANSOCDE_OPTION(video_bitrate) FREE_TRANSOCDE_OPTION(audio_bitrate) FREE_TRANSOCDE_OPTION(gop) FREE_TRANSOCDE_OPTION(b_frames) FREE_TRANSOCDE_OPTION(mbd) FREE_TRANSOCDE_OPTION(cmp) FREE_TRANSOCDE_OPTION(subcmp) FREE_TRANSOCDE_OPTION(video_codec) FREE_TRANSOCDE_OPTION(audio_codec) FREE_TRANSOCDE_OPTION(crf) FREE_TRANSOCDE_OPTION(refs) FREE_TRANSOCDE_OPTION(b_strategy) FREE_TRANSOCDE_OPTION(coder_type) FREE_TRANSOCDE_OPTION(me_method) FREE_TRANSOCDE_OPTION(me_range) FREE_TRANSOCDE_OPTION(subq) FREE_TRANSOCDE_OPTION(trellis) FREE_TRANSOCDE_OPTION(sc_threshold) FREE_TRANSOCDE_OPTION(rc_eq) FREE_TRANSOCDE_OPTION(qcomp) FREE_TRANSOCDE_OPTION(qmin) FREE_TRANSOCDE_OPTION(qmax) FREE_TRANSOCDE_OPTION(qdiff) FREE_TRANSOCDE_OPTION(loop_filter) FREE_TRANSOCDE_OPTION(mixed_refs) FREE_TRANSOCDE_OPTION(enable_8x8dct) FREE_TRANSOCDE_OPTION(x264_partitions); FREE_TRANSOCDE_OPTION(level) FREE_TRANSOCDE_OPTION(streaming_type) FREE_TRANSOCDE_OPTION(sdp_filename) FREE_TRANSOCDE_OPTION(aac_profile) FREE_TRANSOCDE_OPTION(aac_latm) FREE_TRANSOCDE_OPTION(video_scale) FREE_TRANSOCDE_OPTION(ffm_url) FREE_TRANSOCDE_OPTION(audio_channels) FREE_TRANSOCDE_OPTION(audio_sample_rate) FREE_TRANSOCDE_OPTION(video_frames_per_second) FREE_TRANSOCDE_OPTION(s_rtp_port) FREE_TRANSOCDE_OPTION(rtp_port) FREE_TRANSOCDE_OPTION(keyint_min) FREE_TRANSOCDE_OPTION(send_transcoded_only) } mumudvb-1.7.1/src/transcode_common.h000066400000000000000000000057251177353207000175070ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Code for transcoding * * Code written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef _TRANSCODE_COMMON_H #define _TRANSCODE_COMMON_H #define TRANSCODE_CODEC_MAX 32 #define TRANSCODE_RC_EQ_MAX 64 #define TRANSCODE_PROFILE_MAX 32 #define TRANSCODE_STREAMING_TYPE_MAX 32 #define TRANSCODE_SDP_FILENAME_MAX 1024 #define TRANSCODE_AAC_PROFILE_MAX 32 #define TRANSCODE_FFM_URL_MAX 1024 #define TRANSCODE_RTP_PORT_MAX 1024 #define STREAMING_TYPE_MPEGTS 1 #define STREAMING_TYPE_RTP 2 #define STREAMING_TYPE_FFM 3 #include "transcode_queues.h" #include typedef struct transcode_options_t { int *enable; int *video_bitrate; int *audio_bitrate; int *gop; int *b_frames; int *mbd; int *cmp; int *subcmp; char *video_codec; char *audio_codec; float *crf; int *refs; int *b_strategy; int *coder_type; int *me_method; int *me_range; int *subq; int *trellis; int *sc_threshold; char *rc_eq; float *qcomp; int *qmin; int *qmax; int *qdiff; int *loop_filter; int *mixed_refs; int *enable_8x8dct; int *x264_partitions; int *level; int *streaming_type; char *sdp_filename; int *aac_profile; int *aac_latm; float *video_scale; char *ffm_url; int *audio_channels; int *audio_sample_rate; int *video_frames_per_second; char *s_rtp_port; int *rtp_port; //used after templating int *keyint_min; int *send_transcoded_only; char ip[20]; //for rtp streaming } transcode_options_t; typedef struct transcode_thread_data_t { /* Threading data */ pthread_t thread; pthread_mutex_t queue_mutex; int terminate_thread_flag; /* Other data */ int is_initialized; /* Comunications data */ int socket; struct sockaddr_in *socket_addr; /* Transcode data queue */ struct data_queue_t data_queue; /* Is the queue full */ int data_queue_full; /* Transcode parameters */ struct transcode_options_t *options; } transcode_thread_data_t; void free_transcode_options(transcode_options_t *transcode_options); #endifmumudvb-1.7.1/src/transcode_queues.c000066400000000000000000000145361177353207000175210ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Code for transcoding * * Code written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "transcode_queues.h" #include "mumudvb.h" #include "log.h" #include #include static char *log_module="Transcode : "; void data_queue_init(data_queue_t *queue, int max_data_size) { queue->first = NULL; queue->last = NULL; queue->data_size = 0; queue->max_data_size = max_data_size; } int data_queue_enqueue(data_queue_t *queue, void *data, int data_size) { if (queue->max_data_size < data_size) { log_message( log_module, MSG_ERROR, "Failed to enqueue data - too big data.\n"); return -1; /* Failed to enqueue */ } int result = 1; /* Free data in queue if needed */ while (queue->data_size + data_size > queue->max_data_size) { /* Remove first item from queue */ data_queue_item_t *item = queue->first; queue->first = item->next; queue->data_size -= item->data_size; free(item->data); free(item); result = 0; /* Queue was full */ } if (NULL == queue->first) { queue->last = NULL; } /* Queue is not full - create data queue item */ data_queue_item_t *item = malloc(sizeof(data_queue_item_t)); if (NULL == item) { log_message( log_module, MSG_ERROR, "Failed to enqueue data.\n"); return -1; /* Failed to enqueue */ } item->next = NULL; item->data_size = data_size; item->data = malloc(data_size); if (NULL == item->data) { log_message( log_module, MSG_ERROR, "Failed to enqueue data.\n"); free(item); return -1; /* Failed to enqueue */ } /* Copy data to the data queue item */ memcpy(item->data, data, data_size); /* Add item to queue */ if (NULL == queue->first) { /* Queue is empty */ queue->first = item; queue->last = item; queue->data_size = data_size; } else { /* Queue is not empty - appending */ queue->last->next = item; queue->last = item; queue->data_size += data_size; } return result; /* Data enqueued */ } int data_queue_dequeue(data_queue_t *queue, void *buf, int buf_size) { int buf_pos = 0; while (NULL != queue->first) { data_queue_item_t *item = queue->first; if (buf_pos + item->data_size > buf_size) { break; /* Output buffer is full */ } /* Copy data from queue item into buffer */ memcpy(buf + buf_pos, item->data, item->data_size); buf_pos += item->data_size; /* Remove from queue and free data item */ queue->first = item->next; queue->data_size -= item->data_size; free(item->data); free(item); } if (NULL == queue->first) { /* Queue is empty now */ queue->last = NULL; } else if (0 == buf_pos) { /* We have item in queue, but it is too big to fit output buffer */ data_queue_item_t *item = queue->first; /* Copy part of the item */ memcpy(buf, item->data, buf_size); buf_pos = buf_size; /* Realloc item */ void *old_buf = item->data; item->data_size -= buf_pos; item->data = malloc(item->data_size); memcpy(item->data, old_buf + buf_pos, item->data_size); free(old_buf); queue->data_size -= buf_size; } return buf_pos; } void data_queue_free(data_queue_t *queue) { while (NULL != queue->first) { data_queue_item_t *next_item = queue->first->next; free(queue->first->data); free(queue->first); queue->first = next_item; } queue->last = NULL; queue->data_size = 0; } void ref_queue_init(ref_queue_t *queue, int max_count) { queue->first = NULL; queue->last = NULL; queue->count = 0; queue->max_count = max_count; } int ref_queue_enqueue(ref_queue_t *queue, void *ref) { if (queue->max_count != 0 && queue->count >= queue->max_count) { return 0; /* Queue is full */ } if (NULL == ref) { log_message( log_module, MSG_ERROR, "Can not enqueue NULL ref.\n"); return -1; /* Do not enqueue NULLs */ } /* Queue is not full - create ref queue item */ ref_queue_item_t *item = malloc(sizeof(ref_queue_item_t)); if (NULL == item) { log_message( log_module, MSG_ERROR, "Can not enqueue.\n"); return -1; /* Failed to enqueue */ } item->next = NULL; item->ref = ref; /* Add item to queue */ if (NULL == queue->first) { /* Queue is empty */ queue->first = item; queue->last = item; queue->count = 1; } else { /* Queue is not empty - appending */ queue->last->next = item; queue->last = item; queue->count++; } return 1; /* Data enqueued */ } void* ref_queue_dequeue(ref_queue_t *queue) { if (NULL == queue->first) { return NULL; } void *ref = queue->first->ref; ref_queue_item_t *next_item = queue->first->next; free(queue->first); queue->first = next_item; if (NULL == next_item) { queue->last = NULL; queue->count = 0; } else { queue->count--; } return ref; } /*void ref_queue_free(ref_queue_t *queue) { while (queue->first) { ref_queue_item_t *next_item = queue->first->next; free(queue->first); queue->first = next_item; } queue->last = NULL; queue->count = 0; }*/ mumudvb-1.7.1/src/transcode_queues.h000066400000000000000000000037271177353207000175260ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * Code for transcoding * * Code written by Utelisys Communications B.V. * Copyright (C) 2009 Utelisys Communications B.V. * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef _TRANSCODE_QUEUES_H #define _TRANSCODE_QUEUES_H typedef struct data_queue_item_t { void *data; int data_size; struct data_queue_item_t *next; } data_queue_item_t; typedef struct data_queue_t { data_queue_item_t *first; data_queue_item_t *last; int data_size; int max_data_size; } data_queue_t; void data_queue_init(data_queue_t *queue, int max_data_size); int data_queue_enqueue(data_queue_t *queue, void *data, int data_size); int data_queue_dequeue(data_queue_t *queue, void *buf, int buf_size); void data_queue_free(data_queue_t *queue); typedef struct ref_queue_item_t { void *ref; struct ref_queue_item_t *next; } ref_queue_item_t; typedef struct ref_queue_t { ref_queue_item_t *first; ref_queue_item_t *last; int count; int max_count; } ref_queue_t; void ref_queue_init(ref_queue_t *queue, int max_count); int ref_queue_enqueue(ref_queue_t *queue, void *ref); void* ref_queue_dequeue(ref_queue_t *queue); //void ref_queue_free(ref_queue_t *queue); #endif mumudvb-1.7.1/src/ts.c000066400000000000000000000541711177353207000145750ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * * (C) 2004-2011 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /**@file * @brief File for demuxing TS stream */ #include #include "ts.h" #include "mumudvb.h" #include "log.h" #include extern uint32_t crc32_table[256]; static char *log_module="TS: "; //Helper functions for get_ts_packet void ts_move_part_to_full(mumudvb_ts_packet_t *ts_packet); int ts_check_crc32(mumudvb_ts_packet_t *ts_packet); int ts_partial_full(mumudvb_ts_packet_t *ts_packet); int get_ts_packet_v2(unsigned char *buf, mumudvb_ts_packet_t *); int get_ts_packet_v3(unsigned char *buf, mumudvb_ts_packet_t *); void ts_move_part_to_full_v3(mumudvb_ts_packet_t *ts_packet); #define NO_START 0 #define START_TS 1 #define START_SECTION 2 void add_ts_packet_data(unsigned char *buf, mumudvb_ts_packet_t *pkt, int data_left, int start_flag, int pid, int cc); /** @brief This function will join the 188 bytes packet until the PMT/PAT/SDT is full * Once it's full we check the CRC32 and say if it's ok or not * There is two important mpeg2-ts fields to do that * * the continuity counter wich is incremented for each packet * * The payload_unit_start_indicator wich says if it's the first packet * * When a packet is cutted in 188 bytes packets, there must be no other pid between two sub packets * * Return 1 when there is one packet full and OK * * @param buf : the received buffer from the card * @param ts_packet : the packet to be completed */ int get_ts_packet(unsigned char *buf, mumudvb_ts_packet_t *pkt) { //see doc/diagrams/TS_packet_getting_all_cases.pdf for documentation pthread_mutex_lock(&pkt->packetmutex); //We check if there is already a full packet, in this case we remove one if(pkt->full_number > 0) { log_message( log_module, MSG_FLOOD, "Full packet left: %d, we remove one\n",pkt->full_number); pkt->full_number--; //We update the size of the buffer pkt->full_buffer_len-=pkt->len_full; //if there is one packet left, we put it in the full data and remove one packet if(pkt->full_number > 0) { log_message( log_module, MSG_FLOOD, "Remove one packet size %d, but another size: %d\n",pkt->len_full, pkt->full_lengths[1]); //We move the data inside the buffer full memmove(pkt->buffer_full,pkt->buffer_full+pkt->len_full,pkt->full_buffer_len); //we update the lengths of the full packets memmove(pkt->full_lengths,pkt->full_lengths+1,(MAX_FULL_PACKETS-1)*sizeof(int)); //we update the length pkt->len_full= pkt->full_lengths[0]; //we update the data memcpy(pkt->data_full,pkt->buffer_full,pkt->len_full); } } ts_header_t *header; //mapping of the buffer onto the TS header header=(ts_header_t *)buf; int buf_pid; buf_pid=HILO(header->pid); //the current packet position int offset; //delta used to remove TS HEADER offset = TS_HEADER_LEN-1; //Is the buffer ok for parsing/adding //int buf_ok=1; log_message(log_module, MSG_FLOOD, "General information PID %d adaptation_field_control %d payload_unit_start_indicator %d continuity_counter %d\n", buf_pid, header->adaptation_field_control, header->payload_unit_start_indicator, header->continuity_counter); //we skip the adaptation field //Sometimes there is some more data in the header, the adaptation field say it if (header->adaptation_field_control & 0x2) { log_message( log_module, MSG_DEBUG, "Read TS : Adaptation field \n"); offset += buf[offset] ; // add adapt.field.len //we check if the adapt.field.len is valid if(offset>=TS_PACKET_SIZE) { log_message( log_module, MSG_DEBUG, "Invalid adapt.field.len \n"); pthread_mutex_unlock(&pkt->packetmutex); return (pkt->full_number > 0); } } else if (header->adaptation_field_control & 0x1) { if (buf[offset]==0x00 && buf[offset+1]==0x00 && buf[offset+2]==0x01) { // -- PES/PS //tspid->id = buf[j+3]; log_message( log_module, MSG_FLOOD, "#PES/PS ----- We ignore \n"); pthread_mutex_unlock(&pkt->packetmutex); return (pkt->full_number > 0); } } if (header->adaptation_field_control == 3) { log_message( log_module, MSG_DEBUG, "adaptation_field_control 3\n"); pthread_mutex_unlock(&pkt->packetmutex); return (pkt->full_number > 0); } //We are now at the beginning of the Transport stream packet, we check if there is a pointer field //the pointer fields tells if there is the end of the previous packet before the beginning of a new one //and how long is this data if(header->payload_unit_start_indicator) //There is AT LEAST one packet beginning here { //Pointer field //This is an 8-bit field whose value shall be the number of bytes, immediately following the pointer_field //until the first byte of the first section that is present in the payload of the Transport Stream packet (so a value of 0x00 in //the pointer_field indicates that the section starts immediately after the pointer_field). When at least one section begins in //a given Transport Stream packet, then the payload_unit_start_indicator (refer to 2.4.3.2) shall be set to 1 and the first //byte of the payload of that Transport Stream packet shall contain the pointer. When no section begins in a given //Transport Stream packet, then the payload_unit_start_indicator shall be set to 0 and no pointer shall be sent in the //payload of that packet. int pointer_field=*(buf+offset); offset++; //we've read the pointer field if(pointer_field!=0) { log_message(log_module, MSG_FLOOD, "Pointer field 0x%02x %02d \n",pointer_field,pointer_field); if((TS_PACKET_SIZE-offset-pointer_field)<0) { log_message(log_module, MSG_DETAIL, "Pointer field too big 0x%02x, packet dropped\n",pointer_field); pkt->status_partial=EMPTY; pthread_mutex_unlock(&pkt->packetmutex); return (pkt->full_number > 0); } //We append the data of the ending packet add_ts_packet_data(buf+offset, pkt, pointer_field, NO_START, buf_pid, header->continuity_counter); } //we skip the pointer field_data offset+=pointer_field; //We add the data of the new packet add_ts_packet_data(buf+offset, pkt,TS_PACKET_SIZE-offset , START_TS, buf_pid, header->continuity_counter); } else //It's a continuing packet { //We append the data of the ending packet add_ts_packet_data(buf+offset, pkt,TS_PACKET_SIZE-offset , NO_START, buf_pid ,header->continuity_counter); } pthread_mutex_unlock(&pkt->packetmutex); return (pkt->full_number > 0); } /** @brief This function will add data to the current partial section * see doc/diagrams/TS_add_data_all_cases.pdf for documentation */ void add_ts_packet_data(unsigned char *buf, mumudvb_ts_packet_t *pkt, int data_left, int start_flag, int pid, int cc) { int copy_len; //We see if there is the start of a new section if(start_flag == START_TS || start_flag == START_SECTION) { //if the start was detected by the end of a section we check for stuffing bytes if(start_flag== START_SECTION) { /* Within a Transport Stream, packet stuffing bytes of value 0xFF may be found in the payload of Transport Stream packets carrying PSI and/or private_sections only after the last byte of a section. In this case all bytes until the end of the Transport Stream packet shall also be stuffing bytes of value 0xFF. These bytes may be discarded by a decoder. In such a case, the payload of the next Transport Stream packet with the same PID value shall begin with a pointer_field of value 0x00 indicating that the next section starts immediately thereafter. */ if(buf[0]==0xff) { log_message(log_module, MSG_FLOOD, "Stuffing bytes found data left %d\n",data_left); return; } } //We check if a packet has been started before, just for information if(pkt->status_partial!=EMPTY) log_message(log_module, MSG_FLOOD, "Unfinished packet and beginning of a new one, we drop the started one len: %d\n", pkt->len_partial); //We copy the data to the partial packet pkt->status_partial=STARTED; pkt->cc=cc; pkt->pid=pid; tbl_h_t *tbl_struct=(tbl_h_t *)buf; pkt->expected_len_partial=HILO(tbl_struct->section_length)+BYTES_BFR_SEC_LEN; //we copy the amount of data needed if(pkt->expected_len_partialexpected_len_partial; else copy_len=data_left; pkt->len_partial=copy_len; //The real copy memcpy(pkt->data_partial,buf,pkt->len_partial); //we update the amount of data left data_left-=copy_len; //lot of debugging information log_message(log_module, MSG_FLOOD, "Starting a packet PID %d cc %d len %d expected len %d\n", pkt->pid, pkt->cc, pkt->len_partial, pkt->expected_len_partial); log_message(log_module, MSG_FLOOD, "First bytes\t 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", pkt->data_partial[0], pkt->data_partial[1], pkt->data_partial[2], pkt->data_partial[3], pkt->data_partial[4], pkt->data_partial[5], pkt->data_partial[6], pkt->data_partial[7]); log_message(log_module, MSG_FLOOD, "Struct data\t table_id 0x%02x section_syntax_indicator 0x%02x section_length 0x%02x transport_stream_id 0x%02x version_number 0x%02x current_next_indicator 0x%02x last_section_number 0x%02x\n", tbl_struct->table_id, tbl_struct->section_syntax_indicator, HILO(tbl_struct->section_length), HILO(tbl_struct->transport_stream_id), tbl_struct->version_number, tbl_struct->current_next_indicator, tbl_struct->last_section_number); } else { log_message(log_module, MSG_FLOOD, "Continuing packet, data left %d\n",data_left); if(pkt->status_partial!=STARTED) { log_message(log_module, MSG_FLOOD, "Continuing packet and saved packet not started or full, can be a continuity error\n"); pkt->status_partial=EMPTY; return; } else if(pkt->cc==cc) { log_message(log_module, MSG_FLOOD, "Duplicate packet, continuity counter: %d\n", pkt->cc); return; } else if(((pkt->cc+1)%16)!=cc) { log_message(log_module, MSG_FLOOD, "The continuity counter is not valid saved packet cc %d actual cc %d\n", pkt->cc, cc); pkt->status_partial=EMPTY; return; } else if(pkt->pid!=pid) { log_message(log_module, MSG_FLOOD, "PID change. saved PID %d, actual pid %d\n", pkt->pid, pid); pkt->status_partial=EMPTY; return; } else { //packet started and continuing packet, we append the data //we copy the minimumamount of data if((pkt->len_partial+data_left)> pkt->expected_len_partial) copy_len=pkt->expected_len_partial - pkt->len_partial; else copy_len=data_left; //if too big we skip if(pkt->len_partial+copy_len > MAX_TS_SIZE) { log_message(log_module, MSG_FLOOD, "The packet seems too big pkt->len_partial %d copy_len %d pkt->len_partial+copy_len %d\n", pkt->len_partial, copy_len, pkt->len_partial+copy_len); copy_len=MAX_TS_SIZE-pkt->len_partial; } //We don't have any starting packet we make sure we don't believe there is data_left=0; memcpy(pkt->data_partial+pkt->len_partial,buf,copy_len);//we add the packet to the buffer pkt->len_partial+=copy_len; pkt->cc=cc; //update cc log_message(log_module, MSG_FLOOD, "Continuing a packet PID %d cc %d len %d expected %d\n",pkt->pid,pkt->cc,pkt->len_partial,pkt->expected_len_partial); } } //We check if the packet is full if(ts_partial_full(pkt)) { //The partial packet is full, we check the CRC32 if(ts_check_crc32(pkt)) ts_move_part_to_full(pkt); //Everything is perfect, the packet full is ok } //If there is still data, a new section could begin, we call recursively if(data_left) { log_message(log_module, MSG_FLOOD, "Calling recursively, data left %d\n",data_left); add_ts_packet_data(buf+copy_len, pkt, data_left,START_SECTION, pid,cc); } } /** @brief move the partial packet to the full packet */ void ts_move_part_to_full(mumudvb_ts_packet_t *pkt) { //append the data memcpy(pkt->buffer_full+pkt->full_buffer_len,pkt->data_partial,pkt->len_partial); pkt->full_buffer_len+=pkt->len_partial; pkt->full_lengths[pkt->full_number]=pkt->len_partial; pkt->full_number++; log_message(log_module, MSG_FLOOD, "New full packet len %d. There's now %d full packet%c\n",pkt->len_partial,pkt->full_number,pkt->full_number>1?'s':' '); //if it's the first we copy it to the full if(pkt->full_number==1) { pkt->len_full=pkt->full_lengths[0]; log_message(log_module, MSG_FLOOD, "First full packet. len %d\n",pkt->len_full); memcpy(pkt->data_full,pkt->buffer_full,pkt->len_full); } pkt->len_partial=0; pkt->status_partial=EMPTY; } /**@brief Checking of the CRC32 of a raw buffer * return 1 if crc32 is ok, 0 otherwise * @param packet : the packet to be checked */ int ts_check_raw_crc32(unsigned char *data) { /**@todo : use this function where CRC32 calculation is needed elsewhere */ int i,len; uint32_t crc32; tbl_h_t *tbl_struct; tbl_struct=(tbl_h_t *)data; //the real length (it cannot overflow due to the way tbl_h_t is made) len=HILO(tbl_struct->section_length)+BYTES_BFR_SEC_LEN; //CRC32 calculation //Test of the crc32 crc32=0xffffffff; //we compute the CRC32 //we have two ways: either we compute untill the end and it should be 0 //either we exclude the 4 last bits and in should be equal to the 4 last bits for(i = 0; i < len; i++) { crc32 = (crc32 << 8) ^ crc32_table[((crc32 >> 24) ^ data[i])&0xff]; } return (crc32 == 0); } /**@brief Checking of the CRC32 * return 1 if crc32 is ok, 0 otherwise * @param packet : the packet to be checked */ int ts_check_crc32( mumudvb_ts_packet_t *packet) { if(ts_check_raw_crc32(packet->data_partial)==0) { log_message( log_module, MSG_DETAIL,"\tpacket BAD CRC32 PID : %d\n", packet->pid); //Bad CRC32 packet->status_partial=EMPTY; packet->len_partial=0; return 0; } packet->status_partial=VALID; return 1; } /**@brief Tell if the partial packet is full * return 1 if full, 0 otherwise * @param packet : the packet to be checked */ int ts_partial_full( mumudvb_ts_packet_t *packet) { //the real length if(packet->len_partial>=packet->expected_len_partial) { //we set the good length packet->len_partial=packet->expected_len_partial; return 1; } return 0; } /** @brief This function will return a pointer to the beginning of the first payload of a TS packet and NULL if no payload or error * It returns NULL in case of error * * @param buf : the received buffer from the card */ unsigned char *get_ts_begin(unsigned char *buf) { ts_header_t *header; int delta; //mapping of the buffer onto the TS header header=(ts_header_t *)buf; //delta used to remove TS HEADER delta = TS_HEADER_LEN-1; //Sometimes there is some more data in the header, the adaptation field say it if (header->adaptation_field_control & 0x2) { log_message( log_module, MSG_DEBUG, "Read TS : Adaptation field, len %d \n",buf[delta]); if((TS_PACKET_SIZE-delta-buf[delta])<0) { log_message(log_module, MSG_DETAIL, "Adaptation field too big 0x%02x, packet dropped\n",buf[delta]); return NULL; } delta += buf[delta]; // add adapt.field.len } if (header->adaptation_field_control & 0x1) //There is a payload { if (buf[delta]==0x00 && buf[delta+1]==0x00 && buf[delta+2]==0x01) { // -- PES/PS //tspid->id = buf[j+3]; log_message( log_module, MSG_FLOOD, "#PES/PS ----- We ignore \n"); return NULL; } } if (header->adaptation_field_control == 3) log_message( log_module, MSG_DEBUG, "adaptation_field_control 3\n"); if ((header->adaptation_field_control == 2)||(header->adaptation_field_control == 0)) { log_message( log_module, MSG_DEBUG, "adaptation_field_control %d ie no payload\n", header->adaptation_field_control); return NULL; } if(header->payload_unit_start_indicator) //It's the beginning of a new packet { int pointer_field=*(buf+delta); delta++; if(pointer_field!=0) log_message(log_module, MSG_FLOOD, "Pointer field 0x%02x\n",pointer_field); if((TS_PACKET_SIZE-delta-pointer_field)<0) { log_message(log_module, MSG_DETAIL, "Pointer field too big 0x%02x, packet dropped\n",pointer_field); return NULL; } return buf+delta+pointer_field; //we give the address of the beginning of the payload /* * This is an 8-bit field whose value shall be the number of bytes, immediately following the pointer_field * until the first byte of the first section that is present in the payload of the Transport Stream packet (so a value of 0x00 in * the pointer_field indicates that the section starts immediately after the pointer_field). When at least one section begins in * a given Transport Stream packet, then the payload_unit_start_indicator (refer to 2.4.3.2) shall be set to 1 and the first * byte of the payload of that Transport Stream packet shall contain the pointer. When no section begins in a given * Transport Stream packet, then the payload_unit_start_indicator shall be set to 0 and no pointer shall be sent in the * payload of that packet. */ } return NULL; } /** @brief compare the SERVICE_ID contained in the channel and in the PMT * * Return 1 if match or no service_id info, 0 otherwise * * @param pmt the pmt packet * @param channel the channel to be checked */ int check_pmt_service_id(mumudvb_ts_packet_t *pmt, mumudvb_channel_t *channel) { pmt_t *header; header=(pmt_t *)pmt->data_full; if(header->table_id!=0x02) { log_message( log_module, MSG_INFO,"Packet PID %d for channel \"%s\" is not a PMT PID.\n", pmt->pid, channel->name); return 0; } /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(header->current_next_indicator == 0) { log_message( log_module, MSG_DEBUG,"The current_next_indicator is set to 0, this PMT is not valid for the current stream\n"); return 0; } //We check if this PMT belongs to the current channel. (Only works with autoconfiguration full for the moment because it stores the service_id) if(channel->service_id && (channel->service_id != HILO(header->program_number)) ) { log_message( log_module, MSG_DETAIL,"The PMT %d not belongs to channel \"%s\"\n", pmt->pid, channel->name); log_message( log_module, MSG_DETAIL,"Debug channel->service_id %d pmt service_id %d\n", channel->service_id, HILO(header->program_number)); return 0; } else if(channel->service_id) log_message( log_module, MSG_DETAIL,"GOOD service_id for PMT %d and channel \"%s\"\n", pmt->pid, channel->name); if(!channel->service_id) log_message( log_module, MSG_DEBUG,"no service_id information for channel \"%s\"\n", channel->name); return 1; } /** @brief Display the PAT contents * * @param buf The buffer containing the PAT */ void ts_display_pat(char* log_module,unsigned char *buf) { pat_t *pat=(pat_t*)(buf); pat_prog_t *prog; int delta=PAT_LEN; int section_length=0; int number_of_services=0; log_message( log_module, MSG_FLOOD,"-------------- Display PAT ----------------\n"); section_length=HILO(pat->section_length); log_message( log_module, MSG_FLOOD, "transport stream id 0x%04x section_length %d version %i last_section_number %x current_next_indicator %d\n", HILO(pat->transport_stream_id), HILO(pat->section_length), pat->version_number, pat->last_section_number, pat->current_next_indicator); /*current_next_indicator – A 1-bit indicator, which when set to '1' indicates that the Program Association Table sent is currently applicable. When the bit is set to '0', it indicates that the table sent is not yet applicable and shall be the next table to become valid.*/ if(pat->current_next_indicator == 0) log_message( log_module, MSG_FLOOD,"The current_next_indicator is set to 0, this PAT is not valid for the current stream\n"); //We loop over the different programs included in the pat while((delta+PAT_PROG_LEN)<(section_length)) { prog=(pat_prog_t*)((char*)buf+delta); if(HILO(prog->program_number)==0) { log_message( log_module, MSG_DEBUG,"Network PID %d (PID of the NIT)\n", HILO(prog->network_pid)); } else { number_of_services++; log_message( log_module, MSG_DEBUG,"service %d id 0x%04x %d\t PMT PID : %d", number_of_services, HILO(prog->program_number), HILO(prog->program_number), HILO(prog->network_pid)); } delta+=PAT_PROG_LEN; } log_message( log_module, MSG_DEBUG,"This PAT contains %d services\n",number_of_services); log_message( log_module, MSG_FLOOD,"-------------- PAT Displayed ----------------\n"); } mumudvb-1.7.1/src/ts.h000066400000000000000000000663251177353207000146060ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * * (C) 2004-2011 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /**@file * @brief File for demuxing TS stream */ #ifndef _TS_H #define _TS_H #include #include #include "config.h" //The maximum size for a TS packet #define MAX_TS_SIZE 4096 //0x1ffb=8187 It's the pid for the information tables in ATSC #define PSIP_PID 8187 //Part of this code comes from libsi // (C) 2001-03 Rolf Hakenes , under the // GNU GPL with contribution of Oleg Assovski, // www.satmania.com #define TS_HEADER_LEN 5 #define HILO(x) (x##_hi << 8 | x##_lo) #define BCDHI(x) (((x)>> 4) & 0x0f) #define BCDLO(x) ((x) & 0x0f) /* * * ETSI ISO/IEC 13818-1 specifies SI which is referred to as PSI. The PSI * data provides information to enable automatic configuration of the * receiver to demultiplex and decode the various streams of programs * within the multiplex. The PSI data is structured as four types of table. * The tables are transmitted in sections. */ /** * @brief Program Association Table (PAT): * * - for each service in the multiplex, the PAT indicates the location * (the Packet Identifier (PID) values of the Transport Stream (TS) * packets) of the corresponding Program Map Table (PMT). * It also gives the location of the Network Information Table (NIT). * */ #define PAT_LEN 8 /** @brief Program Association Table (PAT):*/ typedef struct { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char dummy :1; // has to be 0 u_char :2; u_char section_length_hi :4; #else u_char section_length_hi :4; u_char :2; u_char dummy :1; // has to be 0 u_char section_syntax_indicator :1; #endif u_char section_length_lo :8; u_char transport_stream_id_hi :8; u_char transport_stream_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :2; u_char version_number :5; u_char current_next_indicator :1; #else u_char current_next_indicator :1; u_char version_number :5; u_char :2; #endif u_char section_number :8; u_char last_section_number :8; } pat_t; #define PAT_PROG_LEN 4 /** @brief Program Association Table (PAT): program*/ typedef struct { u_char program_number_hi :8; u_char program_number_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :3; u_char network_pid_hi :5; #else u_char network_pid_hi :5; u_char :3; #endif u_char network_pid_lo :8; /* or program_map_pid (if prog_num=0)*/ } pat_prog_t; //Used to generate the CA_PMT message and for autoconfiguration /** @brief Mpeg2-TS header*/ typedef struct { u_char sync_byte :8; #if BYTE_ORDER == BIG_ENDIAN u_char transport_error_indicator :1; u_char payload_unit_start_indicator :1; u_char transport_priority :1; u_char pid_hi :5; #else u_char pid_hi :5; u_char transport_priority :1; u_char payload_unit_start_indicator :1; u_char transport_error_indicator :1; #endif u_char pid_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char transport_scrambling_control :2; u_char adaptation_field_control :2; u_char continuity_counter :4; #else u_char continuity_counter :4; u_char adaptation_field_control :2; u_char transport_scrambling_control :2; #endif } ts_header_t; //For cam support and autoconfigure /** length of the PMT header */ #define PMT_LEN 12 /**@brief Program Map Table (PMT): * * - the PMT identifies and indicates the locations of the streams that * make up each service, and the location of the Program Clock * Reference fields for a service. * */ typedef struct { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char dummy :1; // has to be 0 u_char :2; u_char section_length_hi :4; #else u_char section_length_hi :4; u_char :2; u_char dummy :1; // has to be 0 u_char section_syntax_indicator :1; #endif u_char section_length_lo :8; u_char program_number_hi :8; u_char program_number_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :2; u_char version_number :5; u_char current_next_indicator :1; #else u_char current_next_indicator :1; u_char version_number :5; u_char :2; #endif u_char section_number :8; u_char last_section_number :8; #if BYTE_ORDER == BIG_ENDIAN u_char :3; u_char PCR_PID_hi :5; #else u_char PCR_PID_hi :5; u_char :3; #endif u_char PCR_PID_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :4; u_char program_info_length_hi :4; #else u_char program_info_length_hi :4; u_char :4; #endif u_char program_info_length_lo :8; //descriptors } pmt_t; /** length of the PMT program information section header */ #define PMT_INFO_LEN 5 /** @brief Program Map Table (PMT) : program information section*/ typedef struct { u_char stream_type :8; #if BYTE_ORDER == BIG_ENDIAN u_char :3; u_char elementary_PID_hi :5; #else u_char elementary_PID_hi :5; u_char :3; #endif u_char elementary_PID_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :4; u_char ES_info_length_hi :4; #else u_char ES_info_length_hi :4; u_char :4; #endif u_char ES_info_length_lo :8; // descriptors } pmt_info_t; #define DESCR_CA_LEN 6 /** @brief 0x09 ca_descriptor */ typedef struct { u_char descriptor_tag :8; u_char descriptor_length :8; u_char CA_type_hi :8; u_char CA_type_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char reserved :3; u_char CA_PID_hi :5; #else u_char CA_PID_hi :5; u_char reserved :3; #endif u_char CA_PID_lo :8; } descr_ca_t; /** length of the SDT header */ #define SDT_LEN 11 /** @brief Service Description Table (SDT): * * - the SDT contains data describing the services in the system e.g. * names of services, the service provider, etc. * */ typedef struct { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char :3; u_char section_length_hi :4; #else u_char section_length_hi :4; u_char :3; u_char section_syntax_indicator :1; #endif u_char section_length_lo :8; u_char transport_stream_id_hi :8; u_char transport_stream_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :2; u_char version_number :5; u_char current_next_indicator :1; #else u_char current_next_indicator :1; u_char version_number :5; u_char :2; #endif u_char section_number :8; u_char last_section_number :8; u_char original_network_id_hi :8; u_char original_network_id_lo :8; u_char :8; } sdt_t; #define GetSDTTransportStreamId(x) (HILO(((sdt_t *) x)->transport_stream_id)) #define GetSDTOriginalNetworkId(x) (HILO(((sdt_t *) x)->original_network_id)) #define SDT_DESCR_LEN 5 /**@brief Service Description Table (SDT), descriptor */ typedef struct { u_char service_id_hi :8; u_char service_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :6; u_char eit_schedule_flag :1; u_char eit_present_following_flag :1; u_char running_status :3; u_char free_ca_mode :1; u_char descriptors_loop_length_hi :4; #else u_char eit_present_following_flag :1; u_char eit_schedule_flag :1; u_char :6; u_char descriptors_loop_length_hi :4; u_char free_ca_mode :1; u_char running_status :3; #endif u_char descriptors_loop_length_lo :8; } sdt_descr_t; /* * * 3) Event Information Table (EIT): * * - the EIT contains data concerning events or programmes such as event * name, start time, duration, etc.; - the use of different descriptors * allows the transmission of different kinds of event information e.g. * for different service types. * */ #define EIT_LEN 14 typedef struct { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char :3; u_char section_length_hi :4; #else u_char section_length_hi :4; u_char :3; u_char section_syntax_indicator :1; #endif u_char section_length_lo :8; u_char service_id_hi :8; u_char service_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :2; u_char version_number :5; u_char current_next_indicator :1; #else u_char current_next_indicator :1; u_char version_number :5; u_char :2; #endif u_char section_number :8; u_char last_section_number :8; u_char transport_stream_id_hi :8; u_char transport_stream_id_lo :8; u_char original_network_id_hi :8; u_char original_network_id_lo :8; u_char segment_last_section_number :8; u_char segment_last_table_id :8; } eit_t; /* * * 5) Network Information Table (NIT): * * - the NIT is intended to provide information about the physical * network. The syntax and semantics of the NIT are defined in * ETSI EN 300 468. * */ #define NIT_LEN 10 typedef struct { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char :3; u_char section_length_hi :4; #else u_char section_length_hi :4; u_char :3; u_char section_syntax_indicator :1; #endif u_char section_length_lo :8; u_char network_id_hi :8; u_char network_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :2; u_char version_number :5; u_char current_next_indicator :1; #else u_char current_next_indicator :1; u_char version_number :5; u_char :2; #endif u_char section_number :8; u_char last_section_number :8; #if BYTE_ORDER == BIG_ENDIAN u_char :4; u_char network_descriptor_length_hi :4; #else u_char network_descriptor_length_hi :4; u_char :4; #endif u_char network_descriptor_length_lo :8; /* descriptors */ }nit_t; #define SIZE_NIT_MID 2 typedef struct { // after descriptors #if BYTE_ORDER == BIG_ENDIAN u_char :4; u_char transport_stream_loop_length_hi :4; #else u_char transport_stream_loop_length_hi :4; u_char :4; #endif u_char transport_stream_loop_length_lo :8; }nit_mid_t; #define NIT_TS_LEN 6 typedef struct { u_char transport_stream_id_hi :8; u_char transport_stream_id_lo :8; u_char original_network_id_hi :8; u_char original_network_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :4; u_char transport_descriptors_length_hi :4; #else u_char transport_descriptors_length_hi :4; u_char :4; #endif u_char transport_descriptors_length_lo :8; /* descriptors */ }nit_ts_t; #define NIT_LCN_LEN 4 typedef struct { u_char service_id_hi :8; u_char service_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char visible_service_flag :1; u_char reserved :5; u_char logical_channel_number_hi :2; #else u_char logical_channel_number_hi :2; u_char reserved :5; u_char visible_service_flag :1; #endif u_char logical_channel_number_lo :8; }nit_lcn_t; /** length of the common tables header */ #define TABLE_LEN 8 #define BYTES_BFR_SEC_LEN 3 //the number of bytes before the section_length (so must be added to section_length to get full len) /** @brief Common Table headers (PAT, EIT, SDT, PMT, NIT): * This header is the first 8 bytes common to all tables * it's mainly used to get the section length */ typedef struct { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char :3; u_char section_length_hi :4; #else u_char section_length_hi :4; u_char :3; u_char section_syntax_indicator :1; #endif u_char section_length_lo :8; u_char transport_stream_id_hi :8; u_char transport_stream_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :2; u_char version_number :5; u_char current_next_indicator :1; #else u_char current_next_indicator :1; u_char version_number :5; u_char :2; #endif u_char section_number :8; u_char last_section_number :8; } tbl_h_t; /** @brief 0x5a terrestrial_delivery_system_descriptor */ typedef struct { u_char descriptor_tag :8; u_char descriptor_length :8; u_char frequency_4 :8; u_char frequency_3 :8; u_char frequency_2 :8; u_char frequency_1 :8; #if BYTE_ORDER == BIG_ENDIAN u_char bandwidth :3; u_char priority :1; u_char Time_Slicing_indicator :1; u_char MPE_FEC_indicator :1; u_char :2; #else u_char :2; u_char MPE_FEC_indicator :1; u_char Time_Slicing_indicator :1; u_char priority :1; u_char bandwidth :3; #endif #if BYTE_ORDER == BIG_ENDIAN u_char constellation :2; u_char hierarchy_information :3; u_char code_rate_HP_stream :3; #else u_char code_rate_HP_stream :3; u_char hierarchy_information :3; u_char constellation :2; #endif #if BYTE_ORDER == BIG_ENDIAN u_char code_rate_LP_stream :3; u_char guard_interval :2; u_char transmission_mode :2; u_char other_frequency_flag :1; #else u_char other_frequency_flag :1; u_char transmission_mode :2; u_char guard_interval :2; u_char code_rate_LP_stream :3; #endif } descr_terr_delivery_t; /** @brief 0x43 satellite_delivery_system_descriptor */ typedef struct { u_char descriptor_tag :8; u_char descriptor_length :8; u_char frequency_4 :8; u_char frequency_3 :8; u_char frequency_2 :8; u_char frequency_1 :8; u_char orbital_position_hi :8; u_char orbital_position_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char west_east_flag :1; u_char polarization :2; u_char roll_off :2; u_char modulation_system :1; u_char modulation_type :2; #else u_char modulation_type :2; u_char modulation_system :1; u_char roll_off :2; u_char polarization :2; u_char west_east_flag :1; #endif u_char symbol_rate_12 :8; u_char symbol_rate_34 :8; u_char symbol_rate_56 :8; #if BYTE_ORDER == BIG_ENDIAN u_char symbol_rate_7 :4; u_char FEC_inner :4; #else u_char FEC_inner :4; u_char symbol_rate_7 :4; #endif } descr_sat_delivery_t; /*************************************************** * ATSC PSIP tables * * See A/65C * * Atsc standard : * * Program and System Information Protocol for * * Terrestrial Broadcast and Cable (revision C). * ***************************************************/ #define PSIP_HEADER_LEN 9 /**@brief Header of an ATSC PSIP (Program and System Information Protocol) table*/ typedef struct { u_char table_id :8; #if BYTE_ORDER == BIG_ENDIAN u_char section_syntax_indicator :1; u_char private_indicator :1; u_char :2; u_char section_length_hi :4; #else u_char section_length_hi :4; u_char :2; u_char private_indicator :1; u_char section_syntax_indicator :1; #endif u_char section_length_lo :8; u_char transport_stream_id_hi :8; u_char transport_stream_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :2; u_char version_number :5; u_char current_next_indicator :1; #else u_char current_next_indicator :1; u_char version_number :5; u_char :2; #endif u_char section_number :8; u_char last_section_number :8; u_char protocol_version :8; // u_char num_channels_in_section :8; //For information, in case of TVCT or CVCT } psip_t; #define PSIP_VCT_LEN 32 /**@brief PSIP (TC)VCT (Terrestrial/Cable Virtual Channel Table) channels descriptors*/ typedef struct { uint8_t short_name[14];//The channel short name in UTF-16 #if BYTE_ORDER == BIG_ENDIAN u_char :4; //reserved u_char major_channel_number_hi4 :4; #else u_char major_channel_number_hi4 :4; u_char :4; //reserved #endif #if BYTE_ORDER == BIG_ENDIAN u_char major_channel_number_lo6 :6; u_char minor_channel_number_hi :2; #else u_char minor_channel_number_hi :2; u_char major_channel_number_lo6 :6; #endif u_char minor_channel_number_lo :8; u_char modulation_mode :8; u_int8_t carrier_frequency[4]; //deprecated u_char channel_tsid_hi :8; u_char channel_tsid_lo :8; u_char program_number_hi :8; u_char program_number_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char ETM_location :2; u_char access_controlled :1; u_char hidden :1; u_char path_select :1; //Only cable u_char out_of_band :1; //Only cable u_char hide_guide :1; u_char :1; //reserved #else u_char :1; //reserved u_char hide_guide :1; u_char out_of_band :1; //Only cable u_char path_select :1; //Only cable u_char hidden :1; u_char access_controlled :1; u_char ETM_location :2; #endif #if BYTE_ORDER == BIG_ENDIAN u_char :2; //reserved u_char service_type :6; #else u_char service_type :6; u_char :2; //reserved #endif u_char source_id_hi :8; u_char source_id_lo :8; #if BYTE_ORDER == BIG_ENDIAN u_char :6; u_char descriptor_length_hi :2; #else u_char descriptor_length_hi :2; u_char :6; #endif u_char descriptor_length_lo :8; } psip_vct_channel_t; //1 for number strings, 3 for language code,1 for number of segments #define MULTIPLE_STRING_STRUCTURE_HEADER 5 /***************************** * End of ATSC PSIP tables * *****************************/ /** Enum to tell if the option is set*/ typedef enum packet_status { EMPTY, //No data in the packet STARTED, //Some data are in the packet VALID //All the expected data are in the packet and the CRC32 is valid } packet_status_t; //The number of complete section we accept to have in one TS //A TS is 188bytes long minus 4 bytes for the header 184 bytes left //A section is at least 8 bytes long + one descriptor 3 bytes + CRC32 4 bytes //it's a total of 15bytes / section #define MAX_FULL_PACKETS 15 //A minimum is MAX_TS_SIZE + TS_PACKET_SIZE //Just to add flexibility on how to write the code I take some margin #define FULL_BUFFER_SIZE 2*MAX_TS_SIZE /**@brief structure for the build of a ts packet Since a packet can be finished and another one starts in the same elementary TS packet, there is two packets in this structure */ typedef struct { /** the buffer for the packet full (empty or contains a valid full packet)*/ unsigned char data_full[MAX_TS_SIZE]; /** the length of the data contained in data_full */ int len_full; //starting from here, these variables MUSN'T be accessed outside ts.c /** The number of full packets */ int full_number; /** The lengths of the full packets */ int full_lengths[MAX_FULL_PACKETS]; /** The amount of data in the full buffer */ int full_buffer_len; /** The buffer containing the full packets */ unsigned char buffer_full[FULL_BUFFER_SIZE]; /** the buffer for the partial packet (never valid, shouldn't be accessed by funtions other than get_ts_packet)*/ unsigned char data_partial[MAX_TS_SIZE]; /** the length of the data contained in data_partial */ int len_partial; /** the expected length of the data contained in data_partial */ int expected_len_partial; /** The packet status*/ packet_status_t status_partial; /**The PID of the packet*/ int pid; /**the countinuity counter, incremented in each packet*/ int cc; /** If we have threads, the lock on the packet */ pthread_mutex_t packetmutex; }mumudvb_ts_packet_t; int get_ts_packet(unsigned char *, mumudvb_ts_packet_t *); unsigned char *get_ts_begin(unsigned char *buf); struct mumudvb_channel_t; int check_pmt_service_id(mumudvb_ts_packet_t *pmt, struct mumudvb_channel_t *channel); void ts_display_pat(char* log_module,unsigned char *buf); #endif mumudvb-1.7.1/src/tune.c000066400000000000000000001220201177353207000151070ustar00rootroot00000000000000/* MuMuDVB - Stream a DVB transport stream. * File for tuning DVB cards * * last version availaible from http://mumudvb.braice.net/ * * Copyright (C) 2004-2011 Brice DUBOST * Copyright (C) Dave Chapman 2001,2002 * Part of this code from Romolo Manfredini * * 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. * Or, point your browser to http://www.gnu.org/copyleft/gpl.html * */ /** @file * @brief Tuning of the dvb card * * This file contains functions for tuning the card, or displaying signal strength... */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tune.h" #include "mumudvb.h" #include "errors.h" #include "log.h" extern int Interrupted; static char *log_module="Tune: "; /** @brief Read a line of the configuration file to check if there is a tuning parameter * * @param tuneparams the tuning parameters * @param substring The currrent line */ int read_tuning_configuration(tuning_parameters_t *tuneparams, char *substring) { char delimiteurs[] = CONFIG_FILE_SEPARATOR; if (!strcmp (substring, "sat_number")) { substring = strtok (NULL, delimiteurs); tuneparams->sat_number = atoi (substring); if (tuneparams->sat_number > 4) { log_message( log_module, MSG_ERROR, "Config issue : sat_number. The satellite number must be between 0 and 4. Please report if you have an equipment wich support more\n"); return -1; } } #ifdef ATSC else if (!strcmp (substring, "atsc_modulation")) { tuneparams->modulation_set = 1; log_message( log_module, MSG_WARN, "The option atsc_modulation is deprecated, use the option modulation instead\n"); substring = strtok (NULL, delimiteurs); if (!strcmp (substring, "vsb8")) tuneparams->modulation = VSB_8; else if (!strcmp (substring, "vsb16")) tuneparams->modulation = VSB_16; else if (!strcmp (substring, "qam256")) tuneparams->modulation = QAM_256; else if (!strcmp (substring, "qam64")) tuneparams->modulation = QAM_64; else if (!strcmp (substring, "qamauto")) tuneparams->modulation = QAM_AUTO; else { log_message( log_module, MSG_WARN, "Bad value for atsc_modulation, will try VSB_8 (usual modulation for terrestrial)\n"); tuneparams->modulation_set = 0; } } #endif else if (!strcmp (substring, "freq")) { double temp_freq; substring = strtok (NULL, delimiteurs); temp_freq = atof (substring); tuneparams->freq = (int)( 1000UL * temp_freq); } else if (!strcmp (substring, "pol")) { substring = strtok (NULL, delimiteurs); if (tolower (substring[0]) == 'v') { tuneparams->pol = 'V'; } else if (tolower (substring[0]) == 'h') { tuneparams->pol = 'H'; } else if (tolower (substring[0]) == 'l') { tuneparams->pol = 'L'; } else if (tolower (substring[0]) == 'r') { tuneparams->pol = 'R'; } else { log_message( log_module, MSG_ERROR, "Config issue : polarisation\n"); return -1; } } else if (!strcmp (substring, "lnb_voltage_off")) { substring = strtok (NULL, delimiteurs); tuneparams->lnb_voltage_off = atoi(substring); } else if (!strcmp (substring, "lnb_type")) { substring = strtok (NULL, delimiteurs); if(!strcmp (substring, "universal")) tuneparams->lnb_type=LNB_UNIVERSAL; else if(!strcmp (substring, "standard")) tuneparams->lnb_type=LNB_STANDARD; else { log_message( log_module, MSG_ERROR, "Config issue : lnb_type\n"); return -1; } } else if (!strcmp (substring, "lnb_lof_standard")) { substring = strtok (NULL, delimiteurs); tuneparams->lnb_lof_standard = atoi(substring)*1000UL; } else if (!strcmp (substring, "lnb_slof")) { substring = strtok (NULL, delimiteurs); tuneparams->lnb_slof = atoi(substring)*1000UL; } else if (!strcmp (substring, "lnb_lof_high")) { substring = strtok (NULL, delimiteurs); tuneparams->lnb_lof_high = atoi(substring)*1000UL; } else if (!strcmp (substring, "lnb_lof_low")) { substring = strtok (NULL, delimiteurs); tuneparams->lnb_lof_low = atoi(substring)*1000UL; } else if (!strcmp (substring, "srate")) { substring = strtok (NULL, delimiteurs); tuneparams->srate = atol (substring); tuneparams->srate *= 1000UL; } else if (!strcmp (substring, "card")) { substring = strtok (NULL, delimiteurs); tuneparams->card = atoi (substring); } else if (!strcmp (substring, "check_status")) { substring = strtok (NULL, delimiteurs); tuneparams->check_status = atoi (substring); } else if (!strcmp (substring, "tuner")) { substring = strtok (NULL, delimiteurs); tuneparams->tuner = atoi (substring); } else if (!strcmp (substring, "card_dev_path")) { substring = strtok (NULL, delimiteurs); if(strlen(substring)>(256-1)) { log_message( log_module, MSG_ERROR, "The card dev path is too long\n"); return -1; } strcpy (tuneparams->card_dev_path, substring); } else if (!strcmp (substring, "qam")) { // DVB-T log_message( log_module, MSG_WARN, " The option qam is deprecated, use the option modulation instead\n"); tuneparams->modulation_set = 1; substring = strtok (NULL, delimiteurs); sscanf (substring, "%s\n", substring); if (!strcmp (substring, "qpsk")) tuneparams->modulation=QPSK; else if (!strcmp (substring, "16")) tuneparams->modulation=QAM_16; else if (!strcmp (substring, "32")) tuneparams->modulation=QAM_32; else if (!strcmp (substring, "64")) tuneparams->modulation=QAM_64; else if (!strcmp (substring, "128")) tuneparams->modulation=QAM_128; else if (!strcmp (substring, "256")) tuneparams->modulation=QAM_256; else if (!strcmp (substring, "auto")) tuneparams->modulation=QAM_AUTO; else { log_message( log_module, MSG_ERROR, "Config issue : QAM\n"); tuneparams->modulation_set = 0; return -1; } } else if (!strcmp (substring, "trans_mode")) { // DVB-T substring = strtok (NULL, delimiteurs); sscanf (substring, "%s\n", substring); if (!strcmp (substring, "2k")) tuneparams->TransmissionMode=TRANSMISSION_MODE_2K; else if (!strcmp (substring, "8k")) tuneparams->TransmissionMode=TRANSMISSION_MODE_8K; else if (!strcmp (substring, "auto")) tuneparams->TransmissionMode=TRANSMISSION_MODE_AUTO; #ifdef TRANSMISSION_MODE_4K //DVB-T2 else if (!strcmp (substring, "4k")) tuneparams->TransmissionMode=TRANSMISSION_MODE_4K; #endif #ifdef TRANSMISSION_MODE_16K //DVB-T2 else if (!strcmp (substring, "16k")) tuneparams->TransmissionMode=TRANSMISSION_MODE_16K; #endif #ifdef TRANSMISSION_MODE_32K //DVB-T2 else if (!strcmp (substring, "32k")) tuneparams->TransmissionMode=TRANSMISSION_MODE_32K; #endif else { log_message( log_module, MSG_ERROR, "Config issue : trans_mode\n"); return -1; } } else if (!strcmp (substring, "bandwidth")) { // DVB-T substring = strtok (NULL, delimiteurs); sscanf (substring, "%s\n", substring); if (!strcmp (substring, "8MHz")) tuneparams->bandwidth=BANDWIDTH_8_MHZ; else if (!strcmp (substring, "7MHz")) tuneparams->bandwidth=BANDWIDTH_7_MHZ; else if (!strcmp (substring, "6MHz")) tuneparams->bandwidth=BANDWIDTH_6_MHZ; else if (!strcmp (substring, "auto")) tuneparams->bandwidth=BANDWIDTH_AUTO; // DVB-T2 // @See https://patchwork.kernel.org/patch/761652/ #ifdef BANDWIDTH_5_MHZ else if (!strcmp (substring, "5MHz")) tuneparams->bandwidth=BANDWIDTH_5_MHZ; #endif #ifdef BANDWIDTH_10_MHZ else if (!strcmp (substring, "10MHz")) tuneparams->bandwidth=BANDWIDTH_10_MHZ; #endif #ifdef BANDWIDTH_1_712_MHZ else if (!strcmp (substring, "1.712MHz")) tuneparams->bandwidth=BANDWIDTH_1_712_MHZ; #endif else { log_message( log_module, MSG_ERROR, "Config issue : bandwidth\n"); return -1; } } else if (!strcmp (substring, "guardinterval")) { // DVB-T substring = strtok (NULL, delimiteurs); sscanf (substring, "%s\n", substring); if (!strcmp (substring, "1/32")) tuneparams->guardInterval=GUARD_INTERVAL_1_32; else if (!strcmp (substring, "1/16")) tuneparams->guardInterval=GUARD_INTERVAL_1_16; else if (!strcmp (substring, "1/8")) tuneparams->guardInterval=GUARD_INTERVAL_1_8; else if (!strcmp (substring, "1/4")) tuneparams->guardInterval=GUARD_INTERVAL_1_4; else if (!strcmp (substring, "auto")) tuneparams->guardInterval=GUARD_INTERVAL_AUTO; // DVB-T2 #ifdef GUARD_INTERVAL_1_128 else if (!strcmp (substring, "1/128")) tuneparams->guardInterval=GUARD_INTERVAL_1_128; #endif #ifdef GUARD_INTERVAL_19_128 else if (!strcmp (substring, "19/128")) tuneparams->guardInterval=GUARD_INTERVAL_19_128; #endif #ifdef GUARD_INTERVAL_19_256 else if (!strcmp (substring, "19/256")) tuneparams->guardInterval=GUARD_INTERVAL_19_256; #endif else { log_message( log_module, MSG_ERROR, "Config issue : guardinterval\n"); return -1; } } else if (!strcmp (substring, "coderate")) { // DVB-T substring = strtok (NULL, delimiteurs); sscanf (substring, "%s\n", substring); if (!strcmp (substring, "none")) tuneparams->HP_CodeRate=FEC_NONE; else if (!strcmp (substring, "1/2")) tuneparams->HP_CodeRate=FEC_1_2; else if (!strcmp (substring, "2/3")) tuneparams->HP_CodeRate=FEC_2_3; else if (!strcmp (substring, "3/4")) tuneparams->HP_CodeRate=FEC_3_4; else if (!strcmp (substring, "4/5")) tuneparams->HP_CodeRate=FEC_4_5; else if (!strcmp (substring, "5/6")) tuneparams->HP_CodeRate=FEC_5_6; else if (!strcmp (substring, "6/7")) tuneparams->HP_CodeRate=FEC_6_7; else if (!strcmp (substring, "7/8")) tuneparams->HP_CodeRate=FEC_7_8; else if (!strcmp (substring, "8/9")) tuneparams->HP_CodeRate=FEC_8_9; else if (!strcmp (substring, "auto")) tuneparams->HP_CodeRate=FEC_AUTO; #if DVB_API_VERSION >= 5 else if (!strcmp (substring, "3/5")) tuneparams->HP_CodeRate=FEC_3_5; else if (!strcmp (substring, "9/10")) tuneparams->HP_CodeRate=FEC_9_10; #endif else { log_message( log_module, MSG_ERROR, "Config issue : coderate\n"); return -1; } tuneparams->LP_CodeRate=tuneparams->HP_CodeRate; // I found the following : //In order to achieve hierarchy, two different code rates may be applied to two different levels of the modulation. Since hierarchy is not implemented ... } else if (!strcmp (substring, "delivery_system")) { #if DVB_API_VERSION >= 5 substring = strtok (NULL, delimiteurs); sscanf (substring, "%s\n", substring); if (!strcmp (substring, "DVBC_ANNEX_AC")) tuneparams->delivery_system=SYS_DVBC_ANNEX_AC; else if (!strcmp (substring, "DVBC_ANNEX_B")) tuneparams->delivery_system=SYS_DVBC_ANNEX_B; else if (!strcmp (substring, "DVBT")) tuneparams->delivery_system=SYS_DVBT; #ifdef SYS_DVBT2 else if (!strcmp (substring, "DVBT2")) tuneparams->delivery_system=SYS_DVBT2; #endif else if (!strcmp (substring, "DSS")) tuneparams->delivery_system=SYS_DSS; else if (!strcmp (substring, "DVBS")) tuneparams->delivery_system=SYS_DVBS; else if (!strcmp (substring, "DVBS2")) tuneparams->delivery_system=SYS_DVBS2; else if (!strcmp (substring, "DVBH")) tuneparams->delivery_system=SYS_DVBH; else if (!strcmp (substring, "ISDBT")) tuneparams->delivery_system=SYS_ISDBT; else if (!strcmp (substring, "ISDBS")) tuneparams->delivery_system=SYS_ISDBS; else if (!strcmp (substring, "ISDBS")) tuneparams->delivery_system=SYS_ISDBS; else if (!strcmp (substring, "ISDBC")) tuneparams->delivery_system=SYS_ISDBC; else if (!strcmp (substring, "ATSC")) tuneparams->delivery_system=SYS_ATSC; else if (!strcmp (substring, "ATSCMH")) tuneparams->delivery_system=SYS_ATSCMH; else if (!strcmp (substring, "DMBTH")) tuneparams->delivery_system=SYS_DMBTH; else if (!strcmp (substring, "CMMB")) tuneparams->delivery_system=SYS_CMMB; else if (!strcmp (substring, "DAB")) tuneparams->delivery_system=SYS_DAB; else { log_message( log_module, MSG_ERROR, "Config issue : delivery_system. Unknown delivery_system : %s\n",substring); return -1; } log_message( log_module, MSG_INFO, "You will use DVB API version 5 for tuning your card.\n"); #else log_message( log_module, MSG_ERROR, "Config issue : delivery_system. You are trying to set the delivery system but your MuMuDVB have not been built with DVB-S2/DVB API 5 support.\n"); return -1; #endif } else if (!strcmp (substring, "rolloff")) { #if DVB_API_VERSION >= 5 substring = strtok (NULL, delimiteurs); sscanf (substring, "%s\n", substring); if (!strcmp (substring, "35")) tuneparams->rolloff=ROLLOFF_35; else if (!strcmp (substring, "20")) tuneparams->rolloff=ROLLOFF_20; else if (!strcmp (substring, "25")) tuneparams->rolloff=ROLLOFF_25; else if (!strcmp (substring, "auto")) tuneparams->rolloff=ROLLOFF_AUTO; else { log_message( log_module, MSG_ERROR, "Config issue : delivery_system. Unknown delivery_system : %s\n",substring); return -1; } log_message( log_module, MSG_INFO, "You will use DVB API version 5 for tuning your card.\n"); #else log_message( log_module, MSG_ERROR, "Config issue : delivery_system. You are trying to set the rolloff but your MuMuDVB have not been built with DVB-S2/DVB API 5 support.\n"); return -1; #endif } else if (!strcmp (substring, "modulation")) { tuneparams->modulation_set = 1; substring = strtok (NULL, delimiteurs); if (!strcmp (substring, "QPSK")) tuneparams->modulation = QPSK; else if (!strcmp (substring, "QAM16")) tuneparams->modulation = QAM_16; else if (!strcmp (substring, "QAM32")) tuneparams->modulation = QAM_32; else if (!strcmp (substring, "QAM64")) tuneparams->modulation = QAM_64; else if (!strcmp (substring, "QAM128")) tuneparams->modulation = QAM_128; else if (!strcmp (substring, "QAM256")) tuneparams->modulation = QAM_256; else if (!strcmp (substring, "QAMAUTO")) tuneparams->modulation = QAM_AUTO; #ifdef ATSC else if (!strcmp (substring, "VSB8")) tuneparams->modulation = VSB_8; else if (!strcmp (substring, "VSB16")) tuneparams->modulation = VSB_16; #endif #if DVB_API_VERSION >= 5 else if (!strcmp (substring, "8PSK")) tuneparams->modulation = PSK_8; else if (!strcmp (substring, "16APSK")) tuneparams->modulation = APSK_16; else if (!strcmp (substring, "32APSK")) tuneparams->modulation = APSK_32; else if (!strcmp (substring, "DQPSK")) tuneparams->modulation = DQPSK; #endif else { log_message( log_module, MSG_ERROR, "Config issue : Bad value for modulation\n"); tuneparams->modulation_set = 0; return -1; } } else if ((!strcmp (substring, "timeout_accord"))||(!strcmp (substring, "tuning_timeout"))) { substring = strtok (NULL, delimiteurs); //we extract the substring tuneparams->tuning_timeout = atoi (substring); } else if (!strcmp (substring, "switch_type")) { substring = strtok (NULL, delimiteurs); if (tolower (substring[0]) == 'u') { tuneparams->switch_type = 'U'; } else if (tolower (substring[0]) == 'c') { tuneparams->switch_type = 'C'; } else { log_message( log_module, MSG_ERROR, "Config issue : switch_type\n"); return -1; } } else return 0; //Nothing concerning tuning, we return 0 to explore the other possibilities return 1;//We found something for tuning, we tell main to go for the next line } /** @brief Print the status * Print the status contained in festatus, this status says if the card is lock, sync etc. * * @param festatus the status to display */ void print_status(fe_status_t festatus) { log_message( log_module, MSG_INFO, "FE_STATUS:\n"); if (festatus & FE_HAS_SIGNAL) log_message( log_module, MSG_INFO, " FE_HAS_SIGNAL : found something above the noise level\n"); if (festatus & FE_HAS_CARRIER) log_message( log_module, MSG_INFO, " FE_HAS_CARRIER : found a DVB signal\n"); if (festatus & FE_HAS_VITERBI) log_message( log_module, MSG_INFO, " FE_HAS_VITERBI : FEC is stable\n"); if (festatus & FE_HAS_SYNC) log_message( log_module, MSG_INFO, " FE_HAS_SYNC : found sync bytes\n"); if (festatus & FE_HAS_LOCK) log_message( log_module, MSG_INFO, " FE_HAS_LOCK : everything's working... \n"); if (festatus & FE_TIMEDOUT) log_message( log_module, MSG_INFO, " FE_TIMEDOUT : no lock within the last ... seconds\n"); if (festatus & FE_REINIT) log_message( log_module, MSG_INFO, " FE_REINIT : frontend was reinitialized\n"); } /** The structure for a diseqc command*/ struct diseqc_cmd { struct dvb_diseqc_master_cmd cmd; uint32_t wait; }; /** @brief Wait msec miliseconds */ static inline void msleep(uint32_t msec) { struct timespec req = { msec / 1000, 1000000 * (msec % 1000) }; while (nanosleep(&req, &req)); } /** @brief Send a diseqc message * * As defined in the DiseqC norm, we stop the 22kHz tone, we set the voltage. Wait. send the command. Wait. put back the 22kHz tone * */ static int diseqc_send_msg(int fd, fe_sec_voltage_t v, struct diseqc_cmd **cmd, fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b) { int err; if((err = ioctl(fd, FE_SET_TONE, SEC_TONE_OFF))) { log_message( log_module, MSG_WARN, "problem Setting the Tone OFF\n"); return -1; } if((err = ioctl(fd, FE_SET_VOLTAGE, v))) { log_message( log_module, MSG_WARN, "problem Setting the Voltage\n"); return -1; } msleep(15); //1.x compatible equipment while (*cmd) { (*cmd)->cmd.msg_len=4; log_message( log_module, MSG_DETAIL ,"Sending Diseqc message %02x %02x %02x %02x %02x len %d\n", (*cmd)->cmd.msg[0],(*cmd)->cmd.msg[1],(*cmd)->cmd.msg[2],(*cmd)->cmd.msg[3],(*cmd)->cmd.msg[4],(*cmd)->cmd.msg[5], (*cmd)->cmd.msg_len); if((err = ioctl(fd, FE_DISEQC_SEND_MASTER_CMD, &(*cmd)->cmd))) { log_message( log_module, MSG_WARN, "problem sending the DiseqC message\n"); return -1; } msleep((*cmd)->wait); cmd++; } msleep(15); if ((err = ioctl(fd, FE_DISEQC_SEND_BURST, b))) { log_message( log_module, MSG_WARN, "problem sending the Tone Burst\n"); return err; } msleep(15); if(ioctl(fd, FE_SET_TONE, t) < 0) { log_message( log_module, MSG_WARN, "problem Setting the Tone back\n"); return -1; } return 0; } /** @brief generate and sent the digital satellite equipment control "message", * specification is available from http://www.eutelsat.com/ * * This function will set the LNB voltage and the 22kHz tone. If a satellite switching is asked * it will send a diseqc message * * @param fd : the file descriptor of the frontend * @param sat_no : the satellite number (0 for non diseqc compliant hardware, 1 to 4 for diseqc compliant) * @param switch_type the switch type (commited or uncommited) * @param pol_v_r : 1 : vertical or circular right, 0 : horizontal or circular left * @param hi_lo : the band for a dual band lnb * @param lnb_voltage_off : if one, force the 13/18V voltage to be 0 independantly of polarization */ static int do_diseqc(int fd, unsigned char sat_no, char switch_type, int pol_v_r, int hi_lo, int lnb_voltage_off) { fe_sec_voltage_t lnb_voltage; struct diseqc_cmd *cmd[2] = { NULL, NULL }; int ret; //Compute the lnb voltage : 0 if we asked, of 13V for vertical and circular right, 18 for horizontal and circular left if (lnb_voltage_off) { lnb_voltage=SEC_VOLTAGE_OFF; log_message( log_module, MSG_INFO, "LNB voltage 0V\n"); } else if(pol_v_r) { lnb_voltage=SEC_VOLTAGE_13; log_message( log_module, MSG_INFO, "LNB voltage 13V\n"); } else { lnb_voltage=SEC_VOLTAGE_18; log_message( log_module, MSG_INFO, "LNB voltage 18V\n"); } //Diseqc compliant hardware if(sat_no != 0) { cmd[0]=malloc(sizeof(struct diseqc_cmd)); if(cmd[0]==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } cmd[0]->wait=0; //Framing byte : Command from master, no reply required, first transmission : 0xe0 cmd[0]->cmd.msg[0] = 0xe0; //Address byte : Any LNB, switcher or SMATV cmd[0]->cmd.msg[1] = 0x10; //Command byte : Write to port group 1 (Uncommited switches) //Command byte : Write to port group 0 (Committed switches) 0x38 if(switch_type=='U') cmd[0]->cmd.msg[2] = 0x39; else cmd[0]->cmd.msg[2] = 0x38; /* param: high nibble: reset bits, low nibble set bits, * bits are: option, position, polarization, band */ cmd[0]->cmd.msg[3] = 0xf0 | ((((sat_no-1) * 4) & 0x0f) | (pol_v_r ? 0 : 2) | (hi_lo ? 1 : 0)); // cmd[0]->cmd.msg[4] = 0x00; cmd[0]->cmd.msg[5] = 0x00; cmd[0]->cmd.msg_len=4; log_message( log_module, MSG_DETAIL ,"Test Diseqc message %02x %02x %02x %02x %02x len %d\n", cmd[0]->cmd.msg[0],cmd[0]->cmd.msg[1],cmd[0]->cmd.msg[2],cmd[0]->cmd.msg[3],cmd[0]->cmd.msg[4],cmd[0]->cmd.msg[5], cmd[0]->cmd.msg_len); ret = diseqc_send_msg(fd, lnb_voltage, cmd, hi_lo ? SEC_TONE_ON : SEC_TONE_OFF, (sat_no) % 2 ? SEC_MINI_B : SEC_MINI_A); if(ret) { log_message( log_module, MSG_WARN, "problem sending the DiseqC message or setting tone/voltage\n"); } free(cmd[0]); return ret; } else //only tone and voltage { if(ioctl(fd, FE_SET_VOLTAGE, lnb_voltage) < 0) { log_message( log_module, MSG_WARN, "problem to set the LNB voltage\n"); return -1; } if(ioctl(fd, FE_SET_TONE, (hi_lo ? SEC_TONE_ON : SEC_TONE_OFF)) < 0) { log_message( log_module, MSG_WARN, "problem to set the 22kHz tone\n"); return -1; } msleep(15); return 0; } } /** @brief Check the status of the card *@todo document */ int check_status(int fd_frontend,int type,uint32_t lo_frequency, int display_strength) { int32_t strength; fe_status_t festatus; struct dvb_frontend_event event; struct pollfd pfd[1]; int status; pfd[0].fd = fd_frontend; pfd[0].events = POLLPRI; event.status=0; while (((event.status & FE_TIMEDOUT)==0) && ((event.status & FE_HAS_LOCK)==0)) { log_message( log_module, MSG_DETAIL, "polling....\n"); if (poll(pfd,1,5000) > 0){ if (pfd[0].revents & POLLPRI){ log_message( log_module, MSG_DETAIL, "Getting frontend event\n"); if ((status = ioctl(fd_frontend, FE_GET_EVENT, &event)) < 0){ if (errno != EOVERFLOW) { log_message( log_module, MSG_ERROR, "FE_GET_EVENT %s. status = %s\n", strerror(errno), status); return -1; } else log_message( log_module, MSG_WARN, "Overflow error, trying again (status = %d, errno = %d)\n", status, errno); } } print_status(event.status); } if(display_strength) { strength=0; if(ioctl(fd_frontend,FE_READ_SIGNAL_STRENGTH,&strength) >= 0) log_message( log_module, MSG_INFO, "Strength: %10d\n",strength); strength=0; if(ioctl(fd_frontend,FE_READ_SNR,&strength) >= 0) log_message( log_module, MSG_INFO, "SNR: %10d\n",strength); } } if (event.status & FE_HAS_LOCK) { switch(type) { case FE_OFDM: log_message( log_module, MSG_INFO, "Event: Frequency: %d\n",event.parameters.frequency); break; case FE_QPSK: log_message( log_module, MSG_INFO, "Event: Frequency: %d (or %d)\n",(unsigned int)((event.parameters.frequency)+lo_frequency),(unsigned int) abs((event.parameters.frequency)-lo_frequency)); log_message( log_module, MSG_INFO, " SymbolRate: %d\n",event.parameters.u.qpsk.symbol_rate); log_message( log_module, MSG_INFO, " FEC_inner: %d\n",event.parameters.u.qpsk.fec_inner); break; case FE_QAM: log_message( log_module, MSG_INFO, "Event: Frequency: %d\n",event.parameters.frequency); log_message( log_module, MSG_INFO, " SymbolRate: %d\n",event.parameters.u.qpsk.symbol_rate); log_message( log_module, MSG_INFO, " FEC_inner: %d\n",event.parameters.u.qpsk.fec_inner); break; #ifdef ATSC case FE_ATSC: log_message( log_module, MSG_INFO, "Event: Frequency: %d\n",event.parameters.frequency); break; #endif default: break; } strength=0; if(ioctl(fd_frontend,FE_READ_BER,&strength) >= 0) log_message( log_module, MSG_INFO, "Bit error rate: %d\n",strength); strength=0; if(ioctl(fd_frontend,FE_READ_SIGNAL_STRENGTH,&strength) >= 0) log_message( log_module, MSG_INFO, "Signal strength: %d\n",strength); strength=0; if(ioctl(fd_frontend,FE_READ_SNR,&strength) >= 0) log_message( log_module, MSG_INFO, "SNR: %d\n",strength); festatus=0; if(ioctl(fd_frontend,FE_READ_STATUS,&festatus) >= 0) print_status(festatus); } else { log_message( log_module, MSG_ERROR, "Not able to lock to the signal on the given frequency\n"); return -1; } return 0; } /** @brief change the delivery subsystem * */ int change_delivery_system(fe_delivery_system_t delivery_system,int fd_frontend) { #if DVB_API_VERSION >= 5 log_message( log_module, MSG_WARN, "We ask the card to change the delivery system (multi frontend cards)."); struct dtv_property pclear[] = { { .cmd = DTV_CLEAR,}, }; struct dtv_properties cmdclear = { .num = 1, .props = pclear }; struct dtv_property dvb_deliv[1]; struct dtv_properties cmddeliv = { .num = 1, .props = dvb_deliv }; dvb_deliv[0].cmd = DTV_DELIVERY_SYSTEM; dvb_deliv[0].u.data = delivery_system; if ((ioctl(fd_frontend, FE_SET_PROPERTY, &cmdclear)) == -1) { log_message( log_module, MSG_ERROR,"FE_SET_PROPERTY clear failed : %s\n", strerror(errno)); Interrupted=ERROR_TUNE<<8; return -1; } if ((ioctl(fd_frontend, FE_SET_PROPERTY, &cmddeliv)) == -1) { log_message( log_module, MSG_ERROR,"FE_SET_PROPERTY failed : %s\n", strerror(errno)); Interrupted=ERROR_TUNE<<8; return -1; } return 0; #else return 0 #endif } /** @brief Tune the card * */ int tune_it(int fd_frontend, tuning_parameters_t *tuneparams) { int res, hi_lo, dfd; struct dvb_frontend_parameters feparams; struct dvb_frontend_info fe_info; uint32_t lo_frequency=0; struct dvb_frontend_event event; int dvbt_bandwidth=0; //no warning memset(&feparams, 0, sizeof (struct dvb_frontend_parameters)); hi_lo = 0; if ( (res = ioctl(fd_frontend,FE_GET_INFO, &fe_info) < 0)){ log_message( log_module, MSG_ERROR, "FE_GET_INFO: %s \n", strerror(errno)); return -1; } /** @todo here check the capabilities of the card*/ log_message( log_module, MSG_INFO, "Using DVB card \"%s\" tuner %d\n",fe_info.name, tuneparams->tuner); // Save the frontend name for easy identification snprintf(tuneparams->fe_name, 256, "%s", fe_info.name); tuneparams->fe_type=fe_info.type; feparams.inversion=INVERSION_AUTO; // see if we need to change the frontend type. @todo : mix between DVB APIv3 and V5 #if DVB_API_VERSION >= 5 int change_deliv=0; switch(fe_info.type) { case FE_OFDM: //DVB-T if((tuneparams->delivery_system!=SYS_UNDEFINED)&&(tuneparams->delivery_system!=SYS_DVBT) #ifdef SYS_DVBT2 &&(tuneparams->delivery_system!=SYS_DVBT2)) #else ) #endif { log_message( log_module, MSG_WARN, "The delivery system does not fit with the card frontend type (DVB-T/T2)."); change_deliv=1; } break; case FE_QPSK: //DVB-S if((tuneparams->delivery_system!=SYS_UNDEFINED)&&(tuneparams->delivery_system!=SYS_DVBS)&&(tuneparams->delivery_system!=SYS_DVBS2)) { log_message( log_module, MSG_WARN, "The delivery system does not fit with the card frontend type (DVB-S).\n"); change_deliv=1; } break; case FE_QAM: //DVB-C if((tuneparams->delivery_system!=SYS_UNDEFINED)&&(tuneparams->delivery_system!=SYS_DVBC_ANNEX_AC)&&(tuneparams->delivery_system!=SYS_DVBC_ANNEX_B)) { log_message( log_module, MSG_WARN, "The delivery system does not fit with the card frontend type (DVB-C).\n"); change_deliv=1; } break; #ifdef ATSC case FE_ATSC: //ATSC if((tuneparams->delivery_system!=SYS_UNDEFINED)&&(tuneparams->delivery_system!=SYS_ATSC)) { log_message( log_module, MSG_WARN, "The delivery system does not fit with the card frontend type (ATSC).\n"); change_deliv=1; } break; #endif default: break; } if(change_deliv) //delivery system needs to be changed { if(change_delivery_system(tuneparams->delivery_system,fd_frontend)) return -1; //get new info if ( (res = ioctl(fd_frontend,FE_GET_INFO, &fe_info) < 0)){ log_message( log_module, MSG_ERROR, "FE_GET_INFO: %s \n", strerror(errno)); return -1; } // Save the frontend name for easy identification snprintf(tuneparams->fe_name, 256, "%s", fe_info.name); tuneparams->fe_type=fe_info.type; feparams.inversion=INVERSION_AUTO; } #endif switch(fe_info.type) { case FE_OFDM: //DVB-T if (tuneparams->freq < 1000000) tuneparams->freq*=1000UL; feparams.frequency=tuneparams->freq; feparams.u.ofdm.bandwidth=tuneparams->bandwidth; feparams.u.ofdm.code_rate_HP=tuneparams->HP_CodeRate; feparams.u.ofdm.code_rate_LP=tuneparams->LP_CodeRate; if(!tuneparams->modulation_set) tuneparams->modulation=MODULATION_DEFAULT; feparams.u.ofdm.constellation=tuneparams->modulation; feparams.u.ofdm.transmission_mode=tuneparams->TransmissionMode; feparams.u.ofdm.guard_interval=tuneparams->guardInterval; feparams.u.ofdm.hierarchy_information=tuneparams->hier; switch(tuneparams->bandwidth) { case BANDWIDTH_8_MHZ: dvbt_bandwidth=8000000; break; case BANDWIDTH_7_MHZ: dvbt_bandwidth=7000000; break; case BANDWIDTH_6_MHZ: dvbt_bandwidth=6000000; break; case BANDWIDTH_AUTO: default: dvbt_bandwidth=0; break; } log_message( log_module, MSG_INFO, "Tuning DVB-T to %d Hz, Bandwidth: %d\n", tuneparams->freq,dvbt_bandwidth); break; case FE_QPSK: //DVB-S if(!tuneparams->modulation_set) tuneparams->modulation=SAT_MODULATION_DEFAULT; //Universal lnb : two bands, hi and low one and two local oscilators if(tuneparams->lnb_type==LNB_UNIVERSAL) { if (tuneparams->freq < tuneparams->lnb_slof) { lo_frequency=tuneparams->lnb_lof_low; hi_lo = 0; } else { lo_frequency=tuneparams->lnb_lof_high; hi_lo = 1; } } //LNB_STANDARD one band and one local oscillator else if (tuneparams->lnb_type==LNB_STANDARD) { hi_lo=0; lo_frequency=tuneparams->lnb_lof_standard; } feparams.frequency=abs(tuneparams->freq-lo_frequency); log_message( log_module, MSG_INFO, "Tuning DVB-S to Freq: %u kHz, LO frequency %u kHz Pol:%c Srate=%d, LNB number: %d\n", feparams.frequency, lo_frequency, tuneparams->pol, tuneparams->srate, tuneparams->sat_number); feparams.u.qpsk.symbol_rate=tuneparams->srate; feparams.u.qpsk.fec_inner=tuneparams->HP_CodeRate; dfd = fd_frontend; //For diseqc vertical==circular right and horizontal == circular left if(do_diseqc( dfd, tuneparams->sat_number, tuneparams->switch_type, (tuneparams->pol == 'V' ? 1 : 0) + (tuneparams->pol == 'R' ? 1 : 0), hi_lo, tuneparams->lnb_voltage_off) == 0) log_message( log_module, MSG_INFO, "DISEQC SETTING SUCCEDED\n"); else { log_message( log_module, MSG_WARN, "DISEQC SETTING FAILED\n"); return -1; } break; case FE_QAM: //DVB-C log_message( log_module, MSG_INFO, "tuning DVB-C to %d Hz, srate=%d\n",tuneparams->freq,tuneparams->srate); feparams.frequency=tuneparams->freq; feparams.inversion=INVERSION_OFF; feparams.u.qam.symbol_rate = tuneparams->srate; feparams.u.qam.fec_inner = tuneparams->HP_CodeRate; if(!tuneparams->modulation_set) tuneparams->modulation=MODULATION_DEFAULT; feparams.u.qam.modulation = tuneparams->modulation; break; #ifdef ATSC case FE_ATSC: //ATSC log_message( log_module, MSG_INFO, "tuning ATSC to %d Hz, modulation=%d\n",tuneparams->freq,tuneparams->modulation); feparams.frequency=tuneparams->freq; if(!tuneparams->modulation_set) tuneparams->modulation=ATSC_MODULATION_DEFAULT; feparams.u.vsb.modulation = tuneparams->modulation; break; #endif default: log_message( log_module, MSG_ERROR, "Unknown FE type : %x. Aborting\n", fe_info.type); Interrupted=ERROR_TUNE<<8; return -1; } usleep(100000); /* The tuning of the card*/ while(1) { if (ioctl(fd_frontend, FE_GET_EVENT, &event) < 0) //EMPTY THE EVENT QUEUE break; } //If we support DVB API version 5 we check if the delivery system was defined #if DVB_API_VERSION >= 5 if(tuneparams->delivery_system==SYS_UNDEFINED) #else if(1) #endif { if (ioctl(fd_frontend,FE_SET_FRONTEND,&feparams) < 0) { log_message( log_module, MSG_ERROR, "ERROR tuning channel : %s \n", strerror(errno)); Interrupted=ERROR_TUNE<<8; return -1; } } #if DVB_API_VERSION >= 5 else { /* Memo : S2API Commands DTV_UNDEFINED DTV_TUNE DTV_CLEAR DTV_FREQUENCY DTV_MODULATION DTV_BANDWIDTH_HZ DTV_INVERSION DTV_DISEQC_MASTER DTV_SYMBOL_RATE DTV_INNER_FEC DTV_VOLTAGE DTV_TONE DTV_PILOT DTV_ROLLOFF DTV_DISEQC_SLAVE_REPLY DTV_FE_CAPABILITY_COUNT DTV_FE_CAPABILITY DTV_DELIVERY_SYSTEM DTV_API_VERSION DTV_API_VERSION DTV_CODE_RATE_HP DTV_CODE_RATE_LP DTV_GUARD_INTERVAL DTV_TRANSMISSION_MODE DTV_HIERARCHY */ //DVB api version 5 and delivery system defined, we do DVB-API-5 tuning log_message( log_module, MSG_INFO, "Tuning With DVB-API version 5. delivery system : %d\n",tuneparams->delivery_system); struct dtv_property pclear[] = { { .cmd = DTV_CLEAR,}, }; struct dtv_properties cmdclear = { .num = 1, .props = pclear }; struct dtv_properties *cmdseq; int commandnum =0; cmdseq = (struct dtv_properties*) calloc(1, sizeof(*cmdseq)); if (!cmdseq) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } cmdseq->props = (struct dtv_property*) calloc(MAX_CMDSEQ_PROPS_NUM, sizeof(*(cmdseq->props))); if (!(cmdseq->props)) { free(cmdseq); log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } if((tuneparams->delivery_system==SYS_DVBS)||(tuneparams->delivery_system==SYS_DVBS2)) { cmdseq->props[commandnum].cmd = DTV_DELIVERY_SYSTEM; cmdseq->props[commandnum++].u.data = tuneparams->delivery_system; cmdseq->props[commandnum].cmd = DTV_FREQUENCY; cmdseq->props[commandnum++].u.data = feparams.frequency; cmdseq->props[commandnum].cmd = DTV_MODULATION; cmdseq->props[commandnum++].u.data = tuneparams->modulation; cmdseq->props[commandnum].cmd = DTV_SYMBOL_RATE; cmdseq->props[commandnum++].u.data = tuneparams->srate; cmdseq->props[commandnum].cmd = DTV_INNER_FEC; cmdseq->props[commandnum++].u.data = tuneparams->HP_CodeRate; cmdseq->props[commandnum].cmd = DTV_INVERSION; cmdseq->props[commandnum++].u.data = INVERSION_AUTO; cmdseq->props[commandnum].cmd = DTV_ROLLOFF; cmdseq->props[commandnum++].u.data = tuneparams->rolloff; cmdseq->props[commandnum].cmd = DTV_PILOT; cmdseq->props[commandnum++].u.data = PILOT_AUTO; cmdseq->props[commandnum++].cmd = DTV_TUNE; } else if((tuneparams->delivery_system==SYS_DVBT) #ifdef SYS_DVBT2 ||(tuneparams->delivery_system==SYS_DVBT2)) #else ) #endif { cmdseq->props[commandnum].cmd = DTV_DELIVERY_SYSTEM; cmdseq->props[commandnum++].u.data = tuneparams->delivery_system; cmdseq->props[commandnum].cmd = DTV_FREQUENCY; cmdseq->props[commandnum++].u.data = feparams.frequency; cmdseq->props[commandnum].cmd = DTV_BANDWIDTH_HZ; cmdseq->props[commandnum++].u.data = dvbt_bandwidth; cmdseq->props[commandnum].cmd = DTV_CODE_RATE_HP; cmdseq->props[commandnum++].u.data = tuneparams->HP_CodeRate; cmdseq->props[commandnum].cmd = DTV_CODE_RATE_LP; cmdseq->props[commandnum++].u.data = tuneparams->LP_CodeRate; cmdseq->props[commandnum].cmd = DTV_MODULATION; cmdseq->props[commandnum++].u.data = tuneparams->modulation; cmdseq->props[commandnum].cmd = DTV_GUARD_INTERVAL; cmdseq->props[commandnum++].u.data = tuneparams->guardInterval; cmdseq->props[commandnum].cmd = DTV_TRANSMISSION_MODE; cmdseq->props[commandnum++].u.data = tuneparams->TransmissionMode; cmdseq->props[commandnum].cmd = DTV_HIERARCHY; cmdseq->props[commandnum++].u.data = tuneparams->hier; cmdseq->props[commandnum++].cmd = DTV_TUNE; } else if((tuneparams->delivery_system==SYS_DVBC_ANNEX_AC)||(tuneparams->delivery_system==SYS_DVBC_ANNEX_B)) { cmdseq->props[commandnum].cmd = DTV_DELIVERY_SYSTEM; cmdseq->props[commandnum++].u.data = tuneparams->delivery_system; cmdseq->props[commandnum].cmd = DTV_FREQUENCY; cmdseq->props[commandnum++].u.data = feparams.frequency; cmdseq->props[commandnum].cmd = DTV_MODULATION; cmdseq->props[commandnum++].u.data = tuneparams->modulation; cmdseq->props[commandnum].cmd = DTV_SYMBOL_RATE; cmdseq->props[commandnum++].u.data = tuneparams->srate; cmdseq->props[commandnum].cmd = DTV_INVERSION; cmdseq->props[commandnum++].u.data = INVERSION_OFF; cmdseq->props[commandnum].cmd = DTV_INNER_FEC; cmdseq->props[commandnum++].u.data = tuneparams->HP_CodeRate; cmdseq->props[commandnum++].cmd = DTV_TUNE; } else if(tuneparams->delivery_system==SYS_ATSC) { cmdseq->props[commandnum].cmd = DTV_DELIVERY_SYSTEM; cmdseq->props[commandnum++].u.data = tuneparams->delivery_system; cmdseq->props[commandnum].cmd = DTV_FREQUENCY; cmdseq->props[commandnum++].u.data = feparams.frequency; cmdseq->props[commandnum].cmd = DTV_MODULATION; cmdseq->props[commandnum++].u.data = tuneparams->modulation; cmdseq->props[commandnum++].cmd = DTV_TUNE; } else { log_message( log_module, MSG_ERROR, "Unsupported delivery system. Try tuning using DVB API 3 (do not set delivery_system). And please contact so it can be implemented.\n"); Interrupted=ERROR_TUNE<<8; free(cmdseq); return -1; } cmdseq->num = commandnum; if ((ioctl(fd_frontend, FE_SET_PROPERTY, &cmdclear)) == -1) { log_message( log_module, MSG_ERROR,"FE_SET_PROPERTY clear failed : %s\n", strerror(errno)); Interrupted=ERROR_TUNE<<8; free(cmdseq); return -1; } if ((ioctl(fd_frontend, FE_SET_PROPERTY, cmdseq)) == -1) { log_message( log_module, MSG_ERROR,"FE_SET_PROPERTY failed : %s\n", strerror(errno)); Interrupted=ERROR_TUNE<<8; free(cmdseq); return -1; } free(cmdseq); } #endif return(check_status(fd_frontend,fe_info.type,lo_frequency,tuneparams->display_strenght)); } mumudvb-1.7.1/src/tune.h000066400000000000000000000116671177353207000151320ustar00rootroot00000000000000/* dvbtune - tune.c part of MuMuDVB last version availaible from http://mumudvb.braice.net/ Copyright (C) 2004-2010 Brice DUBOST Copyright (C) Dave Chapman 2001,2002 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. Or, point your browser to http://www.gnu.org/copyleft/gpl.html */ /** @file * @brief Tuning of the dvb card * * This file contains the definition of the parameters for tuning the card */ #ifndef _TUNE_H #define _TUNE_H #include /* DVB-S */ /** lnb_slof: switch frequency of LNB */ #define DEFAULT_SLOF (11700*1000UL) /** lnb_lof1: local frequency of lower LNB band */ #define DEFAULT_LOF1_UNIVERSAL (9750*1000UL) /** lnb_lof2: local frequency of upper LNB band */ #define DEFAULT_LOF2_UNIVERSAL (10600*1000UL) /** Lnb standard Local oscillator frequency*/ #define DEFAULT_LOF_STANDARD (10750*1000UL) /* DVB-T DVB-C */ /* default option : full auto except bandwith = 8MHz*/ /* AUTO settings */ #define BANDWIDTH_DEFAULT BANDWIDTH_8_MHZ #define HP_CODERATE_DEFAULT FEC_AUTO #define MODULATION_DEFAULT QAM_AUTO #define SAT_MODULATION_DEFAULT QPSK #define TRANSMISSION_MODE_DEFAULT TRANSMISSION_MODE_AUTO #define GUARD_INTERVAL_DEFAULT GUARD_INTERVAL_AUTO #define HIERARCHY_DEFAULT HIERARCHY_NONE #if HIERARCHY_DEFAULT == HIERARCHY_NONE && !defined (LP_CODERATE_DEFAULT) #define LP_CODERATE_DEFAULT (FEC_NONE) /* unused if HIERARCHY_NONE */ #endif /* ATSC */ #define ATSC_MODULATION_DEFAULT VSB_8 /* The lnb type*/ #define LNB_UNIVERSAL 0 #define LNB_STANDARD 1 #if DVB_API_VERSION >= 5 #define MAX_CMDSEQ_PROPS_NUM 12 #endif /** @brief Parameters for tuning the card*/ typedef struct tuning_parameters_t{ /**The card number*/ int card; /**The tuner number*/ int tuner; /** The path of the card */ char card_dev_path[256]; /**Is the card actually tuned ?*/ int card_tuned; /**The timeout for tuninh the card*/ int tuning_timeout; /** the frequency (in MHz for dvb-s in kHz for dvb-t) */ uint32_t freq; /** The symbol rate (QPSK and QAM modulation ie cable and satellite) in symbols per second*/ unsigned int srate; /**The polarisation H, V, L or R (for satellite)*/ char pol; /**The lnb type : universal (two local oscilator frequencies), standard (one)*/ int lnb_type; /**The lo frequency (in kHz) for single LO LNB*/ uint32_t lnb_lof_standard; /**The lo switch frequency for dual LO LNB*/ uint32_t lnb_slof; /**The low LO frequency (in kHz) for dual LO LNB*/ uint32_t lnb_lof_low; /**The HIGH LO frequency (in kHz) for dual LO LNB*/ uint32_t lnb_lof_high; /** Do we force the lnb voltage to be 0 ? (in case the LNB have it's own power supply (satellite only))*/ int lnb_voltage_off; /**The satellite number ie the LNB number*/ unsigned char sat_number; /**The type of switch U uncommitted C committed*/ char switch_type; /** The kind of modulation */ fe_modulation_t modulation; int modulation_set; /** high priority stream code rate ie error correction, FEC */ fe_code_rate_t HP_CodeRate; /** low priority stream code rate * In order to achieve hierarchy, two different code rates may be applied to two different levels of the modulation.*/ fe_code_rate_t LP_CodeRate; /** For DVB-T */ fe_transmit_mode_t TransmissionMode; /** For DVB-T */ fe_guard_interval_t guardInterval; /**For DVB-T : the bandwith (often 8MHz)*/ fe_bandwidth_t bandwidth; /**For DVB-T It seems that it's related to the capability to transmit information in parallel Not configurable for the moment, I have found no transponder to test it*/ fe_hierarchy_t hier; /** do we periodically display the strenght of the signal ?*/ int display_strenght; /** do we periodically check the status of the card ?*/ int check_status; /**shutdown the thread for display strength */ int strengththreadshutdown; /**The frontend type*/ fe_type_t fe_type; /** The frontend name */ char fe_name[256]; #if DVB_API_VERSION >= 5 /** DVB API version 5*/ /**Delivery system : DVB-S DVB-T etc ...*/ fe_delivery_system_t delivery_system; /** Rolloff (For DVB-S and DVB-S2)*/ fe_rolloff_t rolloff; #endif }tuning_parameters_t; int tune_it(int, tuning_parameters_t *); int read_tuning_configuration(tuning_parameters_t *, char *); void print_status(fe_status_t festatus); #endif mumudvb-1.7.1/src/unicast_clients.c000066400000000000000000000170021177353207000173260ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * * (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief File for HTTP unicast clients * @author Brice DUBOST * @date 2009 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "unicast_http.h" #include "unicast_queue.h" #include "mumudvb.h" #include "errors.h" #include "log.h" static char *log_module="Unicast : "; /** @brief Add a client to the chained list of clients * Will allocate the memory and fill the structure * * @param unicast_vars the unicast parameters * @param SocketAddr The socket address * @param Socket The socket number */ unicast_client_t *unicast_add_client(unicast_parameters_t *unicast_vars, struct sockaddr_in SocketAddr, int Socket) { unicast_client_t *client; unicast_client_t *prev_client; log_message( log_module, MSG_FLOOD,"We create a client associated with the socket %d\n",Socket); //We allocate a new client if(unicast_vars->clients==NULL) { log_message( log_module, MSG_FLOOD,"first client\n"); client=unicast_vars->clients=malloc(sizeof(unicast_client_t)); prev_client=NULL; } else { log_message( log_module, MSG_FLOOD,"there is already clients\n"); client=unicast_vars->clients; while(client->next!=NULL) client=client->next; client->next=malloc(sizeof(unicast_client_t)); prev_client=client; client=client->next; } if(client==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); close(Socket); return NULL; } // Disable the Nagle (TCP No Delay) algorithm int iRet; int on = 1; iRet=setsockopt(Socket, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)); if (iRet < 0) { log_message( log_module, MSG_WARN,"setsockopt TCP_NODELAY failed : %s\n", strerror(errno)); } int buffer_size; socklen_t size; size=sizeof(buffer_size); iRet=getsockopt( Socket, SOL_SOCKET, SO_SNDBUF, &buffer_size, &size); if (iRet < 0) { log_message( log_module, MSG_WARN,"get SO_SNDBUF failed : %s\n", strerror(errno)); } else log_message( log_module, MSG_FLOOD,"Actual SO_SNDBUF size : %d\n", buffer_size); if(unicast_vars->socket_sendbuf_size) { buffer_size = unicast_vars->socket_sendbuf_size; iRet=setsockopt(Socket, SOL_SOCKET, SO_SNDBUF, &buffer_size, sizeof(buffer_size)); if (iRet < 0) { log_message( log_module, MSG_WARN,"setsockopt SO_SNDBUF failed : %s\n", strerror(errno)); } else { size=sizeof(buffer_size); iRet=getsockopt( Socket, SOL_SOCKET, SO_SNDBUF, &buffer_size, &size); if (iRet < 0) log_message( log_module, MSG_WARN,"2nd get SO_SNDBUF failed : %s\n", strerror(errno)); else log_message( log_module, MSG_DETAIL,"New SO_SNDBUF size : %d\n", buffer_size); } } //We fill the client data client->SocketAddr=SocketAddr; client->Socket=Socket; client->buffer=NULL; client->buffersize=0; client->bufferpos=0; client->channel=-1; client->askedChannel=-1; client->consecutive_errors=0; client->next=NULL; client->prev=prev_client; client->chan_next=NULL; client->chan_prev=NULL; //We init the queue client->queue.data_bytes_in_queue=0; client->queue.packets_in_queue=0; client->queue.first=NULL; client->queue.last=NULL; unicast_vars->client_number++; return client; } /** @brief Delete a client to the chained list of clients and in the associated channel * This function close the socket of the client * remove it from the associated channel if there is one * and free the memory of the client (including the buffer) * * @param unicast_vars the unicast parameters * @param client the client we want to delete * @param channels the array of channels */ int unicast_del_client(unicast_parameters_t *unicast_vars, unicast_client_t *client, mumudvb_channel_t *channels) { unicast_client_t *prev_client,*next_client; log_message( log_module, MSG_FLOOD,"We delete the client %s:%d, socket %d\n",inet_ntoa(client->SocketAddr.sin_addr), client->SocketAddr.sin_port, client->Socket); if (client->Socket >= 0) { close(client->Socket); } prev_client=client->prev; next_client=client->next; if(prev_client==NULL) { log_message( log_module, MSG_FLOOD,"We delete the first client\n"); unicast_vars->clients=client->next; } else prev_client->next=client->next; if(next_client) next_client->prev=prev_client; //We delete the client in the channel if(client->channel!=-1) { log_message( log_module, MSG_DEBUG,"We remove the client from the channel \"%s\"\n",channels[client->channel].name); if(client->chan_prev==NULL) { channels[client->channel].clients=client->chan_next; if(channels[client->channel].clients) channels[client->channel].clients->chan_prev=NULL; } else { client->chan_prev->chan_next=client->chan_next; if(client->chan_next) client->chan_next->chan_prev=client->chan_prev; } } if(client->buffer) free(client->buffer); unicast_queue_clear(&client->queue); free(client); unicast_vars->client_number--; return 0; } /** @brief This function add an unicast client to a channel * * @param client the client * @param channel the channel */ int channel_add_unicast_client(unicast_client_t *client,mumudvb_channel_t *channel) { unicast_client_t *last_client; int iRet; log_message( log_module, MSG_INFO,"We add the client %s:%d to the channel \"%s\"\n",inet_ntoa(client->SocketAddr.sin_addr), client->SocketAddr.sin_port,channel->name); iRet=write(client->Socket,HTTP_OK_REPLY, strlen(HTTP_OK_REPLY)); if(iRet!=strlen(HTTP_OK_REPLY)) { log_message( log_module, MSG_INFO,"Error when sending the HTTP reply\n"); return -1; } client->chan_next=NULL; if(channel->clients==NULL) { channel->clients=client; client->chan_prev=NULL; } else { last_client=channel->clients; while(last_client->chan_next!=NULL) last_client=last_client->chan_next; last_client->chan_next=client; client->chan_prev=last_client; } return 0; } /** @brief Delete all the clients * * @param unicast_vars the unicast parameters * @param channels : the channels structure */ void unicast_freeing(unicast_parameters_t *unicast_vars, mumudvb_channel_t *channels) { unicast_client_t *actual_client; unicast_client_t *next_client; for(actual_client=unicast_vars->clients; actual_client != NULL; actual_client=next_client) { next_client= actual_client->next; unicast_del_client(unicast_vars, actual_client, channels); } } mumudvb-1.7.1/src/unicast_http.c000066400000000000000000001727551177353207000166650ustar00rootroot00000000000000/* * MuMuDVB - Stream a DVB transport stream. * * (C) 2009-2011 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief File for HTTP unicast * @author Brice DUBOST * @date 2009-2011 */ /*********************** Todo list * implement a measurement of the "load" -- almost done with the traffic display * implement channel by name * implement monitoring features ***********************/ //in order to use asprintf (extension gnu) #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "unicast_http.h" #include "unicast_queue.h" #include "mumudvb.h" #include "errors.h" #include "log.h" #include "dvb.h" #include "tune.h" #include "autoconf.h" #ifdef ENABLE_CAM_SUPPORT #include "cam.h" #endif extern int Interrupted; static char *log_module="Unicast : "; //from unicast_client.c unicast_client_t *unicast_add_client(unicast_parameters_t *unicast_vars, struct sockaddr_in SocketAddr, int Socket); int channel_add_unicast_client(unicast_client_t *client,mumudvb_channel_t *channel); unicast_client_t *unicast_accept_connection(unicast_parameters_t *unicast_vars, int socketIn); void unicast_close_connection(unicast_parameters_t *unicast_vars, fds_t *fds, int Socket, mumudvb_channel_t *channels); int unicast_send_streamed_channels_list (int number_of_channels, mumudvb_channel_t *channels, int Socket, char *host); int unicast_send_play_list_unicast (int number_of_channels, mumudvb_channel_t *channels, int Socket, int unicast_portOut, int perport); int unicast_send_play_list_multicast (int number_of_channels, mumudvb_channel_t* channels, int Socket, int vlc); int unicast_send_streamed_channels_list_js (int number_of_channels, mumudvb_channel_t *channels, int Socket); int unicast_send_signal_power_js (int Socket, strength_parameters_t *strengthparams); int unicast_send_channel_traffic_js (int number_of_channels, mumudvb_channel_t *channels, int Socket); int unicast_send_xml_state (int number_of_channels, mumudvb_channel_t* channels, int Socket, strength_parameters_t* strengthparams, autoconf_parameters_t* autoconf_vars, void* cam_vars_v); int unicast_send_cam_menu (int Socket, void *cam_vars); int unicast_send_cam_action (int Socket, char *Key, void *cam_vars); int unicast_handle_message(unicast_parameters_t* unicast_vars, unicast_client_t* client, mumudvb_channel_t* channels, int number_of_channels, strength_parameters_t* strengthparams, autoconf_parameters_t* autoconf_vars, void* cam_vars); #define REPLY_HEADER 0 #define REPLY_BODY 1 #define REPLY_SIZE_STEP 256 struct unicast_reply { char* buffer_header; char* buffer_body; int length_header; int length_body; int used_header; int used_body; int type; }; static struct unicast_reply* unicast_reply_init(); static int unicast_reply_free(struct unicast_reply *reply); static int unicast_reply_write(struct unicast_reply *reply, const char* msg, ...); static int unicast_reply_send(struct unicast_reply *reply, int socket, int code, const char* content_type); /**@todo : deal with the RTP over http case ie implement RTSP*/ /** @brief Read a line of the configuration file to check if there is a unicast parameter * * @param unicast_vars the unicast parameters * @param substring The currrent line */ int read_unicast_configuration(unicast_parameters_t *unicast_vars, mumudvb_channel_t *current_channel, int ip_ok, char *substring) { char delimiteurs[] = CONFIG_FILE_SEPARATOR; if (!strcmp (substring, "ip_http")) { substring = strtok (NULL, delimiteurs); if(strlen(substring)>19) { log_message( log_module, MSG_ERROR, "The Ip address %s is too long.\n", substring); exit(ERROR_CONF); } sscanf (substring, "%s\n", unicast_vars->ipOut); if(unicast_vars->ipOut) { if(unicast_vars->unicast==0) { log_message( log_module, MSG_WARN,"You should use the option \"unicast\" to activate unicast instead of ip_http\n"); unicast_vars->unicast=1; log_message( log_module, MSG_WARN,"You have enabled the support for HTTP Unicast. This feature is quite youg, please report any bug/comment\n"); } } } else if (!strcmp (substring, "unicast")) { substring = strtok (NULL, delimiteurs); unicast_vars->unicast = atoi (substring); if(unicast_vars->unicast) { log_message( log_module, MSG_WARN, "You have enabled the support for HTTP Unicast. This feature is quite youg, please report any bug/comment\n"); } } else if (!strcmp (substring, "unicast_consecutive_errors_timeout")) { substring = strtok (NULL, delimiteurs); unicast_vars->consecutive_errors_timeout = atoi (substring); if(unicast_vars->consecutive_errors_timeout<=0) log_message( log_module, MSG_WARN, "Warning : You have deactivated the unicast timeout for disconnecting clients, this can lead to an accumulation of zombie clients, this is unadvised, prefer a long timeout\n"); } else if (!strcmp (substring, "unicast_max_clients")) { substring = strtok (NULL, delimiteurs); unicast_vars->max_clients = atoi (substring); } else if (!strcmp (substring, "unicast_queue_size")) { substring = strtok (NULL, delimiteurs); unicast_vars->queue_max_size = atoi (substring); } else if (!strcmp (substring, "port_http")) { substring = strtok (NULL, ""); if((strchr(substring,'*')!=NULL)||(strchr(substring,'+')!=NULL)||(strchr(substring,'%')!=NULL)) { unicast_vars->portOut_str=malloc(sizeof(char)*(strlen(substring)+1)); strcpy(unicast_vars->portOut_str,substring); } else unicast_vars->portOut = atoi (substring); } else if (!strcmp (substring, "unicast_port")) { if ( ip_ok == 0) { log_message( log_module, MSG_ERROR, "unicast_port : You have to start a channel first (using ip= or channel_next)\n"); exit(ERROR_CONF); } substring = strtok (NULL, delimiteurs); current_channel->unicast_port = atoi (substring); } else if (!strcmp (substring, "socket_sendbuf_size")) { substring = strtok (NULL, delimiteurs); unicast_vars->socket_sendbuf_size = atoi (substring); } else if (!strcmp (substring, "flush_on_eagain")) { substring = strtok (NULL, delimiteurs); unicast_vars->flush_on_eagain = atoi (substring); if(unicast_vars->flush_on_eagain) log_message( log_module, MSG_INFO, "The unicast data WILL be dropped on eagain errors\n"); } else return 0; //Nothing concerning tuning, we return 0 to explore the other possibilities return 1;//We found something for tuning, we tell main to go for the next line } /** @brief Create a listening socket and add it to the list of polling file descriptors if success * * * */ int unicast_create_listening_socket(int socket_type, int socket_channel, char *ipOut, int port, struct sockaddr_in *sIn, int *socketIn, fds_t *fds, unicast_parameters_t *unicast_vars) { *socketIn= makeTCPclientsocket(ipOut, port, sIn); //We add them to the poll descriptors if(*socketIn>0) { fds->pfdsnum++; log_message( log_module, MSG_DEBUG, "unicast : fds->pfdsnum : %d\n", fds->pfdsnum); fds->pfds=realloc(fds->pfds,(fds->pfdsnum+1)*sizeof(struct pollfd)); if (fds->pfds==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } fds->pfds[fds->pfdsnum-1].fd = *socketIn; fds->pfds[fds->pfdsnum-1].events = POLLIN | POLLPRI; fds->pfds[fds->pfdsnum-1].revents = 0; fds->pfds[fds->pfdsnum].fd = 0; fds->pfds[fds->pfdsnum].events = POLLIN | POLLPRI; fds->pfds[fds->pfdsnum].revents = 0; //Information about the descriptor unicast_vars->fd_info=realloc(unicast_vars->fd_info,(fds->pfdsnum)*sizeof(unicast_fd_info_t)); if (unicast_vars->fd_info==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } //Master connection unicast_vars->fd_info[fds->pfdsnum-1].type=socket_type; unicast_vars->fd_info[fds->pfdsnum-1].channel=socket_channel; unicast_vars->fd_info[fds->pfdsnum-1].client=NULL; } else { log_message( log_module, MSG_WARN, "Problem creating the socket %s:%d : %s\n",ipOut,port,strerror(errno) ); return -1; } return 0; } /** @brief Handle an "event" on the unicast file descriptors * If the event is on an already open client connection, it handle the message * If the event is on the master connection, it accepts the new connection * If the event is on a channel specific socket, it accepts the new connection and starts streaming * */ int unicast_handle_fd_event(unicast_parameters_t *unicast_vars, fds_t *fds, mumudvb_channel_t *channels, int number_of_channels, strength_parameters_t *strengthparams, autoconf_parameters_t *autoconf_vars, void *cam_vars) { int iRet; //We look what happened for which connection int actual_fd; for(actual_fd=1;actual_fdpfdsnum;actual_fd++) { iRet=0; if((fds->pfds[actual_fd].revents&POLLHUP)&&(unicast_vars->fd_info[actual_fd].type==UNICAST_CLIENT)) { log_message( log_module, MSG_DEBUG,"We've got a POLLHUP. Actual_fd %d socket %d we close the connection \n", actual_fd, fds->pfds[actual_fd].fd ); unicast_close_connection(unicast_vars,fds,fds->pfds[actual_fd].fd,channels); //We check if we hage to parse fds->pfds[actual_fd].revents (the last fd moved to the actual one) if(fds->pfds[actual_fd].revents) actual_fd--;//Yes, we force the loop to see it } if((fds->pfds[actual_fd].revents&POLLIN)||(fds->pfds[actual_fd].revents&POLLPRI)) { if((unicast_vars->fd_info[actual_fd].type==UNICAST_MASTER)|| (unicast_vars->fd_info[actual_fd].type==UNICAST_LISTEN_CHANNEL)) { //Event on the master connection or listenin channel //New connection, we accept the connection log_message( log_module, MSG_FLOOD,"New client\n"); int tempSocket; unicast_client_t *tempClient; //we accept the incoming connection tempClient=unicast_accept_connection(unicast_vars, fds->pfds[actual_fd].fd); if(tempClient!=NULL) { tempSocket=tempClient->Socket; fds->pfdsnum++; fds->pfds=realloc(fds->pfds,(fds->pfdsnum+1)*sizeof(struct pollfd)); if (fds->pfds==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } //We poll the new socket fds->pfds[fds->pfdsnum-1].fd = tempSocket; fds->pfds[fds->pfdsnum-1].events = POLLIN | POLLPRI | POLLHUP; //We also poll the deconnections fds->pfds[fds->pfdsnum-1].revents = 0; fds->pfds[fds->pfdsnum].fd = 0; fds->pfds[fds->pfdsnum].events = POLLIN | POLLPRI; fds->pfds[fds->pfdsnum].revents = 0; //Information about the descriptor unicast_vars->fd_info=realloc(unicast_vars->fd_info,(fds->pfdsnum)*sizeof(unicast_fd_info_t)); if (unicast_vars->fd_info==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; return -1; } //client connection unicast_vars->fd_info[fds->pfdsnum-1].type=UNICAST_CLIENT; unicast_vars->fd_info[fds->pfdsnum-1].channel=-1; unicast_vars->fd_info[fds->pfdsnum-1].client=tempClient; log_message( log_module, MSG_FLOOD,"Number of clients : %d\n", unicast_vars->client_number); if(unicast_vars->fd_info[actual_fd].type==UNICAST_LISTEN_CHANNEL) { //Event on a channel connection, we open a new socket for this client and //we store the wanted channel for when we will get the GET log_message( log_module, MSG_DEBUG,"Connection on a channel socket the client will get the channel %d\n", unicast_vars->fd_info[actual_fd].channel); tempClient->askedChannel=unicast_vars->fd_info[actual_fd].channel; } } } else if(unicast_vars->fd_info[actual_fd].type==UNICAST_CLIENT) { //Event on a client connectio i.e. the client asked something log_message( log_module, MSG_FLOOD,"New message for socket %d\n", fds->pfds[actual_fd].fd); iRet=unicast_handle_message(unicast_vars,unicast_vars->fd_info[actual_fd].client, channels, number_of_channels, strengthparams, autoconf_vars, cam_vars); if (iRet==-2 ) //iRet==-2 --> 0 received data or error, we close the connection { unicast_close_connection(unicast_vars,fds,fds->pfds[actual_fd].fd,channels); //We check if we hage to parse fds->pfds[actual_fd].revents (the last fd moved to the actual one) if(fds->pfds[actual_fd].revents) actual_fd--;//Yes, we force the loop to see it again } } else { log_message( log_module, MSG_WARN,"File descriptor with bad type, please contact\n Debug information : actual_fd %d unicast_vars->fd_info[actual_fd].type %d\n", actual_fd, unicast_vars->fd_info[actual_fd].type); } } } return 0; } /** @brief Accept an incoming connection * * * @param unicast_vars the unicast parameters * @param socketIn the socket on wich the connection was made */ unicast_client_t *unicast_accept_connection(unicast_parameters_t *unicast_vars, int socketIn) { unsigned int l; int tempSocket; unicast_client_t *tempClient; struct sockaddr_in tempSocketAddrIn; l = sizeof(struct sockaddr); tempSocket = accept(socketIn, (struct sockaddr *) &tempSocketAddrIn, &l); if (tempSocket < 0 ) { log_message( log_module, MSG_WARN,"Error when accepting the incoming connection : %s\n", strerror(errno)); return NULL; } struct sockaddr_in tempSocketAddr; l = sizeof(struct sockaddr); getsockname(tempSocket, (struct sockaddr *) &tempSocketAddr, &l); log_message( log_module, MSG_FLOOD,"New connection from %s:%d to %s:%d \n",inet_ntoa(tempSocketAddrIn.sin_addr), tempSocketAddrIn.sin_port,inet_ntoa(tempSocketAddr.sin_addr), tempSocketAddr.sin_port); //Now we set this socket to be non blocking because we poll it int flags; flags = fcntl(tempSocket, F_GETFL, 0); flags |= O_NONBLOCK; if (fcntl(tempSocket, F_SETFL, flags) < 0) { log_message( log_module, MSG_ERROR,"Set non blocking failed : %s\n",strerror(errno)); return NULL; } /* if the maximum number of clients is reached, raise a temporary error*/ if((unicast_vars->max_clients>0)&&(unicast_vars->client_number>=unicast_vars->max_clients)) { int iRet; log_message( log_module, MSG_INFO,"Too many clients connected, we raise an error to %s\n", inet_ntoa(tempSocketAddrIn.sin_addr)); iRet=write(tempSocket,HTTP_503_REPLY, strlen(HTTP_503_REPLY)); if(iRet<0) log_message( log_module, MSG_INFO,"Error writing to %s\n", inet_ntoa(tempSocketAddrIn.sin_addr)); close(tempSocket); return NULL; } tempClient=unicast_add_client(unicast_vars, tempSocketAddrIn, tempSocket); if( tempClient == NULL) { //We cannot create the client, we close the socket cleanly close(tempSocket); return NULL; } return tempClient; } /** @brief Close an unicast connection and delete the client * * @param unicast_vars the unicast parameters * @param fds The polling file descriptors * @param Socket The socket of the client we want to disconnect * @param channels The channel list */ void unicast_close_connection(unicast_parameters_t *unicast_vars, fds_t *fds, int Socket, mumudvb_channel_t *channels) { int actual_fd; actual_fd=0; //We find the FD correspondig to this client while((actual_fdpfdsnum) && (fds->pfds[actual_fd].fd!=Socket)) actual_fd++; if(actual_fd==fds->pfdsnum) { log_message( log_module, MSG_ERROR,"close connection : we did't find the file descriptor this should never happend, please contact\n"); actual_fd=0; //We find the FD correspondig to this client while(actual_fdpfdsnum) { log_message( log_module, MSG_ERROR,"fds->pfds[actual_fd].fd %d Socket %d \n", fds->pfds[actual_fd].fd,Socket); actual_fd++; } return; } log_message( log_module, MSG_FLOOD,"We close the connection\n"); //We delete the client unicast_del_client(unicast_vars, unicast_vars->fd_info[actual_fd].client, channels); //We move the last fd to the actual/deleted one, and decrease the number of fds by one fds->pfds[actual_fd].fd = fds->pfds[fds->pfdsnum-1].fd; fds->pfds[actual_fd].events = fds->pfds[fds->pfdsnum-1].events; fds->pfds[actual_fd].revents = fds->pfds[fds->pfdsnum-1].revents; //we move the file descriptor information unicast_vars->fd_info[actual_fd] = unicast_vars->fd_info[fds->pfdsnum-1]; //last one set to 0 for poll() fds->pfds[fds->pfdsnum-1].fd=0; fds->pfds[fds->pfdsnum-1].events=POLLIN|POLLPRI; fds->pfds[fds->pfdsnum-1].revents=0; //We clear it to avoid nasty bugs ... fds->pfdsnum--; fds->pfds=realloc(fds->pfds,(fds->pfdsnum+1)*sizeof(struct pollfd)); if (fds->pfds==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; } unicast_vars->fd_info=realloc(unicast_vars->fd_info,(fds->pfdsnum)*sizeof(unicast_fd_info_t)); if (unicast_vars->fd_info==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); Interrupted=ERROR_MEMORY<<8; } log_message( log_module, MSG_FLOOD,"Number of clients : %d\n", unicast_vars->client_number); } /** @brief Deal with an incoming message on the unicast client connection * This function will store and answer the HTTP requests * * * @param unicast_vars the unicast parameters * @param client The client from which the message was received * @param channels the channel array * @param number_of_channels quite explicit ... */ int unicast_handle_message(unicast_parameters_t *unicast_vars, unicast_client_t *client, mumudvb_channel_t *channels, int number_of_channels, strength_parameters_t *strengthparams, autoconf_parameters_t *autoconf_vars, void *cam_vars) { int received_len; (void) unicast_vars; /************ auto increasing buffer to receive the message **************/ if((client->buffersize-client->bufferpos)buffer=realloc(client->buffer,(client->buffersize + RECV_BUFFER_MULTIPLE+1)*sizeof(char)); //the +1 if for the \0 at the end if(client->buffer==NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc for the client buffer : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); client->buffersize=0; client->bufferpos=0; return -1; } memset (client->buffer+client->buffersize, 0, RECV_BUFFER_MULTIPLE*sizeof(char)); //We fill the buffer with zeros to be sure client->buffersize += RECV_BUFFER_MULTIPLE; } received_len=recv(client->Socket, client->buffer+client->bufferpos, RECV_BUFFER_MULTIPLE, 0); if(received_len>0) { if(client->bufferpos==0) log_message( log_module, MSG_FLOOD,"beginning of buffer %c%c%c%c%c\n",client->buffer[0],client->buffer[1],client->buffer[2],client->buffer[3],client->buffer[4]); client->bufferpos+=received_len; log_message( log_module, MSG_FLOOD,"We received %d, buffer len %d new buffer pos %d\n",received_len,client->buffersize, client->bufferpos); } if(received_len==-1) { log_message( log_module, MSG_ERROR,"Problem with recv : %s\n",strerror(errno)); return -1; } if(received_len==0) return -2; //To say to the main program to close the connection /***************** Now we parse the message to see if something was asked *****************/ client->buffer[client->buffersize]='\0'; //For avoiding strlen to look too far (other option is to use the gnu extension strnlen) //We search for the end of the HTTP request if(strlen(client->buffer)>5 && strstr(client->buffer, "\n\r\n\0")) { int pos,err404; char *substring=NULL; int requested_channel; int iRet; requested_channel=0; pos=0; err404=0; struct unicast_reply* reply=NULL; log_message( log_module, MSG_FLOOD,"End of HTTP request, we parse it\n"); if(strstr(client->buffer,"GET ")==client->buffer) { //to implement : //Information ??? //GET /monitor/??? pos=4; /* preselected channels via the port of the connection */ //if the client have already an asked channel we don't parse the GET if(client->askedChannel!=-1) { requested_channel=client->askedChannel+1; //+1 because requested channel starts at 1 and asked channel starts at 0 log_message( log_module, MSG_DEBUG,"Channel by socket, number %d\n",requested_channel); client->askedChannel=-1; } //Channel by number //GET /bynumber/channelnumber else if(strstr(client->buffer +pos ,"/bynumber/")==(client->buffer +pos)) { if(client->channel!=-1) { log_message( log_module, MSG_INFO,"A channel (%d) is already streamed to this client, it shouldn't ask for a new one without closing the connection, error 501\n",client->channel); iRet=write(client->Socket,HTTP_501_REPLY, strlen(HTTP_501_REPLY)); if(iRet<0) log_message( log_module, MSG_INFO,"Error writing reply\n"); return -2; //to delete the client } pos+=strlen("/bynumber/"); substring = strtok (client->buffer+pos, " "); if(substring == NULL) err404=1; else { requested_channel=atoi(substring); if(requested_channel && requested_channel<=number_of_channels) log_message( log_module, MSG_DEBUG,"Channel by number, number %d\n",requested_channel); else { log_message( log_module, MSG_INFO,"Channel by number, number %d out of range\n",requested_channel); err404=1; requested_channel=0; } } } //Channel by autoconf_sid_list //GET /bysid/sid else if(strstr(client->buffer +pos ,"/bysid/")==(client->buffer +pos)) { if(client->channel!=-1) { log_message( log_module, MSG_INFO,"A channel (%d) is already streamed to this client, it shouldn't ask for a new one without closing the connection, error 501\n",client->channel); iRet=write(client->Socket,HTTP_501_REPLY, strlen(HTTP_501_REPLY)); //iRet is to make the copiler happy we will close the connection anyways return -2; //to delete the client } pos+=strlen("/bysid/"); substring = strtok (client->buffer+pos, " "); if(substring == NULL) err404=1; else { int requested_sid; requested_sid=atoi(substring); for(int current_channel=0; current_channelbuffer +pos ,"/byname/")==(client->buffer +pos)) { if(client->channel!=-1) { log_message( log_module, MSG_INFO,"A channel is already streamed to this client, it shouldn't ask for a new one without closing the connection, error 501\n"); iRet=write(client->Socket,HTTP_501_REPLY, strlen(HTTP_501_REPLY));//iRet is to make the copiler happy we will close the connection anyways return -2; //to delete the client } pos+=strlen("/byname/"); log_message( log_module, MSG_DEBUG,"Channel by number\n"); substring = strtok (client->buffer+pos, " "); if(substring == NULL) err404=1; else { log_message( log_module, MSG_DEBUG,"Channel by name, name %s\n",substring); //search the channel err404=1;//Temporary /** @todo implement the search without the spaces*/ } } //Channels list else if(strstr(client->buffer +pos ,"/channels_list.html ")==(client->buffer +pos)) { //We get the host name if availaible char *hoststr; hoststr=strstr(client->buffer ,"Host: "); if(hoststr) { substring = strtok (hoststr+6, "\r"); } else substring=NULL; log_message( log_module, MSG_DETAIL,"Channel list\n"); unicast_send_streamed_channels_list (number_of_channels, channels, client->Socket, substring); return -2; //We close the connection afterwards } //playlist, m3u else if(strstr(client->buffer +pos ,"/playlist.m3u ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"play list\n"); unicast_send_play_list_unicast (number_of_channels, channels, client->Socket, unicast_vars->portOut, 0 ); return -2; //We close the connection afterwards } //playlist, m3u else if(strstr(client->buffer +pos ,"/playlist_port.m3u ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"play list\n"); unicast_send_play_list_unicast (number_of_channels, channels, client->Socket, unicast_vars->portOut, 1 ); return -2; //We close the connection afterwards } else if(strstr(client->buffer +pos ,"/playlist_multicast.m3u ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"play list\n"); unicast_send_play_list_multicast (number_of_channels, channels, client->Socket, 0 ); return -2; //We close the connection afterwards } else if(strstr(client->buffer +pos ,"/playlist_multicast_vlc.m3u ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"play list\n"); unicast_send_play_list_multicast (number_of_channels, channels, client->Socket, 1 ); return -2; //We close the connection afterwards } //statistics, text version else if(strstr(client->buffer +pos ,"/channels_list.json ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"Channel list Json\n"); unicast_send_streamed_channels_list_js (number_of_channels, channels, client->Socket); return -2; //We close the connection afterwards } else if(strstr(client->buffer +pos ,"/monitor/signal_power.json ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"Signal power json\n"); unicast_send_signal_power_js(client->Socket, strengthparams); return -2; //We close the connection afterwards } else if(strstr(client->buffer +pos ,"/monitor/channels_traffic.json ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"Channel traffic json\n"); unicast_send_channel_traffic_js(number_of_channels, channels, client->Socket); return -2; //We close the connection afterwards } else if(strstr(client->buffer +pos ,"/monitor/state.xml ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"HTTP request for XML State\n"); unicast_send_xml_state(number_of_channels, channels, client->Socket, strengthparams, autoconf_vars, cam_vars); return -2; //We close the connection afterwards } else if(strstr(client->buffer +pos ,"/cam/menu.xml ")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"HTTP request for CAM menu display \n"); unicast_send_cam_menu(client->Socket, cam_vars); return -2; //We close the connection afterwards } else if(strstr(client->buffer +pos ,"/cam/action.xml?key=")==(client->buffer +pos)) { log_message( log_module, MSG_DETAIL,"HTTP request for CAM menu action\n"); pos+=strlen("/cam/action.xml?key="); unicast_send_cam_action(client->Socket,client->buffer+pos, cam_vars); return -2; //We close the connection afterwards } //Not implemented path --> 404 else err404=1; if(err404) { log_message( log_module, MSG_INFO,"Path not found i.e. 404\n"); reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Error when creating the HTTP reply\n"); return -2; } unicast_reply_write(reply, HTTP_404_REPLY_HTML, VERSION); unicast_reply_send(reply, client->Socket, 404, "text/html"); if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Error when releasing the HTTP reply after sendinf it\n"); return -2; } return -2; //to delete the client } //We have found a channel, we add the client if(requested_channel) { if(!channel_add_unicast_client(client,&channels[requested_channel-1])) client->channel=requested_channel-1; else return -2; } } else { //We don't implement this http method, but if the client is already connected, we keep the connection if(client->channel==-1) { log_message( log_module, MSG_INFO,"Unhandled HTTP method : \"%s\", error 501\n", strtok (client->buffer+pos, " ")); iRet=write(client->Socket,HTTP_501_REPLY, strlen(HTTP_501_REPLY));//iRet is to make the copiler happy we will close the connection anyways return -2; //to delete the client } else { log_message( log_module, MSG_INFO,"Unhandled HTTP method : \"%s\", error 501 but we keep the client connected\n", strtok (client->buffer+pos, " ")); iRet=write(client->Socket,HTTP_501_REPLY, strlen(HTTP_501_REPLY));//iRet is to make the copiler happy we will close the connection anyways return 0; } } //We don't need the buffer anymore free(client->buffer); client->buffer=NULL; client->bufferpos=0; client->buffersize=0; } return 0; } ////////////////// // HTTP Toolbox // ////////////////// /** @brief Init reply structure * */ struct unicast_reply* unicast_reply_init() { struct unicast_reply* reply = malloc(sizeof (struct unicast_reply)); if (NULL == reply) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return NULL; } reply->buffer_header = malloc(REPLY_SIZE_STEP * sizeof (char)); if (NULL == reply->buffer_header) { free(reply); log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return NULL; } reply->length_header = REPLY_SIZE_STEP; reply->used_header = 0; reply->buffer_body = malloc(REPLY_SIZE_STEP * sizeof (char)); if (NULL == reply->buffer_body) { free(reply->buffer_header); free(reply); log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return NULL; } reply->length_body = REPLY_SIZE_STEP; reply->used_body = 0; reply->type = REPLY_BODY; return reply; } /** @brief Release the reply structure * */ int unicast_reply_free(struct unicast_reply *reply) { if (NULL == reply) return 1; if ((NULL == reply->buffer_header)&&(NULL == reply->buffer_body)) return 1; if(reply->buffer_header != NULL) free(reply->buffer_header); if(reply->buffer_body != NULL) free(reply->buffer_body); free(reply); return 0; } /** @brief Write data in a buffer using the same syntax that printf() * * auto-realloc buffer if needed */ int unicast_reply_write(struct unicast_reply *reply, const char* msg, ...) { char **buffer; char *temp_buffer; int *length; int *used; buffer=NULL; va_list args; if (NULL == msg) return -1; switch(reply->type) { case REPLY_HEADER: buffer=&reply->buffer_header; length=&reply->length_header; used=&reply->used_header; break; case REPLY_BODY: buffer=&reply->buffer_body; length=&reply->length_body; used=&reply->used_body; break; default: log_message( log_module, MSG_WARN,"unicast_reply_write with wrong type, please contact\n"); return -1; } va_start(args, msg); int estimated_len = vsnprintf(NULL, 0, msg, args); /* !! imply gcc -std=c99 */ //Since vsnprintf put the mess we reinitiate the args va_end(args); va_start(args, msg); // Must add 1 byte more for the terminating zero (not counted) while (*length - *used < estimated_len + 1) { temp_buffer = realloc(*buffer, *length + REPLY_SIZE_STEP); if(temp_buffer == NULL) { log_message( log_module, MSG_ERROR,"Problem with realloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } *buffer=temp_buffer; *length += REPLY_SIZE_STEP; } int real_len = vsnprintf(*buffer+*used, *length - *used, msg, args); if (real_len != estimated_len) { log_message( log_module, MSG_WARN,"Error when writing the HTTP reply\n"); } *used += real_len; va_end(args); return 0; } /** @brief Dump the filled buffer on the socket adding HTTP header informations */ int unicast_reply_send(struct unicast_reply *reply, int socket, int code, const char* content_type) { //we add the header information reply->type = REPLY_HEADER; unicast_reply_write(reply, "HTTP/1.0 "); switch(code) { case 200: unicast_reply_write(reply, "200 OK\r\n"); break; case 404: unicast_reply_write(reply, "404 Not found\r\n"); break; default: log_message( log_module, MSG_ERROR,"reply send with bad code please contact\n"); return 0; } unicast_reply_write(reply, "Server: mumudvb/" VERSION "\r\n"); unicast_reply_write(reply, "Content-type: %s\r\n", content_type); unicast_reply_write(reply, "Content-length: %d\r\n", reply->used_body); unicast_reply_write(reply, "\r\n"); /* end header */ //we merge the header and the body reply->buffer_header = realloc(reply->buffer_header, reply->used_header+reply->used_body); memcpy(&reply->buffer_header[reply->used_header],reply->buffer_body,sizeof(char)*reply->used_body); reply->used_header+=reply->used_body; //now we write the data int size = write(socket, reply->buffer_header, reply->used_header); return size; } ////////////////////// // End HTTP Toolbox // ////////////////////// /** @brief Send a basic html file containig the list of streamed channels * * @param number_of_channels the number of channels * @param channels the channels array * @param Socket the socket on wich the information have to be sent * @param host The server ip address/name (got in the HTTP GET request) */ int unicast_send_streamed_channels_list (int number_of_channels, mumudvb_channel_t *channels, int Socket, char *host) { struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Error when creating the HTTP reply\n"); return -1; } unicast_reply_write(reply, HTTP_CHANNELS_REPLY_START); for (int curr_channel = 0; curr_channel < number_of_channels; curr_channel++) if (channels[curr_channel].streamed_channel) { if(host) unicast_reply_write(reply, "Channel number %d : %s
Unicast link : http://%s/bysid/%d
Multicast ip : %s:%d

\r\n", curr_channel+1, channels[curr_channel].name, host,channels[curr_channel].service_id, host,channels[curr_channel].service_id, channels[curr_channel].ip4Out,channels[curr_channel].portOut); else unicast_reply_write(reply, "Channel number %d : \"%s\"
Multicast ip : %s:%d

\r\n",curr_channel+1,channels[curr_channel].name,channels[curr_channel].ip4Out,channels[curr_channel].portOut); } unicast_reply_write(reply, HTTP_CHANNELS_REPLY_END); unicast_reply_send(reply, Socket, 200, "text/html"); if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } /** @brief Send a basic text file containig the playlist * * @param number_of_channels the number of channels * @param channels the channels array * @param Socket the socket on wich the information have to be sent * @param perport says if the channel have to be given by the url /bysid or by their port */ int unicast_send_play_list_unicast (int number_of_channels, mumudvb_channel_t *channels, int Socket, int unicast_portOut, int perport) { int curr_channel; struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Error when creating the HTTP reply\n"); return -1; } //We get the ip address on which the client is connected struct sockaddr_in tempSocketAddr; unsigned int l; l = sizeof(struct sockaddr); getsockname(Socket, (struct sockaddr *) &tempSocketAddr, &l); //we write the playlist unicast_reply_write(reply, "#EXTM3U\r\n"); //"#EXTINF:0,title\r\nURL" for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) if (channels[curr_channel].streamed_channel) { if(!perport) { unicast_reply_write(reply, "#EXTINF:0,%s\r\nhttp://%s:%d/bysid/%d\r\n", channels[curr_channel].name, inet_ntoa(tempSocketAddr.sin_addr) , unicast_portOut , channels[curr_channel].service_id); } else if(channels[curr_channel].unicast_port) { unicast_reply_write(reply, "#EXTINF:0,%s\r\nhttp://%s:%d/\r\n", channels[curr_channel].name, inet_ntoa(tempSocketAddr.sin_addr) , channels[curr_channel].unicast_port); } } unicast_reply_send(reply, Socket, 200, "audio/x-mpegurl"); if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } /** @brief Send a basic text file containig the playlist * * @param number_of_channels the number of channels * @param channels the channels array * @param Socket the socket on wich the information have to be sent */ int unicast_send_play_list_multicast (int number_of_channels, mumudvb_channel_t *channels, int Socket, int vlc) { int curr_channel; char urlheader[4]; char vlcchar[2]; extern multicast_parameters_t multicast_vars; struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Error when creating the HTTP reply\n"); return -1; } unicast_reply_write(reply, "#EXTM3U\r\n"); if(vlc) strcpy(vlcchar,"@"); else vlcchar[0]='\0'; if(multicast_vars.rtp_header) strcpy(urlheader,"rtp"); else strcpy(urlheader,"udp"); //"#EXTINF:0,title\r\nURL" for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) if (channels[curr_channel].streamed_channel) { unicast_reply_write(reply, "#EXTINF:0,%s\r\n%s://%s%s:%d\r\n", channels[curr_channel].name, urlheader, vlcchar, channels[curr_channel].ip4Out, channels[curr_channel].portOut); } unicast_reply_send(reply, Socket, 200, "audio/x-mpegurl"); if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } /** @brief Send a basic JSON file containig the list of streamed channels * * @param number_of_channels the number of channels * @param channels the channels array * @param Socket the socket on wich the information have to be sent */ int unicast_send_streamed_channels_list_js (int number_of_channels, mumudvb_channel_t *channels, int Socket) { int curr_channel; unicast_client_t *unicast_client=NULL; int clients=0; struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Error when creating the HTTP reply\n"); return -1; } unicast_reply_write(reply, "["); for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) { clients=0; unicast_client=channels[curr_channel].clients; while(unicast_client!=NULL) { unicast_client=unicast_client->chan_next; clients++; } unicast_reply_write(reply, "{\"number\":%d, \"lcn\":%d, \"name\":\"%s\", \"sap_group\":\"%s\", \"ip_multicast\":\"%s\", \"port_multicast\":%d, \"num_clients\":%d, \"scrambling_ratio\":%d, \"is_up\":%d,", curr_channel+1, channels[curr_channel].logical_channel_number, channels[curr_channel].name, channels[curr_channel].sap_group, channels[curr_channel].ip4Out, channels[curr_channel].portOut, clients, channels[curr_channel].ratio_scrambled, channels[curr_channel].streamed_channel); unicast_reply_write(reply, "\"unicast_port\":%d, \"service_id\":%d, \"service_type\":\"%s\", \"pids_num\":%d, \n", channels[curr_channel].unicast_port, channels[curr_channel].service_id, service_type_to_str(channels[curr_channel].channel_type), channels[curr_channel].num_pids); unicast_reply_write(reply, "\"pids\":["); for(int i=0;iused_body -= 2; // dirty hack to erase the last comma unicast_reply_write(reply, "]"); unicast_reply_write(reply, "},\n"); } reply->used_body -= 2; // dirty hack to erase the last comma unicast_reply_write(reply, "]\n"); unicast_reply_send(reply, Socket, 200, "application/json"); if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } /** @brief Send a basic JSON file containig the reception power * * @param Socket the socket on wich the information have to be sent */ int unicast_send_signal_power_js (int Socket, strength_parameters_t *strengthparams) { struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Error when creating the HTTP reply\n"); return -1; } unicast_reply_write(reply, "{\"ber\":%d, \"strength\":%d, \"snr\":%d, \"ub\":%d}\n", strengthparams->ber,strengthparams->strength,strengthparams->snr,strengthparams->ub); unicast_reply_send(reply, Socket, 200, "application/json"); if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } /** @brief Send a basic JSON file containig the channel traffic * * @param number_of_channels the number of channels * @param channels the channels array * @param Socket the socket on wich the information have to be sent */ int unicast_send_channel_traffic_js (int number_of_channels, mumudvb_channel_t *channels, int Socket) { int curr_channel; extern long real_start_time; struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Error when creating the HTTP reply\n"); return -1; } if ((time((time_t*)0L) - real_start_time) >= 10) //10 seconds for the traffic calculation to be done { unicast_reply_write(reply, "["); for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) unicast_reply_write(reply, "{\"number\":%d, \"name\":\"%s\", \"traffic\":%.2f},\n", curr_channel+1, channels[curr_channel].name, channels[curr_channel].traffic); reply->used_body -= 2; // dirty hack to erase the last comma unicast_reply_write(reply, "]\n"); } unicast_reply_send(reply, Socket, 200, "application/json"); if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } /** @brief Send a full XML state of the mumudvb instance * * @param number_of_channels the number of channels * @param channels the channels array * @param Socket the socket on wich the information have to be sent * @param fds the frontend device structure */ int unicast_send_xml_state (int number_of_channels, mumudvb_channel_t *channels, int Socket, strength_parameters_t *strengthparams, autoconf_parameters_t *autoconf_vars, void *cam_vars_v) { #ifndef ENABLE_CAM_SUPPORT (void) cam_vars_v; //to make compiler happy #else cam_parameters_t *cam_vars=(cam_parameters_t *)cam_vars_v; #endif // Prepare the HTTP reply struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Error when creating the HTTP reply\n"); return -1; } // UTF-8 Byte Order Mark (BOM) unicast_reply_write(reply, "\xef\xbb\xbf"); // Date time formatting time_t rawtime; time (&rawtime); char sdatetime[25]; snprintf(sdatetime,25,"%s",ctime(&rawtime)); // XML header unicast_reply_write(reply, "\n"); // Starting XML content unicast_reply_write(reply, "\n",strengthparams->tuneparams->card,strengthparams->tuneparams->tuner); // Mumudvb information unicast_reply_write(reply, "\t\n",VERSION); unicast_reply_write(reply, "\t%d\n",getpid ()); // Uptime extern long real_start_time; struct timeval tv; gettimeofday (&tv, (struct timezone *) NULL); unicast_reply_write(reply, "\t%d\n",(tv.tv_sec - real_start_time)); // Frontend setup unicast_reply_write(reply, "\t\n",strengthparams->tuneparams->fe_name); unicast_reply_write(reply, "\t%d\n",strengthparams->tuneparams->card_tuned); if (strengthparams->tuneparams->fe_type==FE_QPSK) // Do some test for always showing frequency in kHz { unicast_reply_write(reply, "\t%d\n",strengthparams->tuneparams->freq); unicast_reply_write(reply, "\t%d\n",strengthparams->tuneparams->sat_number); } else unicast_reply_write(reply, "\t%d\n",(strengthparams->tuneparams->freq)/1000); if (strengthparams->tuneparams->pol==0) unicast_reply_write(reply, "\t\n"); else unicast_reply_write(reply, "\t\n",strengthparams->tuneparams->pol); unicast_reply_write(reply, "\t%d\n",strengthparams->tuneparams->srate); // Frontend type char fetype[10]="Unkonwn"; if (strengthparams->tuneparams->fe_type==FE_OFDM) snprintf(fetype,10,"DVB-T"); if (strengthparams->tuneparams->fe_type==FE_QAM) snprintf(fetype,10,"DVB-C"); if (strengthparams->tuneparams->fe_type==FE_ATSC) snprintf(fetype,10,"ATSC"); if (strengthparams->tuneparams->fe_type==FE_QPSK) { #if DVB_API_VERSION >= 5 if (strengthparams->tuneparams->delivery_system==SYS_DVBS2) snprintf(fetype,10,"DVB-S2"); #ifdef SYS_DVBT2 else if (strengthparams->tuneparams->delivery_system==SYS_DVBT2) snprintf(fetype,10,"DVB-T2"); #endif else snprintf(fetype,10,"DVB-S"); #else snprintf(fetype,10,"DVB-S"); #endif } unicast_reply_write(reply, "\t\n",fetype); // Frontend status char SCVYL[6]="-----"; if (strengthparams->festatus & FE_HAS_SIGNAL) SCVYL[0]=83; // S if (strengthparams->festatus & FE_HAS_CARRIER) SCVYL[1]=67; // C if (strengthparams->festatus & FE_HAS_VITERBI) SCVYL[2]=86; // V if (strengthparams->festatus & FE_HAS_SYNC) SCVYL[3]=89; // Y if (strengthparams->festatus & FE_HAS_LOCK) SCVYL[4]=76; // L SCVYL[5]=0; unicast_reply_write(reply, "\t\n",SCVYL); // Frontend signal unicast_reply_write(reply, "\t%d\n",strengthparams->ber); unicast_reply_write(reply, "\t%d\n",strengthparams->strength); unicast_reply_write(reply, "\t%d\n",strengthparams->snr); unicast_reply_write(reply, "\t%d\n",strengthparams->ub); unicast_reply_write(reply, "\t%d\n",strengthparams->ts_discontinuities); // Autoconfiguration state if (autoconf_vars->autoconfiguration!=0) unicast_reply_write(reply, "\t%d\n",0); else unicast_reply_write(reply, "\t%d\n",1); // CAM information #ifdef ENABLE_CAM_SUPPORT unicast_reply_write(reply, "\t%d\n",cam_vars->cam_support); unicast_reply_write(reply, "\t%d\n",cam_vars->cam_number); unicast_reply_write(reply, "\t\n",cam_vars->cam_menu_string.string); unicast_reply_write(reply, "\t%d\n",cam_vars->ca_resource_connected); #else unicast_reply_write(reply, "\t%d\n",0); unicast_reply_write(reply, "\t%d\n",0); unicast_reply_write(reply, "\t\n"); unicast_reply_write(reply, "\t%d\n",0); #endif // Channels list int curr_channel; for (curr_channel = 0; curr_channel < number_of_channels; curr_channel++) { unicast_reply_write(reply, "\t\n",curr_channel+1,channels[curr_channel].streamed_channel); unicast_reply_write(reply, "\t\t%d\n",channels[curr_channel].logical_channel_number); unicast_reply_write(reply, "\t\t\n",channels[curr_channel].name); unicast_reply_write(reply, "\t\t\n",channels[curr_channel].channel_type,service_type_to_str(channels[curr_channel].channel_type)); if (channels[curr_channel].portOut==0) unicast_reply_write(reply, "\t\t\n"); else unicast_reply_write(reply, "\t\t\n",channels[curr_channel].ip4Out); unicast_reply_write(reply, "\t\t%d\n",channels[curr_channel].portOut); unicast_reply_write(reply, "\t\t%.0f\n",channels[curr_channel].traffic); unicast_reply_write(reply, "\t\t%d\n",channels[curr_channel].ratio_scrambled); unicast_reply_write(reply, "\t\t%d\n",channels[curr_channel].service_id); unicast_reply_write(reply, "\t\t%d\n",channels[curr_channel].pmt_pid); unicast_reply_write(reply, "\t\t%d\n",channels[curr_channel].unicast_port); unicast_reply_write(reply, "\t\t\n"); for(int i=0;i<32;i++) if(channels[curr_channel].ca_sys_id[i]!=0) unicast_reply_write(reply, "\t\t\t\n",channels[curr_channel].ca_sys_id[i],ca_sys_id_to_str(channels[curr_channel].ca_sys_id[i])); unicast_reply_write(reply, "\t\t\n"); unicast_reply_write(reply, "\t\t\n"); for(int i=0;i\n", channels[curr_channel].pids[i], channels[curr_channel].pids_language[i], channels[curr_channel].pids_scrambled[i], pid_type_to_str(channels[curr_channel].pids_type[i])); unicast_reply_write(reply, "\t\t\n"); unicast_reply_write(reply, "\t\n"); } // Ending XML content unicast_reply_write(reply, "\n"); // Cleaning all non acceptable characters for pseudo UTF-8 (in fact, US-ASCII) - Skipping BOM and last zero character unsigned char c; int j; for (j=3; jused_body; j++) { c=reply->buffer_body[j]; if ((c<32 || c>127) && c!=9 && c!=10 && c!=13) reply->buffer_body[j]=32; } unicast_reply_send(reply, Socket, 200, "application/xml; charset=UTF-8"); // End of HTTP reply if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } /** @brief Return the last MMI menu sent by CAM * * @param Socket the socket on wich the information have to be sent */ int unicast_send_cam_menu (int Socket, void *cam_vars_v) { #ifndef ENABLE_CAM_SUPPORT (void) cam_vars_v; //to make compiler happy #else cam_parameters_t *cam_vars=(cam_parameters_t *)cam_vars_v; #endif struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Unicast : Error when creating the HTTP reply\n"); return -1; } // UTF-8 Byte Order Mark (BOM) unicast_reply_write(reply, "\xef\xbb\xbf"); // Date time formatting time_t rawtime; time (&rawtime); char sdatetime[25]; snprintf(sdatetime,25,"%s",ctime(&rawtime)); // XML header unicast_reply_write(reply, "\n"); // Starting XML content unicast_reply_write(reply, "\n"); #ifdef ENABLE_CAM_SUPPORT // Sending the last menu if existing if (cam_vars->ca_resource_connected!=0) { if (cam_vars->cam_menulist_str.length>0) { unicast_reply_write(reply, "%s",cam_vars->cam_menulist_str.string); } else { unicast_reply_write(reply, "\t\n",sdatetime); unicast_reply_write(reply, "\t\n",cam_vars->cam_menu_string.string); unicast_reply_write(reply, "\t\n"); unicast_reply_write(reply, "\t<![CDATA[No menu to display]]>\n"); } } else { unicast_reply_write(reply, "\t\n",sdatetime); unicast_reply_write(reply, "\t\n"); unicast_reply_write(reply, "\t<![CDATA[CAM not initialized!]]>\n"); } #else unicast_reply_write(reply, "\t\n",sdatetime); unicast_reply_write(reply, "\t\n"); unicast_reply_write(reply, "\t<![CDATA[Compiled without CAM support]]>\n"); #endif // Ending XML content unicast_reply_write(reply, "\n"); // Cleaning all non acceptable characters for pseudo UTF-8 (in fact, US-ASCII) - Skipping BOM and last zero character unsigned char c; int j; for (j=3; jused_body; j++) { c=reply->buffer_body[j]; if ((c<32 || c>127) && c!=9 && c!=10 && c!=13) reply->buffer_body[j]=32; } unicast_reply_send(reply, Socket, 200, "application/xml; charset=UTF-8"); // End of HTTP reply if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Unicast : Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } /** @brief Send an action to the CAM MMI menu * * @param Socket the socket on wich the information have to be sent */ int unicast_send_cam_action (int Socket, char *Key, void *cam_vars_v) { #ifndef ENABLE_CAM_SUPPORT (void) cam_vars_v; //to make compiler happy #else cam_parameters_t *cam_vars=(cam_parameters_t *)cam_vars_v; #endif struct unicast_reply* reply = unicast_reply_init(); if (NULL == reply) { log_message( log_module, MSG_INFO,"Unicast : Error when creating the HTTP reply\n"); return -1; } // UTF-8 Byte Order Mark (BOM) unicast_reply_write(reply, "\xef\xbb\xbf"); // Date time formatting time_t rawtime; time (&rawtime); char sdatetime[25]; snprintf(sdatetime,25,"%s",ctime(&rawtime)); // XML header unicast_reply_write(reply, "\n"); // Starting XML content unicast_reply_write(reply, "\n"); unicast_reply_write(reply, "\t\n",ctime(&rawtime)); unicast_reply_write(reply, "\t\n",*Key); #ifdef ENABLE_CAM_SUPPORT // Check if valid action to be done [0-9] and 'M' and 'C' and 'O' int iKey=(int)*Key; if ((iKey>=48 && iKey<=57) || iKey==77 || iKey==67 || iKey==79) { // Check if CAM is initialized if (cam_vars->ca_resource_connected!=0) { // Disable auto response from now (as a manual action is asked) cam_vars->cam_mmi_autoresponse=0; // Numbers for MENU/LIST answer if (cam_vars->mmi_state==MMI_STATE_MENU && iKey>=48 && iKey<=57) { log_message( log_module, MSG_INFO, "Send CAM MENU key number %d\n",iKey-48); en50221_app_mmi_menu_answ(cam_vars->stdcam->mmi_resource, cam_vars->stdcam->mmi_session_number, iKey-48); cam_vars->mmi_state=MMI_STATE_OPEN; } // 'M' = ask the menu - Always possible if (iKey==77) { log_message( log_module, MSG_INFO, "Ask CAM to enter MENU\n"); en50221_app_ai_entermenu(cam_vars->stdcam->ai_resource, cam_vars->stdcam->ai_session_number); cam_vars->mmi_state=MMI_STATE_OPEN; } // Numbers for ENQUIRY answer if (cam_vars->mmi_state==MMI_STATE_ENQ && iKey>=48 && iKey<=57) { // We store the new key cam_vars->mmi_enq_answer[cam_vars->mmi_enq_entered]=iKey; cam_vars->mmi_enq_entered++; log_message( log_module, MSG_INFO, "Received CAM ENQUIRY key number %d (%d of %d expected)\n", iKey-48, cam_vars->mmi_enq_entered, cam_vars->mmi_enq_length); // Test if the expected length is received if (cam_vars->mmi_enq_entered == cam_vars->mmi_enq_length) { // We send the anwser log_message( log_module, MSG_INFO, "Sending ENQUIRY answer to CAM (answer has the expected length of %d)\n",cam_vars->mmi_enq_entered); en50221_app_mmi_answ(cam_vars->stdcam->mmi_resource, cam_vars->stdcam->mmi_session_number, MMI_ANSW_ID_ANSWER, (uint8_t*)cam_vars->mmi_enq_answer, cam_vars->mmi_enq_entered); cam_vars->mmi_state=MMI_STATE_OPEN; } } // 'C' = send CANCEL as an ENQUIRY answer if (cam_vars->mmi_state==MMI_STATE_ENQ && iKey==67) { log_message( log_module, MSG_INFO, "Send CAM ENQUIRY key CANCEL\n"); en50221_app_mmi_answ(cam_vars->stdcam->mmi_resource, cam_vars->stdcam->mmi_session_number, MMI_ANSW_ID_CANCEL, NULL, 0); cam_vars->mmi_state=MMI_STATE_OPEN; } // OK unicast_reply_write(reply, "\t\n"); } else { unicast_reply_write(reply, "\t\n"); } } else { unicast_reply_write(reply, "\t\n"); } #else unicast_reply_write(reply, "\t\n"); #endif // Ending XML content unicast_reply_write(reply, "\n"); // Cleaning all non acceptable characters for pseudo UTF-8 (in fact, US-ASCII) - Skipping BOM and last zero character unsigned char c; int j; for (j=3; jused_body; j++) { c=reply->buffer_body[j]; if ((c<32 || c>127) && c!=9 && c!=10 && c!=13) reply->buffer_body[j]=32; } unicast_reply_send(reply, Socket, 200, "application/xml; charset=UTF-8"); // End of HTTP reply if (0 != unicast_reply_free(reply)) { log_message( log_module, MSG_INFO,"Unicast : Error when releasing the HTTP reply after sendinf it\n"); return -1; } return 0; } mumudvb-1.7.1/src/unicast_http.h000066400000000000000000000165311177353207000166570ustar00rootroot00000000000000/* * mumudvb - UDP-ize a DVB transport stream. * * (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /**@file * @brief HTML unicast headers */ #ifndef _UNICAST_H #define _UNICAST_H #include "mumudvb.h" #include "unicast_queue.h" /** @brief The different fd/socket types */ enum { UNICAST_MASTER=1, UNICAST_LISTEN_CHANNEL, UNICAST_CLIENT, }; #define RECV_BUFFER_MULTIPLE 100 /**@brief the timeout for disconnecting a client with only consecutive errors*/ #define UNICAST_CONSECUTIVE_ERROR_TIMEOUT 5 #define HTTP_OK_REPLY "HTTP/1.0 200 OK\r\n"\ "Content-type: video/mpeg\r\n"\ "\r\n" #define HTTP_404_REPLY_HTML "\r\n"\ "\r\n"\ "\r\n"\ "Not found\r\n"\ "\r\n"\ "\r\n"\ "

404 Not found

\r\n"\ "
\r\n"\ "MuMuDVB version %s\r\n"\ "\r\n"\ "\r\n"\ "\r\n" #define HTTP_CHANNELS_REPLY_START "\r\n"\ "\r\n"\ "\r\n"\ "Channels list\r\n"\ "\r\n"\ "\r\n"\ "

Channel list

\r\n"\ "
\r\n"\ "This is the list of actually streamed channels by the MuMuDVB server. To open a channel copy the link to your client or use multicast.\r\n"\ "
\r\n"\ #define HTTP_CHANNELS_REPLY_END "
\r\n"\ "See MuMuDVB website for more details.\r\n"\ "\r\n"\ "\r\n"\ "\r\n" #define HTTP_501_REPLY "HTTP/1.0 501 Not implemented\r\n"\ "\r\n" #define HTTP_503_REPLY "HTTP/1.0 503 Too many clients\r\n"\ "\r\n" /** @brief A client connected to the unicast connection. * *There is two chained list of client : a global one wich contain all the clients. Another one in each channel wich contain the associated clients. */ typedef struct unicast_client_t{ /**HTTP socket*/ struct sockaddr_in SocketAddr; /**HTTP socket*/ int Socket; /**Reception buffer*/ char *buffer; /**Size of the buffer*/ int buffersize; /**Position in the buffer*/ int bufferpos; /**Is there consecutive errors ?*/ int consecutive_errors; /**When the first consecutive error happeard*/ long first_error_time; /**Channel : -1 if not associated yet*/ int channel; /**Future channel : we will set the channel when we will receive the get*/ int askedChannel; /**Next client*/ struct unicast_client_t *next; /**Previous client*/ struct unicast_client_t *prev; /**Next client in the channel*/ struct unicast_client_t *chan_next; /**Previous client in the channel*/ struct unicast_client_t *chan_prev; /** The packets in queue*/ unicast_queue_header_t queue; /** The latest write error for this client*/ int last_write_error; }unicast_client_t; /** @brief The information on the unicast file descriptors/sockets * There is three kind of descriptors : * The master connection : this connection will interpret the HTTP path asked, to give the channel, the channel list or debugging information * Client connections : This is the connections for connected clients * Channel listening connections : When a client connect to one of these sockets, the associated channel will be given directly without interpreting the PATH * * The numbering of this socket information is the same as the file descriptors numbering */ typedef struct unicast_fd_info_t{ /**The fd/socket type*/ int type; /** The channel if it's a channel socket*/ int channel; /** The client if it's a client socket*/ unicast_client_t *client; }unicast_fd_info_t; /** @brief The parameters for unicast */ typedef struct unicast_parameters_t{ /** Do we activate unicast ?*/ int unicast; /**The "HTTP" ip address*/ char ipOut[20]; /** The "HTTP" port*/ int portOut; /** The "HTTP" port string version before parsing*/ char *portOut_str; /** The HTTP input socket*/ struct sockaddr_in sIn; /** The HTTP input socket*/ int socketIn; /** The clients, contains all the clients, associated to a channel or not*/ unicast_client_t *clients; /** The number of connected clients*/ int client_number; /** The maximum number of simultaneous clients allowed*/ int max_clients; /** The timeout before disconnecting a client wich does only errors*/ int consecutive_errors_timeout; /** The information on the file descriptors : ie the type of FD, the client associated if it's a client fd, the channel if it's a channel fd */ unicast_fd_info_t *fd_info; /** The maximim size of the queue */ int queue_max_size; /** The socket SO_SNDBUF size*/ int socket_sendbuf_size; /** Debug : do we flush the queue when we get eagain errors ? */ int flush_on_eagain; }unicast_parameters_t; int unicast_create_listening_socket(int socket_type, int socket_channel, char *ipOut, int port, struct sockaddr_in *sIn, int *socketIn, fds_t *fds, unicast_parameters_t *unicast_vars); struct strength_parameters_t; //just to avoid including dvb.h for one structure int unicast_handle_fd_event(unicast_parameters_t *unicast_vars, fds_t *fds, mumudvb_channel_t *channels, int number_of_channels, struct strength_parameters_t *strengthparams, struct autoconf_parameters_t *autoconf_vars, void *cam_vars); int unicast_del_client(unicast_parameters_t *unicast_vars, unicast_client_t *client, mumudvb_channel_t *channels); int channel_add_unicast_client(unicast_client_t *client,mumudvb_channel_t *channel); void unicast_freeing(unicast_parameters_t *unicast_vars, mumudvb_channel_t *channels); int read_unicast_configuration(unicast_parameters_t *unicast_vars, mumudvb_channel_t *current_channel, int ip_ok, char *substring); void unicast_data_send(mumudvb_channel_t *actual_channel, mumudvb_channel_t *channels, fds_t *fds, unicast_parameters_t *unicast_vars); #endif mumudvb-1.7.1/src/unicast_queue.c000066400000000000000000000243451177353207000170210ustar00rootroot00000000000000/* * MuMuDVB - UDP-ize a DVB transport stream. * * (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /** @file * @brief File for HTTP unicast Queue and data sending * @author Brice DUBOST * @date 2009-2010 */ #include #include #include #include #include #include "unicast_http.h" #include "unicast_queue.h" #include "mumudvb.h" #include "errors.h" #include "log.h" static char *log_module="Unicast : "; int unicast_queue_remove_data(unicast_queue_header_t *header); int unicast_queue_add_data(unicast_queue_header_t *header, unsigned char *data, int data_len); unsigned char *unicast_queue_get_data(unicast_queue_header_t* , int* ); void unicast_close_connection(unicast_parameters_t *unicast_vars, fds_t *fds, int Socket, mumudvb_channel_t *channels); /** @brief Send the buffer for the channel * * This function is called when a buffer for a channel is full and have to be sent to the clients * */ void unicast_data_send(mumudvb_channel_t *actual_channel, mumudvb_channel_t *channels, fds_t *fds, unicast_parameters_t *unicast_vars) { if(actual_channel->clients) { unicast_client_t *actual_client; unicast_client_t *temp_client; int written_len; unsigned char *buffer; int buffer_len; int data_from_queue; int packets_left; struct timeval tv; actual_client=actual_channel->clients; while(actual_client!=NULL) { buffer=actual_channel->buf; buffer_len=actual_channel->nb_bytes; data_from_queue=0; if(actual_client->queue.packets_in_queue!=0) { //already some packets in the queue we enqueue the new one and try to send the queued ones data_from_queue=1; packets_left=UNICAST_MULTIPLE_QUEUE_SEND; if((actual_client->queue.data_bytes_in_queue+buffer_len)< unicast_vars->queue_max_size) unicast_queue_add_data(&actual_client->queue, buffer, buffer_len ); else { if(!actual_client->queue.full) { actual_client->queue.full=1; log_message( log_module, MSG_DETAIL,"The queue is full, we now throw away new packets for client %s:%d\n", inet_ntoa(actual_client->SocketAddr.sin_addr), actual_client->SocketAddr.sin_port); } } buffer=unicast_queue_get_data(&actual_client->queue, &buffer_len); } else packets_left=1; while(packets_left>0) { //we send the data written_len=write(actual_client->Socket,buffer, buffer_len); //We check if all the data was successfully written if(written_lenlast_write_error) { log_message( log_module, MSG_DEBUG,"New error when writing to client %s:%d : %s\n", inet_ntoa(actual_client->SocketAddr.sin_addr), actual_client->SocketAddr.sin_port, strerror(errno)); actual_client->last_write_error=errno; written_len=0; } } else { log_message( log_module, MSG_DEBUG,"Not all the data was written to %s:%d. Asked len : %d, written len %d\n", inet_ntoa(actual_client->SocketAddr.sin_addr), actual_client->SocketAddr.sin_port, actual_channel->nb_bytes, written_len); } if(!(unicast_vars->flush_on_eagain &&(errno==EAGAIN)))//Debug feature : we can drop data if eagain error { //No drop on eagain or no eagain if(!data_from_queue) { //We store the non sent data in the queue if((actual_client->queue.data_bytes_in_queue+buffer_len-written_len)< unicast_vars->queue_max_size) { unicast_queue_add_data(&actual_client->queue, buffer+written_len, buffer_len-written_len); log_message( log_module, MSG_DEBUG,"We start queuing packets ... \n"); } } else if(written_len > 0) { unicast_queue_remove_data(&actual_client->queue); unicast_queue_add_data(&actual_client->queue, buffer+written_len, buffer_len-written_len); log_message( log_module, MSG_DEBUG,"We requeue the non sent data ... \n"); } }else{ //this is an EAGAIN error and we want to drop the data if(!data_from_queue) { //Not from the queue we dont do anything log_message( log_module, MSG_DEBUG,"We drop not from queue ... \n"); } else { unicast_queue_clear(&actual_client->queue); log_message( log_module, MSG_DEBUG,"Eagain error we flush the queue ... \n"); } } if(!actual_client->consecutive_errors) { log_message( log_module, MSG_DETAIL,"Error when writing to client %s:%d : %s\n", inet_ntoa(actual_client->SocketAddr.sin_addr), actual_client->SocketAddr.sin_port, strerror(errno)); gettimeofday (&tv, (struct timezone *) NULL); actual_client->first_error_time = tv.tv_sec; actual_client->consecutive_errors=1; } else { //We have errors, we check if we reached the timeout gettimeofday (&tv, (struct timezone *) NULL); if((unicast_vars->consecutive_errors_timeout > 0) && (tv.tv_sec - actual_client->first_error_time) > unicast_vars->consecutive_errors_timeout) { log_message( log_module, MSG_INFO,"Consecutive errors when writing to client %s:%d during too much time, we disconnect\n", inet_ntoa(actual_client->SocketAddr.sin_addr), actual_client->SocketAddr.sin_port); temp_client=actual_client->chan_next; unicast_close_connection(unicast_vars,fds,actual_client->Socket,channels); actual_client=temp_client; } } } else { //data successfully written if (actual_client->consecutive_errors) { log_message( log_module, MSG_DETAIL,"We can write again to client %s:%d\n", inet_ntoa(actual_client->SocketAddr.sin_addr), actual_client->SocketAddr.sin_port); actual_client->consecutive_errors=0; actual_client->last_write_error=0; if(data_from_queue) log_message( log_module, MSG_DEBUG,"We start dequeuing packets Packets in queue: %d. Bytes in queue: %d\n", actual_client->queue.packets_in_queue, actual_client->queue.data_bytes_in_queue); } packets_left--; if(data_from_queue) { //The data was successfully sent, we can dequeue it unicast_queue_remove_data(&actual_client->queue); if(actual_client->queue.packets_in_queue!=0) { //log_message( log_module, MSG_DEBUG,"Still packets in the queue,next one\n"); //still packets in the queue, we continue sending if(packets_left) buffer=unicast_queue_get_data(&actual_client->queue, &buffer_len); } else //queue now empty { packets_left=0; log_message( log_module, MSG_DEBUG,"The queue is now empty :) client %s:%d \n", inet_ntoa(actual_client->SocketAddr.sin_addr), actual_client->SocketAddr.sin_port); } } } } if(actual_client) //Can be null if the client was destroyed actual_client=actual_client->chan_next; } } } /* ================= QUEUE ======================*/ /** @brief Add data to a queue * */ int unicast_queue_add_data(unicast_queue_header_t *header, unsigned char *data, int data_len) { unicast_queue_data_t *dest; if(header->packets_in_queue == 0) { //first packet in the queue header->first=malloc(sizeof(unicast_queue_data_t)); if(header->first==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } dest=header->first; header->last=header->first; } else { //already packets in the queue header->last->next=malloc(sizeof(unicast_queue_data_t)); if(header->last->next==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } dest=header->last->next; header->last=dest; } dest->next=NULL; dest->data=malloc(sizeof(unsigned char)*data_len); if(dest->data==NULL) { log_message( log_module, MSG_ERROR,"Problem with malloc : %s file : %s line %d\n",strerror(errno),__FILE__,__LINE__); return -1; } memcpy(dest->data,data,data_len); dest->data_length=data_len; header->packets_in_queue++; header->data_bytes_in_queue+=data_len; //log_message( log_module, MSG_DEBUG,"queuing new packet. Packets in queue: %d. Bytes in queue: %d\n",header->packets_in_queue,header->data_bytes_in_queue); return 0; } /** @brief Get data from a queue * */ unsigned char *unicast_queue_get_data(unicast_queue_header_t *header, int *data_len) { if(header->packets_in_queue == 0) { log_message( log_module, MSG_ERROR,"BUG : Cannot dequeue an empty queue\n"); return NULL; } *data_len=header->first->data_length; return header->first->data; } /** @brief Remove the first packet of the queue * */ int unicast_queue_remove_data(unicast_queue_header_t *header) { unicast_queue_data_t *tobedeleted; if(header->packets_in_queue == 0) { log_message( log_module, MSG_ERROR,"BUG : Cannot remove from an empty queue\n"); return -1; } tobedeleted=header->first; header->first=header->first->next; header->packets_in_queue--; header->full=0; header->data_bytes_in_queue-=tobedeleted->data_length; free(tobedeleted->data); free(tobedeleted); return 0; } /** @brief Clear the queue * */ void unicast_queue_clear(unicast_queue_header_t *header) { while(header->packets_in_queue > 0) unicast_queue_remove_data(header); } mumudvb-1.7.1/src/unicast_queue.h000066400000000000000000000031751177353207000170240ustar00rootroot00000000000000/* * mumudvb - UDP-ize a DVB transport stream. * * (C) 2009 Brice DUBOST * * The latest version can be found at http://mumudvb.braice.net * * Copyright notice: * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /**@file * @brief HTML unicast headers for queue */ #ifndef _UNICAST_QUEUE_H #define _UNICAST_QUEUE_H #define UNICAST_DEFAULT_QUEUE_MAX 1024*512 /**How many packets we try to send from the queue per new packet. This value MUST be at least 2*/ #define UNICAST_MULTIPLE_QUEUE_SEND 3 /** @brief A data packet in queue. * */ typedef struct unicast_queue_data_t{ int data_length; unsigned char *data; struct unicast_queue_data_t *next; }unicast_queue_data_t; /** @brief The header of a data queue. * */ typedef struct unicast_queue_header_t{ int packets_in_queue; int data_bytes_in_queue; int full; unicast_queue_data_t *first; unicast_queue_data_t *last; }unicast_queue_header_t; void unicast_queue_clear(unicast_queue_header_t *header); #endifmumudvb-1.7.1/tests/000077500000000000000000000000001177353207000143465ustar00rootroot00000000000000mumudvb-1.7.1/tests/TestDump17.ts000066400000000000000000002674601177353207000166520ustar00rootroot00000000000000G@IHCSAT TV POLONIA_.fre*CHAINE POLONAISE A VOCATION INTERNATIONALE8HCSATTV TRWAM_freCHAINE RELIGIEUSE POLONAISEFvF.ABHCSATFRANCE 5_)frG C   C pu  C Cu  C    C P " C G $ C vP ' C  u 0 C Vu1 C ! PGe%LA CHAINE DU SAVOIR ET DE L'EDUCATIONBEHCSATC CINEMA EMOTION_$fre LE CINEMA DE TOUTES LES PASSIONSCNHCSATC CINEMA FRISSON_-fre)LE CINEMA ACTION, FANTASTIQUEG ET SUSPENSED:H CSATNRJ 12_#freTOUT L'ESPRIT NRJ DANS UNE TELEEDHCSATPARIS PREMIERE_%fre!L'ACTUALITE CULTURELLE PARISIENNEFFHCSAT 13EME RUE_,fre(LGA CHAINE DE L'INVESTIGATION ET DU CRIMEG;H CSATMEZZO_%fre!LA CHAINE DU JAZZ ET DU CLASSIQUEH?HCSATFRANCE 3_&fre"LA CHAINE GENERALISTE DE PROXIMITEI>H CSATG@N 0N"GC!MWfreBEST OF LE GRAND JOURNAL8Best of Le Grand Journal Prsent par Michel Denisot. NfreBest of Le Grand Journal Prsent par Michel Denisot. AidGSPORT+_'fre#POUR CEUX QUI VEULENT PLUS DE SPORTJ8H CSATI>TELE_!freL'INFORMATION AVEC UN GRAND ILH CSATMEZZO.MH CSATNCMESSU9H CSATI>TELE_"fG de ses comparses, Michel Denisot dcrypte les moments forts de l'actualit en recevant celles et ceux qui sont au coeur d'vnements rcents.P freAudioP freVideoP"freDVB subtGreL'INFORMATION AVEC UN GRAND I V:H CSATNRJ 12_#freTOUT L'ESPRIT NRJ DANS UNE TELEW?HCSATFRANCE 3_&fre"LA CHAINE GENERALISTE DE PROXIMITEXBHCSATFRANCEG@7 5_)fre%LA CHAINE DU SAVOIR ET DE L'EDUCATIONGE^FCCy2HCSATEURONEWS_freEURONEWS EN 9 LANGUES>(FFB|HCSAT ARIRANG TV_#freCHAGu< C  u@ C !huE C "ePuN C $AuR C %" V C % X C &P Z C &@ [ C &bu \ CGINE SUD COREENNE GENERALISTEdJHIMEDIAAL JAZEERA ENG_)fre%LA CHAINE INTERNATIONALE D'AL JAZEERAfFHCSAT NHK WORLD TV_)fre%LA CHAINE JAPONAISE D'INFO EN ANGLAISiGais ralis par Jos Bourgarel en 2007. Nfre& RalisateurJos BourgarelAnne2007(-10) La question : Le Pen et la torture Documentaire franais ralis par Jos Bourgarel en 2007G@EHCSATCANAL CANARIAS_&fre"CHAINE REGIONALE DES LES CANARIESjGHCSAT TV GALICIA_,fre(LA CHAINE REGIONALE ESPAGNOLE GALICIENNE1yJ2lA*    G. Jean-Marie Le Pen se serait rendu coupable d'actes de torture lors de la guerre d'Algrie : tmoins, journalisteN)fre#s, avocats et historiens dbattent.P freVideoP freAudioPG          _8 i   "    - 2 5 .4lA*_8Q!<~C2Gx636&A pppp_pppp74Amfmgmhmkmnmp_mfmgmhmkmnmp<BA$$$$$$$$_ $$*$|$h$G@/!freDVB subtitles (normal)TEUFRAbK OH.O1-0zMfre TOUT LE SPORT Multisports.Nfre Multisports.P freVideoP freAudioP!freDVB subtitles (normal)TG$@$$>BA        _ @IA%%%% %!%"%#%$%%_$%%E%U% %!I%"G%#y%$_%%XA-A..//G@pp"4G/:_..///:CAy_y5DA'_'nEAoFoG_oFoGFzA0B|B}B~BBBBBBBBBBBBB_@B|WB} B~G@aUFRAMO&T`O1-0zMfre TOUT LE SPORT Multisports.Nfre Multisports.P freVideoP freAudioP!freDVB subtitles (normal)TaUFRA HOy"d8O GJBMBBKBLB$BBoBBmBnBB,B7HA9!!!!!!!‡!Ç!ć!Ň!Ƈ!̄!̈́!΄!ϋ!Ћ!ы!ҋ!Ӌ_L!\!^!!!!!!!!!!!!!G@;!!!!JA ###_ ###~IJ EAoFoG_oFoGFzA0B|B}B~BBBBBBBBBBBBB_@B|WB} B~JBMBG@m("UU0^M%freLES SPECIALISTES EUROPE Football.Nfre Football.P freVideoP freAudioTaUFRAuVOU"w8OE2:Mpfre LES REGRETS`(-10) Ralis par Cdric Kahn GBKBLB$BBoBBmBnBB,B7H-A!!!!!_!\!^!!!eLPA!!!"""""""_(!+!!""S"?"F"j""gGen 2009. Avec Yvan Attal, Valeria Bruni Tedeschi. Drame franais. Nfre# Ralisateur Cdric KahnAnne2009(-10) Ralis par Cdric Kahn en 2009. Avec Yvan Attal, Valeria Bruni TedesGM&A mmmm_mmmmR`A#####$$$$ $ _(##'##$=$9$:$ >$ ?_(#$ S-AD\D]D^D_D`_D\D]GD^D_D`TBA/X/b/g////_ ./X-/b/g/4/;/#/4VdA$U$V$W$X$^$i$j$k$l$r_($Ub$V^$Wc$X$^$i $j$k $l$r_( $Wp$VGchi. Drame franais. Un architecte renoue avec son amour de jeunesse, qu'il n'a pas vue depuis quinze ans. Emports par leur passion, ils sN,fre&'aiment et se font souffrir nouveauG$UdWAz_zjX@A%%%%%%_%D%Y%%%)%>_(% ZBA""""""""_ ""("T""z"p"q"[A3-35G@_3-35`\dA&&&&&&&&&&_(&a&_&`& &&&& &&_( &E&&QؗJ ^aA'%%%%%%%%%%%%G@.P freVideoP freAudioP!freDVB subtitles (normal)TUFRA %"w8!"w8!"w8!!OBFOk"U%1G&G_0%%%%%%%!%"%%%%$`aA'&I&J&K&L&M&N&O&P&Q&R&S&T&_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_GMbfre&JAYCE ET LES CONQUERANTS DE LA LUMIERE7Jayce et les conqurants de la lumire "Le jardinier". Nfre( NationalitFrance - Etats-U...TDETDEJayce et les conqurants de la lumiG|AJ_JA_!A 3_ 3BBA#)#*#+#,#=#>#?#@_ #)#*#+#,#=#>#?H#@BNAe_eG &iP ] C &% ^ C & _ C '!u ` C '(P  C Pu2G@;DA'_'n#A_YJ,^gA'%%%%%%%%%%%%&G_0%-%.%/%9%1%=%@%A%5%6%7%C_`Gre "Le jardinier". Alors qu'ils font escale sur une plante dserte, Jayce et ses amis font la connaissance de Faro, un jardinier capable de redonner vie un monde mort...P freVidGgA'&I&J&K&L&M&N&O&P&Q&R&S&T&_0&I0&J:&K;&L<&M2&N>&O?&P3&Q4&RB&S8&TD_U5A_A_A_"QG@J.lA*ABCDEFGHIJUVWX_8ABfCeD%EFGHIPJ3U<V8W/X10PA          _( Z i G@8eoP freAudioT1UFRABF1!KOu!HO0ZM!freFOOTBALL EN CONTINU Football.Nfre Football.P freVideoP freAudioTaUFRAlI/Gg [ h d { f R 01&A n-n.n@nE_n-n.n@nE2lA*              _8 i   " Y X \ - 2 5 G.4lA*_8Q!<~C2]x636&A pppp_pppp74AmfmgmhmkmnG@O 2Oyc"E 0M?freZAP MCM COMPIL,Le meilleur des missions diffuses sur MCM.N2fre,Le meilleur des missions diffuses sur MCM.P freVideoP freAudioTUFRA,Gmp_mfmgmhmkmnmp8WA!"a"b"c"d"e"u"v"w"x"y"_,"a"b "c "d "e "u "v"w"x"y"<BA$$$$$$$$_ $$*$|$hG@BQO&\OBA        _ @IA%%%% %!%"%#%$%%_$%%E%U% %!I%"G%#y%$_%%XA-A../G@&//:_..///::DFH7H CSATGOD TV_ freCHAINE CHRETIENNE EN ANGLAISkF m HCSATqF! EHCSAT SONNENKLAR_G: String Quartet n14 Death and the Maiden (Part 4)P freVideoP freAudioT0UFRAҫG*fre&CHAINE ALLEMANDE: VOYAGE ET TELEACHAT3@H CSATTELE 5_)fre%LA CHAINE DE DIVERTISSEMENT ALLEMANDE?HCSATSPORT 1_'fre#LA CHAINE DE SPORT ALLEMANDE PRIVEEG@F,oiAHCSATCARTOON NETWORK_!freLA TELE PREFEREE DES CARTOONSoj:HCSATCNN INT._!freL'INFO AU-DELA DES FRONTIERESom7H CSATTCM_#freA LA DECOGUVERTE DU GRAND CINEMAooAHCSAT BOOMERANG_'fre#LA CHAINE DES DESSINS ANIMES CULTESoqHCSAT DATASYSTEM 68o8H CSATMTV HD_!freLA VERSION SPECIALE HD DE MTVoG@=8H CSATMTV HD_!freLA VERSION SPECIALE HD DE MTV F!6oHCSAT DATASYSTEM 78p8HCSAT MTV PULSE_freLA CHAINE EN MODE POP-ROCKp4HCSATMTV IDOL_G@freLA CHAINE VERSION CULTEp6H CSATVIVA_!freLA CHAINE MUSICALE ALLEMANDEpDHCSATNICKELODEON JR_%fre!LA CHAINE PRESCOLAIRE DES 3-7 ANSȥFiA.G@O$<O "51M freTITEUF"Le patron de papa". Nfre NationalitFranceTDETDE"Le patron de papa". Titeuf et ses parents sont invits manger chez le patron du pre GBHCSATRTL TELEVISION_#freLA CHAINE ALLEMANDE GENERALISTE.@H CSATRTL 2_*fre&LA CHAINE ALLEMANDE DES JEUNES ADULTES/>HCSAT SUPER RTL_$fre LA CHAINE AG@LLEMANDE DES 3-13 ANS/BH CSATVOX_.fre*LA CHAINE GENERALISTE FAMILIALE ALLEMANDE/:BH CSATN-TV_-fre)CHAINE DINFO EN CONTINU PRIVEE ALLEMANDE|,FEoFJGde Titeuf qui est gay. Titeuf dcide de faire un expos sur les homosexuels.P freVideoP freAudioT1UFRA$<1$<1U$<1G@@WJT JW @ASTRA 1JWJ TNOJW J ` JWJ`v C  pPu C Pu C Pu C  1Pu C G@HCSAT SR FERNSEHEN_-fre)LA CHAINE REGIONALE DE LA REGION RHENANIEoG:HCSATBR ALPHA_!freLA CHAINE EDUCATIVE ALLEMANDEW#'FH! HCSAT!+H CSATONZGEO_freLA TELE TOUT FOOT!4HCSATMOSAIQUE_freLES CHAINES DE CANALSAT!H CSATMOSA 2!H CSATMOSA 3!8HCSATYACHT AND SAIL_freLA CHAINE DU NAUG@3$<1E$<1!CrO"ZOj#00MSfre LE GRAND JTCLe journal tout en images et une rtrospective des courses du jour.NIfreCLe journal toGTISME!HCSATMOSAIQUE! H CSATMMD!H CSATMOSA 5!.HCSATCASH TV_freLA CHAINE DES JEUX!@HCSAT PRIVATE SPICE_"freLE MEILLEUR DU X INTERNATIONALG@`ut en images et une rtrospective des courses du jour.P freVideoP freAudioTUFRA |O4Om"5 1Mafre%LES NOUVELLES AVENTURES DE LUCKY LUKE7Les nouvelles aveG!H CSATMOSA 4! HCSAT!H CSATCDN12!HCSAT MOSAIQUE C+!HCSAT MOSAIQUE C+!HCSATMOSAIQUE!HCSAT MOSAIQUE C+!HCSATMOSAIQUE! HCSAGT!HCSAT MOSAIQUE C+!4HCSATMOSAIQUE_freLES CHAINES DE CANALSAT!H CSATMOSA 2!H CSATMOSA 3!H CSATMOSA 4!H CSATMOSA 5!HCSATBIENVEGntures de Lucky Luke "Dalton junior". Nfre NationalitFranceTDETDELes nouvelles aventures de Lucky Luke "Dalton junior". Lucky Luke poursuit les Dalton, vads du pnitencier. DGNUE SUR ASTRA!HCSAT 01 06 01 59!HCSAT 01 07 01 59!HCSAT 01 08 01 59!HCSAT 02 01 01 94!HCSAT 02 02 01 94!HCSAT 02 04 01 94!HIMEDIA 02 05G@< 01 94!HCSAT 02 06 01 94!HCSAT 01 06 04 587Fj-H CSATKTO_freTELEVISION CATHOLIQUE?HCSAT RUSSIA TODAY_"freCHAINE RUSSE D'INFO EN AGans leur fuite, une nounou leur a confi de force le bb qu'elle gardait. L'enfant s'est pris d'affection pourN:fre4 Joe, qui, lui, veut l'changer contre une ranon...P freVideoGNGLAIS?HCSAT FRANCE 24_%fre!L'ACTUALITE INTERNATIONALE 24H/24IHIMEDIA FRANCE 24 ENG_)fre%INFO INTERNATIONALE 24H/24 EN ANGLAIS8H IMEDIAEWTN_!freGLA CHAINE CATHOLIQUE MONDIALEGHCSATFRANCE 24 ARABE_'fre#INFO INTERNATIONALE 24H/24 EN ARABE;HCSATTELESUR_#freLA CHAINE PAN-LATINO-AMERICAINEAH CSATCG@P freAudioT1UFRAɬ O4O#E2kMfreNEW YORK POLICE JUDICIAIRE(-10) New York police judiciaire Srie policire amricaine avec Sam Waterston, Dennis Farina. G@ ¨%3A333 " 3A 3 3 3  @  &  (0  )  )@  6   G@CTVF_+fre'LA CHAINE CHINOISE EN VERSION FRANCAISEBHCSAT CCTV NEWS_(fre$LA CHAINE CHINOISE D'INFO EN ANGLAIS7JeXLPA!!!"""""""_GSaison 15. (24/24). "Faute de parcours". Nfre- Nationalit Etats-UnisTDEFaute de parcours(-10) New York police judiciaire Srie policire amricaine avec Sam Waterston, Dennis FarG(!+!!""S"?"F"j""gM&A mmmm_mmmmReA'######$$$$ $ $ $ _4##'###$=$9$:$ >G$ ?$ $ S-AD\D]D^D_D`_D\D]D^D_D`TBA/X/b/g////_ ./X-/b/g/4/;/#/4WAz_zjX4A%%%%%%Gina. Saison 15. (24/24). "Faute de parcours". Un train draille, entranant la mort de neuf personnes. Les policieN\freVrs ne savent pas s'il s'agit d'un acte terroriste ou si l'un dG_%D%Y%%%)%>ZBA""""""""_ ""("T""z"p"q"[A3-35_3-35`^^A$%%%%%%%%%%%%_G0%%%%%%%!%"%%%%$`^A$&I&J&K&L&M&N&O&P&Q&R&S&T_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_|AG@es passagers tait vis.P freVideoP freAudioP!freDVB subtitles (normal)TTUFRAE4T!!O.#ROS"U1M4freLES ZINZINS DE L'ESPACEG$`Pu C Pu  C !HPu C #%  C uPu C XPu! C $u C P  C 5  C gP G@SJ_JA_!A 3_ 38UJeXLPA!!!"""""""_(!+!!""S"?"F"j""gMG"Flashman contre Zork". Nfre NationalitFranceTDETDE"Flashman contre Zork". Le super hros Flashman et son frre Zork emmnagent dans la maison en location. Ils s'engagent dans G&A mmmm_mmmmReA'######$$$$ $ $ $ _4##'###$=$9$:$ >$ ?$ $ S-AD\D]D^D_D`_D\GD]D^D_D`TBA/X/b/g////_ ./X-/b/g/4/;/#/4WAz_zjX4A%%%%%%_%D%Y%%%)%>ZBA"""G@Aune lutte sans merci...P freVideoP freAudioT1UFRAN 0N(DC"Mpfre LES REGRETS`(-10) Ralis par Cdric Kahn en 2009. Avec Yvan Attal, Valeria Bruni TedeG"""""_ ""("T""z"p"q"[A3-35_3-35`^^A$%%%%%%%%%%%%_0%%%%%%%!%"%%%%G$`^A$&I&J&K&L&M&N&O&P&Q&R&S&T_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_|AJ_JA_!Gschi. Drame franais. Nfre# Ralisateur Cdric KahnAnne2009(-10) Ralis par Cdric Kahn en 2009. Avec Yvan Attal, Valeria Bruni Tedeschi. Drame franais. Un architecte renoue avG@$A 3_ 3WJ FzA0B|B}B~BBBBBBBBBBBBB_@B|WB} B~JBMBBKBLB$BBoBBmBnBB,B7H&AG !!!!_!\!^!!LPA!!!"""""""_(!+!!""S"?"F"j""gM&A mmmm_mmmmRPA###Gec son amour de jeunesse, qu'il n'a pas vue depuis quinze ans. Emports par leur passion, ils sN,fre&'aiment et se font souffrir nouveau.P freVideoP freAudioP!freDVB subtiG##$$$$ $ _(##'##$=$9$:$ >$ ?S-AD\D]D^D_D`_D\D]D^D_D`TBA/X/b/g////_ ./X-/b/g/4/;Gtles (normal)TUFRA % 0!0 0"0 0!P 0! 0!# 0!G/#/4WAz_zjX4A%%%%%%_%D%Y%%%)%>ZBA""""""""_ ""("T""z"p"q"[A3-35_3G-35`^aA'%%%%%%%%%%%%&G_0%%%%%%%!%"%%%%$`aA'&I&J&K&L&M&N&O&P&Q&R&S&T&_0&I&J&K&L&MG@(!E 0!"%N 0N#00MPfre LE JOURNALATous les quarts d'heure, un rsum de toute l'actualit sportive.NGfreATous les quarts d'heure, unG@m&N&O &P&Q&R#&S&T%U5A_|AJ_JA_}J2 %!A 3_ 3ـJ$AG@_<}[JBBA#)#*#+#,#=#>#?#@_ #)#*#+#,#=#>#?H#@BCAy_y5DA'_'nEAoFoG_oFoGFG@P rsum de toute l'actualit sportive.P freVideoP freAudioTaUFRA`OO$ ?S-AD\D]D^D_D`_D\D]D^D_D`TBA/X/b/g////_ ./X-/b/G C   C 8  C V ! C 2% # C au * C 9u, C xu. C u2 C u4 C 4GNationalitFranceTDETDE"Flashman contre Zork". Le super hros Flashman et son frre Zork emmnagent dans la maison en location. Ils s'engagent dans une lutte sans merci...P freVGg/4/;/#/4VgA!$U$V$W$X$^$i$j$k$l$r$_($Ub$V^$Wc$X$^$i $j$k $l$r_( $Wp$V$WdWAz_zjXCA%%%%%%%_G@t%D%Y%%%)%>_(% ZBA""""""""_ ""("T""z"p"q"æJ[A3-35_3-35`\dA&&&&&&G@!ideoP freAudioT1UFRAqO#>BO#U1Mfre"LA QUESTION : LE PEN ET LA TORTUREc(-10) La question : Le Pen et la torture Documentaire franais ralis par Jos BouG&&&&_(&a&_&`& &&&& &&_( &E&&Q^^A$%%%%%%%%%%%%_0%%%%%%%!%"%%%%$`G^A$&I&J&K&L&M&N&O&P&Q&R&S&T_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_|A_A_!A Grgarel en 2007. Nfre& RalisateurJos BourgarelAnne2007(-10) La question : Le Pen et la torture Documentaire franais ralis par Jos Bourgarel en 2007. Jean-Marie Le Pen se seG@3_ 3FuEHCSAT TV CATALUNYA_(fre$CHAINE REGIONALE ESPAGNOLE CATALANEuFHCSAT ANDALUCIA TV_)fre%CHAINE REGIONALE ESPAGNOLE ANGrait rendu coupable d'actes de torture lors de la guerre d'Algrie : tmoins, journalisteN)fre#s, avocats et historiens dbattent.P freVideoP freAudioP!freDVB subtitles (norG@RDALOUSEuBHCSAT TV MADRID_(fre$CHAINE REGIONALE ESPAGNOLE DE MADRIDkFJ'O|9H CSATTRAVEL_"freLA CHAINE DE VOYAGE EN ANGLAIS ZF;*oHCSATG DATASYSTEM 66o;H CSATMTV_'fre#LA CHAINE MUSICALE AMERICAINE EN VFoHHCSAT NICKELODEON_,fre(LA CHAINE QUI FERAIT DU BIEN AUX PARENTSo C !)uA C !PuB C "uC C "&PuD C "FuF C G DE L'OUTRE-MER$LHCSAT DIRECT STAR_0fre,LA CHAINE MUSICALE GENERATIONNELLE DE LA TNT$9H CSATLCP_%fre!LA CHAINE DE LA VIE PARLEMENTAIRE$AHCSATFRANCE 4_G@RALɱO#"e8Ob"PE2MfreMERES ET FILLESqRalis par Julie Lopes-Curval en 2009. Avec Catherine Deneuve, Marina Hands, Marie-Jose Croze. Drame franais. Nfre* RalisaG(fre$LA CHAINE PUBLIQUE DE DIVERTISSEMENT$8HCSAT A LA CARTE_freVOS PROGRAMMES A LA CARTE$ 8HCSAT A LA CARTE_freVOS PROGRAMMES A LA CARTE$ BH CSATGULLG@M0  gP hF j   k        -eGI_,fre(LA CHAINE JEUNESSE A REGARDER EN FAMILLE$ 5HCSATFRANCE _freLA CHAINE DE L'OUTRE-MER$ HCSAT A LA CARTE$ HCSAT A LA CARTE$SHCSATDATA SYSTEMGteurJulie Lopes-CurvalAnne2009Ralis par Julie Lopes-Curval en 2009. Avec Catherine Deneuve, Marina Hands, Marie-Jose Croze. Drame franais. Une trentenaire dcouvre le journal G@ [106],JDG TPS ABONNESJ 0 j(oI,^eI,^I,^nIA"#2_$1]"#2WA!YZG^`abcdfij_,YZt^]`za^bpcdifiwjxIA_$7h_qWA!!5!8!9!:!B!DGintime de sa grand-mre, qui a quitt sa famille il y a loN8fre2ngtemps. Elle tente de mieux comprendre son geste.P freVideoP freAudioP!freDVB subtitles (normal)TUFRG!E!!!!_,!5!8=!9V!:!B!DZ!E[!!!!IA'.'B'N'O'S'T'U'V'W_$'.;'B:'N'O'S8'Ty'Us'Vu'Wv-Ap1p2p3p4p5_p1p2G@A4O%XO#41McfreLE PROCES ANDREOTTIKDocumentaire allemand ralis par Maria Rosa Bobbi, Michael Busse en 1999. Nfre( RalisateurMaria Rosa BobbiAnne1999DoGp3p4p5#A_*BAoooooooo_ oo}oooooo,&A oiojomoo_oioj9omloo.lA*ABCDEFGGHIJUVWX_8ABfCeD%EFGHIPJ3U<V8W/X10^A$           h j_0  d {  R 0 hGcumentaire allemand ralis par Maria Rosa Bobbi, Michael Busse en 1999. Aprs avoir domin la vie politique italienne pendant un demi-sicle, Giulio Andreotti a failli devenir le symbG@5 j1&A n-n.n@nE_n-n.n@nEs0rAJGGTPS ALPHA TESTJ 0 j(oI,^eI,^I,^nIA"#<_$1G]"#<WA!YZ^`abcdfij_,YZt^]`za^bpcdifiwjxIA_$7hGole de la collusion du Nfrepouvoir et de la Mafia.P freVideoP freAudioTEUFRA%%XE!ρG_qWA!!5!8!9!:!B!D!E!!!!_,!5!8=!9V!:!B!DZ!E[!!!!IA'.'B'N'O'S'T'U'V'W_$'.;'B:'N'O'S8'Ty'UsG'Vu'Wv-Ap1p2p3p4p5_p1p2p3p4p5#A_*BAoooooooo_ oo}oooooo,&A oiojomoo_Goioj9omloo.lA*ABCDEFGHIJUVWX_8ABfCeD%EFGHIPJ3U<V8W/X10^A$           g j_G"uG C #PuH C #$uI5 C #CPuJ C #cuK C #PuL C $uM C 6PuQ5 C %% S C %Du TG@c0  d {  R 0 g j1&A n-n.n@nE_n-n.n@nERNJ G TNTSAT C1J0 o;A_1GO]WA!YZ^`abcdfij_,YZt^]`za^bpcdifiwjxIA_$7h_qGhA!5!8!9!:!D!E!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!g!h!k!l!m!n!o!p!r!s!t!u!v_!5!8=!9V!:G!DZ!E[!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!g!h!k!l!m!n!o!p!r!s!t!u!vGIA'.'B'N'O'S'T'U'V'W_$'.;'B:'N'O'S8'Ty'Us'Vu'Wv-Ap1p2p3p4p5_p1p2p3p4p5#A_*BAooooooG@`oo_ oo}oooooo,&A oiojomoo_oioj9omlooJ +G TNTSAT C2J0 _6( (0X;A_G1O]WA!YZ^`abcdfij_,YZt^]`za^bpcdifiwjxIA_$7Gh_qhA!5!8!9!:!D!E!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!g!h!k!l!m!n!o!p!r!s!t!u!v_G!5!8=!9V!:!DZ!E[!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!g!h!k!l!m!n!o!p!Gr!s!t!u!vIA'.'B'N'O'S'T'U'V'W_$'.;'B:'N'O'S8'Ty'Us'Vu'Wv&A p1p2p3p5_p1p2p3p5*BAoooooooo_ oG   30   3BG@\o}oooooo,4Aoiojomoooo_oioj9omlooo o̫J&G REDSAT CPLUSJ0 _630A+p_+p/A!G"#2<c_"IAZ`abcdfij_$Z`abcDdfij4A_OP4A'.'GS'T'U'V'W_'.'S'T'U'V'WAp4_p4#A_+,Aoj_oj.&A ADHJ_AD HJ04A    G   _ h 2-A     _ f e  j4A_ k8:A"a"b"c"d"e"u_"a"b,"c)"d*"e+"u(_G>BA        _ @A% _% /BA#)#*_#)#*CAy_yFA B|B}B_ B|}B}BG C %QP U5 C %t% W C &u Y C &3%  C $!PuڎG R9A#####_## ###!_(#T&A /X//_/X//VA$X_$XWAz_zZA"_"҂G@J%G REDSAT CSATJ0 _630A+p_+p4A_1]WA!YZ^`abcdfij_,YGZt^]`za^bpcdifiwjxIA_$7h_qhA!5!8!9!:!D!E!G!H!I!J!K!L!M!N!O!P!Q!R!SG@OIBFOw"V1.M*freLEONS DE STYLE"Quatre rnovations". Nfre"Quatre rnovations". De prcieux conseils en matire de mode, pour toujours avoir le bon look et tout coG!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!g!h!k!l!m!n!o!p!r!s!t!u!v_!5!8=!9V!:!DZ!E[!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!UG@nnatre sur les tendances du moment.P freVideoP freAudioTeUFRA#BFeBFeHBFe!3:NO% 2O"UU2 M|freBOG!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!g!h!k!l!m!n!o!p!r!s!t!u!vIA'.'B'N'O'S'T'U'V'W_$'.;'B:'N'O'S8'TyG'Us'Vu'Wv&A p1p2p3p5_p1p2p3p5#A_*BAoooooooo_ oo}oooooo,4AoiojomooooGNESr(-10) Srie policire amricaine avec Emily Deschanel, David Boreanaz. Saison 2. (8/22). "La chance du dbutant". Nfre1 Nationalit Etats-UnisTDELa chance du dbutant(-10) SrG@$_oioj9omlooo onm[F!L-HCSATRFI INT_freLA RADIO DU MONDE!MGHCSATRADIO CLASSIQUE_'fre#LE MEILLEUR DE LA MUSIQUE CLASSIQUE!N5HCGSATEUROPE 1_freRADIO PRIVEE GENERALISTE!O'H CSATRMC_freINFO TALK SPORT!P&H CSATRTL_freVIVRE ENSEMBLE!QHHCSATRIRE & CHANSONS_(fre$DU RIRE Gie policire amricaine avec Emily Deschanel, David Boreanaz. Saison 2. (8/22). "La chance du dbutant". Pour mener une enqute sur des combats illgaux organiss par la mafia, Booth eGGARANTI TOUTES LES 3 MINUTES!R3HCSAT SUD RADIO_freLA RADIO DU GRAND SUD!SDHCSAT MC DOUALIYA_(fre$RADIO FRANCAISE GENERALISTE EN ARABE!T,HCSATTSF JAZZ_GfreRADIO 100% JAZZ!UO$#2tMfre%LAETITIA : BITES DURES POUR AMATRICESm5,95 E. REF. 1793342. (-18) Laetitia : bites dures pour amatrices Ralis par Laetitia. Film pornographiqueGS_,fre(LA CHAINE REGIONALE ALLEMANDE DE BAVIEREmJHCSAT HR FERNSEHEN_-fre)LA CHAINE REGIONALE GENERALISTE DE HESSE m6H CSATWDR_"freLA CHAINE REGIONALE DE G@ COLOGNE3>fFX%?HCSATHISTOIRE_&fre"LES CLES DU PRESENT PAR L'HISTOIRE%6HCSATMA CHAINE SPORT_freA CHACUN SON SPORT%BHCSATM6 MUSIC BLACK_G. Nfre RalisateurLaetitia5,95 E. REF. 1793342. (-18) Laetitia : bites dures pour amatrices Ralis par Laetitia. Film pornographique. Laetitia est en visite chez des petites amatG#freLA CHAINE DES MUSIQUES URBAINES%;HCSAT M6 MUSIC CLUB_freLA CHAINE 100% DANCEFLOOR%@HCSATVIVOLTA_(fre$LE BIEN-ETRE DES FEMMES AU QUOTIDIEN%JHCSATG@dPLANETE JUSTICE_*fre&CHAINE CONSACREE AU SYSTEME JUDICIAIRE%HCSATDATA SYSTEM 112z%F0AHCSATTV5MONDE_(fre$LA CHAINE FRANCOPHONE INTERNATIONALEGrices. Celles-ci sont encore plus cochonnes que les autres. Elles n'attendeNLfreFnt que des hommes bien monts pour se faire plaisir trs profondment.P freVideoP freAudioTG3H IMEDIA_ freLA PETITE CHAINE QUI DEMONTE;HCSAT TELEREALITE_freLA CHAINE DE LA TELEREALITE HCSAT9HCSATNRJ HITS_ freLA CHAINE MUSICALEG@qUFRA%"k% >@"k@ >! Ӂl]O%^O1-0zMfre TOUT LE SPORT Multisports.Nfre MultG DU TOP 50AHCSAT FRENCH LOVER_$fre L'EDUCATION SEXUELLE POUR ADULTE:HIMEDIA GIRONDINS TV_freLA CHAINE DES GIRONDINSHCSAT PLAYIN'Tvi" H IMEDIAG@p#HIMEDIA ACTU CANALSAT2HCSAT 01 03 01 59<HCSAT 01 03 04 58cHCSATDATA SYSTEM 18הJ GTNTSATJ0 .-A ADHJ_AD HG@Risports.P freVideoP freAudioP!freDVB subtitles (normal)TaUFRAVOo*O_B#U0Mfre HITS BASEClips. NAfre;Clips. Le meilleurs titres R'n'B, groove et GJH0A  _   2&A    _   4A_ <A$_$FAB_B R-A#####_G## ###TA /g//_ /g(//^_A$%%%%%%%%%%%%_1%e%f%g%q%i%u%x%y%m%n%o%{`_A$&I&J&K&LG@9soul du moment.P freVideoP freAudioTUFRAqL*O!LOgU"P51Mfre JEU FATALr(-12) Ralis par Roel Rein en 2008. Avec Steven Seagal, Lydia Jordan, Lance HenrikG@V&M&N&O&P&Q&R&S&T_1&Ih&Jr&Ks&Lt&Mj&Nv&Ow&Pk&Ql&Rz&Sp&T|YtJO G TNTSAT HDJ0 -.-A ADHJ_AD HJH0A  G_   2&A    _ 4 3 84A_ 9<A$_$BA#)#*_#)#*FAB_B R-A###Gsen. Film d'action amricain. Nfre" Ralisateur Roel ReinAnne2008(-12) Ralis par Roel Rein en 2008. Avec Steven Seagal, Lydia Jordan, Lance Henriksen. Film d'action amricainG##_## ###TA /g//_ /g(//VA$X$^_$X$^^bA'%%%%%%%%%%%%&G_1%e%f%g%q%i%u%G. Dpressif et alcoolique, un policier dmis de ses fonctions est contraint - officieusement - d'organiN0fre*ser l'assassinat d'un impitoyable mafieux.P freVideoP freAudioP G@x%y%m%n%o%{`bA'&I&J&K&L&M&N&O&P&Q&R&S&T&_1&Ih&Jr&Ks&Lt&Mj&Nv&Ow&Pk&Ql&Rz&Sp&T|JiJa TG TNTSAT SPS_6 (0 (0 G@.( (   2EJ*G TNTSAT C3J0 A_.-A ADHJ_AD HJH0A  _  GengAudioT!UFRAxBG2&A    _   4A_ <A$_$FAB_B R-A#####_## ###TA /g/G/_ /g(//^bA'%%%%%%%%%%%%&G_1%e%f%g%q%i%u%x%y%m%n%o%{`bA'&I&J&K&L&M&N&O&P&Q&R&S&T&_1G@4&Ih&Jr&Ks&Lt&Mj&Nv&Ow&Pk&Ql&Rz&Sp&T|~w-J`G TNTSAT C4J0 >A_.-A ADHJ_AD HJH0A  _ G 2&A    _ 4 3 84A_ 9<A$_$BA#)#*_#)#*FAB_B R-A#####_G## ###TA /g//_ /g(//VA$X$^_$X$^^_A$%%%%%%%%%%%%_1%e%f%g%q%i%u%x%y%m%n%G@po%{`_A$&I&J&K&L&M&N&O&P&Q&R&S&T_1&Ih&Jr&Ks&Lt&Mj&Nv&Ow&Pk&Ql&Rz&Sp&T|lgJ&G REDSAT BASICJ0 _630A_G"IAZ`abcdfij_$Z`abcDdfij4A_OP4A'.'S'T'U'V'W_'.'S'TG'U'V'WAp4_p4#A_+,Aoj_oj.&A ADHJ_AD HJ04A      _ h G 2-A     _ f e  j4A_ k84A"a"b"c"d"e"u_"a"b,"c)"d*"e*"u(@A% _% /BA#)#*_G#)#*CAy_yFA B|B}B_ B|}B}B R-A#####_## ###!T&A /X//_/X//VA$X_G$XWAz_zZA"_"^,A$%%%%%%%%%%%%_`/A'&I&J&K&L&M&N&O&P&Q&R&S&T&_U5A_G      _(  d {  R 01&A n-n.n@nE_n-n.n@nE2lA*              _8 i  G"UU2*MfreBONESDIFFUSE EN HD. (-10) Srie policire amricaine avec Emily Deschanel, David Boreanaz. Saison 2. (8/22). "La chance du dbutant". Nfre1 Nationalit Etats-UnisTDG  " Y X \ - 2 5 .4lA*_8Q!<~C2]x636&A pppp_pGppp74Amfmgmhmkmnmp_mfmgmhmkmnmp8wA!"a"b"c"d"e"u"v"w"x"y"_,"aZ"bi"cg"df"eh"u["v"w"x"y"_("a"b "cGELa chance du dbutantDIFFUSE EN HD. (-10) Srie policire amricaine avec Emily Deschanel, David Boreanaz. Saison 2. (8/22). "La chance du dbutant". Pour mener une enqute sur des Gu< C  u@ C !huE C "ePuN C $AuR C %" V C % X C &P Z C &@ [ C &bu \ CG "d "e "u <BA$$$$$$$$_ $$*$|$h$$@$$>BA        _ @IA%%%% %!%"%Gcombats illgaux organiss par la mafia,NRfreL Booth et Brennan se font passer pour un couple amateur de boxe clandestine.P freVideoP freAudioP!freDVB subtitles (normal)TTG@#%$%%_$%%E%U% %!I%"G%#y%$_%%XA-A..///:_..///:CAy_y5V̒FGp19HCSAT EINS EXTRA_freLA CHAGINE D'INFO ALLEMANDEp2HHCSAT EINS FESTIVAL_*fre&LA GENERALISTE ALLEMANDE DU RESEAU ARDp39HCSAT EINS PLUS_freLA CHAINE SAVOIR ALLEMANDE p4'H CSATARTE_G@0UFRAO"v8O0"EE1MWfreBEST OF LE GRAND JOURNAL8Best of Le Grand Journal Prsent par Michel Denisot. NfreBest of Le Grand Journal Prsent par MichG@]freVIVONS CURIEUXp5AHCSATPHOENIX_)fre%NEWS POLITIQUE DES 2 CHAINES ARD/ZDF %?MF).HCSATDATA SYSTEM[70]T⻨F41n-CHCSATRBB BRANDENBURG_G#freCHAINE REGIONALE DE BRANDENBURGn.HHCSAT RBB BERLIN_-fre)LA CHAINE REGIONALE GENERALISTE DE BERLINn@@H CSATNDR_,fre(LA CHAINE REGIONALE GENERALISTE DU NORDnG@QEIHCSAT MDR FERNSEHEN_+fre'LA CHAINE REGIONALE GENERALISTE DE SAXE/F4?HCSAT EUROSPORT_%fre!ON NE PLAISANTE PAS AVEC LE SPORT@H CSATTMC_G,fre(CHAINE GENERALISTE A L'ESPRIT MONEGASQUE8HCSATPLANETE_ freLE MEILLEUR DE LA DECOUVERTE9HCSATTELETOON_ freLA COUR DE RECRE A LA MAISON8H CSATVGOYAGE_!freLA TELE COMME POINT DE DEPART2H CSATLCI_fre24H/24, L'INFO VIT SUR LCI.H CSATTEVA_freTELEVISION D'EMOTIONS1HCSAT COMEDIE !_fGel Denisot. Aid de ses comparses, Michel Denisot dcrypte les moments forts de l'actualit en recevant celles et ceux qui sont au coeur d'vnements rcents.P freVideoP freAudioGreLA TELE QUI DECONNE8H CSATARTE_#freLA CHAINE CULTURELLE EUROPEENNE3HCSAT SERIE CLUB_freLA CHAINE DES SERIESAH CSATJUNE_,fre(LA TELE QUI DONGNE ENVIE D'ETRE UNE FILLE=H CSATTIJI_(fre$ET LES PETITS DEVIENNENT PLUS GRANDS@H CSATTMC_,fre(CHAINE GENERALISTE A L'ESPRIT MONEGASQUE8H CSATARTE_GP!freDVB subtitles (normal)TpUFRA"v8p!!$G@F#freLA CHAINE CULTURELLE EUROPEENNE HCSATDATA SYSTEM76RQ FYFB-H CSATNT1_freTOUT POUR SE DIVERTIRBHCSAT DATASYSTEM 94FL!6HCG@OBFOT#01Mfre FLICS DE CHOC}(-12) Ralis par Jean-Pierre Desagnat en 1983. Avec Pierre Massimi, Chantal Nobel, Jean-Luc Moreau. Film policier franais. Nfre, RalGSAT TELEMAISON_freLA PASSION DE LA MAISON!3H CSATJIMMY_freON A TOUS UNE SERIE CULTE!;HCSATSYFY UNIVERSAL_freLA CHAINE DU FANTASTIQUE"FHCSAT DGISNEY XD_,fre(LA CHAINE POUR LES GARCONS DE 8 A 14 ANS"5HCSAT L'EQUIPE TV_freAU PLUS PRES DU SPORT"?HCSATPLANETE NO LIMIT_freVOUS N'AVEZ ENCORE RIEN GisateurJean-Pierre DesagnatAnne1983(-12) Ralis par Jean-Pierre Desagnat en 1983. Avec Pierre Massimi, Chantal Nobel, Jean-Luc Moreau. Film policier franais. Une quipe de policGVU";HCSAT NATIONAL GEO_freLA CHAINE DE L'EXPLORATION";HCSATC CINEMA CLASSIC_freLE CINEMA DE REFERENCE":HCSATTRACE TV_!freMUSIQUES ET CULTURESG@p URBAINES"@HCSATC CINEMA FAMIZ_!freLE CINEMA DE TOUTE LA FAMILLE"_HCSATDATA SYSTEM[100]nF^%9HCSAT FR3 AMIENS_freCANAL REGIONAL DE FRANCEG@iers, la recherche du meurtrier de plusieurs femmes, dmantN$frele un rseau de prostitution.P freVideoP freAudioT!UFRAa+O!HO*"E0MTfreL.A. GIRG 3%;HCSAT FR3 BESANCON_freCANAL REGIONAL DE FRANCE 3%;HCSAT FR3 BORDEAUX_freCANAL REGIONAL DE FRANCE 3%8HCSAT FR3 NANCY_freCANAL REGIONAL DE FG &iP ] C &% ^ C & _ C '!u ` C '(P  C Pu2GRANCE 3%>HCSATFR3 CLERMONT FD_freCANAL REGIONAL DE FRANCE 3%8HCSAT FR3 PARIS_freCANAL REGIONAL DE FRANCE 3%9HCSAT FR3 RENNES_freCANAL REGIONAGLS LOVE BIG COCK7(-18) L.A. Girls Love Big Cock Tlfilm pornographique.N=fre7(-18) L.A. Girls Love Big Cock Tlfilm pornographique.P freVideoP freAudioP engAudioTUFRGL DE FRANCE 3%8HCSAT FR3 ROUEN_freCANAL REGIONAL DE FRANCE 3%:HCSAT FR3 LIMOGES_freCANAL REGIONAL DE FRANCE 3%7HCSATFR3 LYON_freCANAL REGIONAG@AG;O&\OK#52MfreALIEN INVASIONDIFFUSE EN HD. (-12) Ralis par Jesse V Johnson en 2007. Avec Mark Dacascos, Amelia Cooke, Emma Lahana. Film de science-fiction cGL DE FRANCE 3%BA        _ @IA%%%% %!%"%#%$%%_$%%E%U% %!I%"G canadien. Un guerrier intergalactique se rend sur Terre pour empcher un groupe dN5fre/'extraterrestres de conqurir la plante bleue.P freVideoP freAudioT0UFRA?0GG%#y%$_%%XA-A..///:_..///:CAy_y5DA'_'nEAoFoG_oFoGFzA0B|B}B~BBBBBBBBBG@O&\O>"@ 0MFfre'SCHUBERT : STRING QUARTET N14 DEAT...Information non disponibleN freInformation non disponibleP freVideoP freAudioT0UFRAf-mGBBBB_@B|WB} B~JBMBBKBLB$BBoBBmBnBB,B7HA9!!!!!!!‡!Ç!ć!Ň!Ƈ!̄!̈́!΄!ϋ!Ћ!ы!ҋ!Ӌ_L!\!^!!!!!G@[!!!!!!!!!!!!JA ###_ ###~IJ FzA0B|B}B~BBBBBBBBBBBBB_@B|WB} B~JBMG@O"ZOpI#%0M&freNAKED WILD ON 2"Bombas latinas". Nefre_"Bombas latinas". Une nouvelle saison de plaisirs sexy sous le soleil et dans les discothques.P freVideoPGBBKBLB$BBoBBmBnBB,B7H&A !!!!_!\!^!!LPA!!!"""""""_(!+!!""S"?"F"j""gM&GA mmmm_mmmmRPA#####$$$$ $ _(##'##$=$9$:$ >$ ?S-AD\D]D^D_D`_D\D]D^D_D`TBAG@5 freAudioTmUFRAP"Zm! bTO 4Oi"@01Mfre AFRICA TREKuDocumentaire franais ralis par Alexandre Poussin, Sonia Poussin, Florence Tran en 2G/X/b/g////_ ./X-/b/g/4/;/#/4WAz_zjX4A%%%%%%_%D%Y%%%)%>ZBA""""""""_ G""("T""z"p"q"[A3-35_3-35`^aA'%%%%%%%%%%%%&G_0%%%%%%%!%"%%%%$`aA'&I&J&K&LG001 (4/12). "Enfin le rift !". Nfre) RalisateurAlexandre PoussinAnne2001Documentaire franais ralis par Alexandre Poussin, Sonia Poussin, Florence Tran en 2001 (4/12). "EnfinG@&M&N&O&P&Q&R&S&T&_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_|AJ_JA_}J]PG TNT TRIG le rift !". Malgr les pluies diluviennes, Alexandre et Sonia continuent leur aventure et dcouvrent leN>fre8 travail des ONG au Malawi, o le sida fait des ravages.P freVideoP G@MAX10.B248FRTV^`J0  5[gwJ,^gA'%%%%%%%%%%%%&G_0%-%.%/%9%1%=%@%A%5%G6%7%C_`gA'&I&J&K&L&M&N&O&P&Q&R&S&T&_0&I0&J:&K;&L<&M2&N>&O?&P3&Q4&RB&S8&TD_U5A_A_A_G@freAudioTKUFRA&dOC4O#U1(M8freTRACKS-Propos par Jean-Marc Barbieux, David Combe. Nfre PrsentateurJean-Marc BarbieuxpPropos par Jean-Marc Barbieux, DG@ "QJ.lA*ABCDEFGHIJUVWX_8ABfCeD%EFGHIPJ3U<V8W/X10PA          _G( Z i g [ h d { f R 01&A n-n.n@nE_n-n.n@nE2lA*              _8 i   " Y X \G@avid Combe. Au sommaire : "Backstage". - "David Lynch". - "Atari Teenage Riot".P freVideoP freAudioTgUFRA4g4g!OyCOG - 2 5 .4lA*_8Q!<~C2]x636&A pppp_pppp74AmfGmgmhmkmnmp_mfmgmhmkmnmp8WA!"a"b"c"d"e"u"v"w"x"y"_,"a"b "c "d "e "u "v"w"x"y"<BA$$$$$$$$_ $G@?#0~M4freEURONEWS EN 8 LANGUESInformation non disponibleN freInformation non disponibleP freVideoP freAudioTUFRAmnXO2o*Oh{"U1M.freLE JT$(-1G$*$|$h$$@$$>BA        _ @IA%%%% %!%"%#%$%%_$%%E%U% %!I%"G%#y%$_%%XAG0) Prsent par Julien Tellouck. Nfre PrsentateurJulien Tellouck(-10) Prsent par Julien Tellouck. Du lundi au vendredi, Julien propose de dcouvrir toute l'actualit digitale, G@3-A..///:_..///::DF!^'H CSATNOVA_freLE GRAND MIX !!_4HCSATRADIO FG_freLA RADIO DE LA SCENE DJ!`4HCSAT VIBRATGION_freBIEN PLUS QUE DES HITS!a5HCSAT CONTACT FM_freLA RADIO DANCE DU NORD!b.HCSAT RADIO LATINA_fre LE SON LATINO!c1H CSATRFM_freLE MEILLEG@Ten compagnie de chroniqueurs et d'invits.P freVideoP freAudioTUFRAN@ 0N"PE2%MfreMERES ET FILLESqRalis par Julie Lopes-Curval en 2009. Avec CatherGUR DE LA MUSIQUE!d6HCSAT CHERIE FM_freVOS PLUS BELLES EMOTIONS!f+HCSATVOLTAGE_freHIT RADIO PARIS!g(H CSATOUI FM_fre LA RADIO ROCK!h0H CSATADG   30   3BGO_freLA RADIO HIP HOP & R'N'B!kDHCSATRADIO NOTRE-DAME_#fre1ERE RADIO CHRETIENNE DE FRANCE!l@HCSAT RADIO ALFA_%fre!LA RADIO DES PORTUGUAIS DE FRANCE!m>Gine Deneuve, Marina Hands, Marie-Jose Croze. Drame franais. Nfre* RalisateurJulie Lopes-CurvalAnne2009Ralis par Julie Lopes-Curval en 2009. Avec Catherine Deneuve, Marina HGHCSAT RCJ / SHALOM_!freRADIOS DE LA COMMUNAUTE JUIVE!n9HCSATBEUR FM_!freMUSIQUE ET CULTURE DU MAGHREB!o9HCSAT BBC ARABIC_freVERSION ARABE DE BBC WORGands, Marie-Jose Croze. Drame franais. Une trentenaire dcouvre le journal intime de sa grand-mre, qui a quitt sa famille il y a loN8fre2ngtemps. Elle tente de mieux comprendre sG@LD!p5HCSATRFI MULTILINGUE_freRFI EN 20 LANGUES!qHCSATRCI SAT!r4H CSATMEDI 1_freLA RADIO DU GRAND MAGHREBhF~!s=HCSATFRANCE CULTURE_GfreRADIO NATIONALE CULTURELLE!t;H CSATWRN_'fre#MIX DE RADIOS PUBLIQUES EN FRANAIS!u3HCSAT BBCW SERVICE_freLA RADIO DE LA BBC!v?HCSATRADIO COURTOISG@pon geste.P freVideoP freAudioP!freDVB subtitles (normal)TUFRAE 0!!--Ny 0NXc"U ^M%freLES SPECIALISTES EUROPE Football.NfreG@IE_freLA RADIO LIBRE FRANCOPHONE!HCSATRADIO 1!HCSATRADIO 2!HCSATRADIO 3!HCSAT RADIO FRANCE#HCSAT DATASYSTEM 24SIFRD'AHCSAGreLA TELE QUI DECONNE8H CSATARTE_#freLA CHAINE CULTURELLE EUROPEENNE3HCSAT SERIE CLUB_freLA CHAINE DES SERIESAH CSATJUNE_,fre(LA TELE QUI DONGNE ENVIE D'ETRE UNE FILLE=H CSATTIJI_(fre$ET LES PETITS DEVIENNENT PLUS GRANDS@H CSATTMC_,fre(CHAINE GENERALISTE A L'ESPRIT MONEGASQUE8H CSATARTE_G'M4freINFO 360'EN DIRECT. Prsent par Nathalie Lvy. Nfre Prsentateur Nathalie LvyEN DIRECT. Prsent par Nathalie Lvy. Tous les faits marquants de la journe, les rsultG@F#freLA CHAINE CULTURELLE EUROPEENNE HCSATDATA SYSTEM76RQ FYFB-H CSATNT1_freTOUT POUR SE DIVERTIRBHCSAT DATASYSTEM 94FL!6HCG@yats sportifs en images, l'info conomique, ainsi que la clture de Wall Street.P freVideoP freAudioTUFRAs! O 2Ob"MfreRIPOUX CONTRE RIPOUXkRalis pGSAT TELEMAISON_freLA PASSION DE LA MAISON!3H CSATJIMMY_freON A TOUS UNE SERIE CULTE!;HCSATSYFY UNIVERSAL_freLA CHAINE DU FANTASTIQUE"FHCSAT DGISNEY XD_,fre(LA CHAINE POUR LES GARCONS DE 8 A 14 ANS"5HCSAT L'EQUIPE TV_freAU PLUS PRES DU SPORT"?HCSATPLANETE NO LIMIT_freVOUS N'AVEZ ENCORE RIEN Gar Claude Zidi en 1989. Avec Philippe Noiret, Thierry Lhermitte, Guy Marchand. Comdie franaise. Nfre# Ralisateur Claude ZidiAnne1989Ralis par Claude Zidi en 1989. Avec PhiliGVU";HCSAT NATIONAL GEO_freLA CHAINE DE L'EXPLORATION";HCSATC CINEMA CLASSIC_freLE CINEMA DE REFERENCE":HCSATTRACE TV_!freMUSIQUES ET CULTURESG@p URBAINES"@HCSATC CINEMA FAMIZ_!freLE CINEMA DE TOUTE LA FAMILLE"_HCSATDATA SYSTEM[100]nF^%9HCSAT FR3 AMIENS_freCANAL REGIONAL DE FRANCEGppe Noiret, Thierry Lhermitte, Guy Marchand. Comdie franaise. Deux inspecteurs corrompus de Montmartre, dnoncs par une commerante du quartier, sont mis pied et rempN2fre,lacsG 3%;HCSAT FR3 BESANCON_freCANAL REGIONAL DE FRANCE 3%;HCSAT FR3 BORDEAUX_freCANAL REGIONAL DE FRANCE 3%8HCSAT FR3 NANCY_freCANAL REGIONAL DE FG@Q par deux confrres encore plus vreux.P freVideoP freAudioTUFRA &vOWo,O/"HCSATFR3 CLERMONT FD_freCANAL REGIONAL DE FRANCE 3%8HCSAT FR3 PARIS_freCANAL REGIONAL DE FRANCE 3%9HCSAT FR3 RENNES_freCANAL REGIONAGL DE FRANCE 3%8HCSAT FR3 ROUEN_freCANAL REGIONAL DE FRANCE 3%:HCSAT FR3 LIMOGES_freCANAL REGIONAL DE FRANCE 3%7HCSATFR3 LYON_freCANAL REGIONAGUn tour d'horizon des plus gros festivals en Europe. Zoom sur le festival Rock am Ring, qui a accueilli en juin 2010 Jay-Z, Muse, Kiss, Gossip, Rammstein, Dizzee Rascal, ou encore 30 GL DE FRANCE 3%BA        _ @IA%%%% %!%"%#%$%%_$%%E%U% %!I%"G Balfour. Saison 1. (4/13). "L'pidmie". Nfre& Nationalit Etats-UnisTDE L'pidmieDIFFUSE EN HD. (-10) Srie fantastique amricaine avec Emily Rose, Lucas Bryant, Eric Balfour. SGG%#y%$_%%XA-A..///:_..///:CAy_y5DA'_'nEAoFoG_oFoGFzA0B|B}B~BBBBBBBBBGaison 1. (4/13). "L'pidmie". Audrey dcouvre que la photo d'une femme a t publie dans le journal et pense qu'iN\freVl s'agit de sa mre. Avec l'aide de Nathan, elle dcide d'enqGBBBB_@B|WB} B~JBMBBKBLB$BBoBBmBnBB,B7HA9!!!!!!!‡!Ç!ć!Ň!Ƈ!̄!̈́!΄!ϋ!Ћ!ы!ҋ!Ӌ_L!\!^!!!!!G@[!!!!!!!!!!!!JA ###_ ###~IJ FzA0B|B}B~BBBBBBBBBBBBB_@B|WB} B~JBMG@uter sur ses origines...P freVideoP freAudioP engAudioTR0UFRA&\R0 &\R0#@&\R0!&O4O"0 GBBKBLB$BBoBBmBnBB,B7H&A !!!!_!\!^!!LPA!!!"""""""_(!+!!""S"?"F"j""gM&GA mmmm_mmmmRPA#####$$$$ $ _(##'##$=$9$:$ >$ ?S-AD\D]D^D_D`_D\D]D^D_D`TBAGMfrePOP 1000tPrsent par Thomas VDB. Avec la participation de Franck Lacombe, Sbastien Lipszyc, Emmanuel Lipszyc. "Episode 1". NfrePrsent par Thomas VDB. Avec la participatG/X/b/g////_ ./X-/b/g/4/;/#/4WAz_zjX4A%%%%%%_%D%Y%%%)%>ZBA""""""""_ G""("T""z"p"q"[A3-35_3-35`^aA'%%%%%%%%%%%%&G_0%%%%%%%!%"%%%%$`aA'&I&J&K&LGion de Franck Lacombe, Sbastien Lipszyc, Emmanuel Lipszyc. "Episode 1". Parodie du Top 50, institution musicale des annes 80, Pop 1000 propose le classement des 1000 meilleures venG@&M&N&O&P&Q&R&S&T&_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_|AJ_JA_}J,^gAG@tes de singles, prsenN:fre4t par Patrick Desvosges, interprt par Thomas VDB.P freVideoP freAudioTpUFRA4p! O;%^O1,"%E MfreBUG'%%%%%%%%%%%%&G_0%-%.%/%9%1%=%@%A%5%6%7%C_`gA'&I&J&K&L&M&N&O&P&Q&R&S&T&_0&I0&J:&K;&L<&M2&N>&OG@d?&P3&Q4&RB&S8&TD_U5A_A_A_"QJ.lA*ABCDEFGHIJUVWX_8ABfCeGLLITTBullitt (version remasterise) Ralis par Peter Yates en 1968. Avec Steve McQueen, R Vaughn, J Bisset. Film policier amricain. Nfre# Ralisateur Peter YatesAnne1968BullitGD%EFGHIPJ3U<V8W/X10PA          _( Z i g [ h d { f R 01&A n-n.n@nE_n-n.n@nE2lA* G             _8 i   " Y X \ - 2 5 .4lA*_8Q!<~CGt (version remasterise) Ralis par Peter Yates en 1968. Avec Steve McQueen, R Vaughn, J Bisset. Film policier amricain. Un policier, charg d'assurer la scurit d'un truand appel G2]x636&A pppp_pppp74Amfmgmhmkmnmp_mfmgmhmkmnmp8WA!"a"b"c"d"e"u"v"w"x"y"_,G tmoigner contre la maNHfreBfia, se lance dans une folle poursuite aprs le meurtre du tmoin.P freVideoP freAudioP!freDVB subtitles (normal)TUFRAl"G"a"b "c "d "e "u "v"w"x"y"<BA$$$$$$$$_ $$*$|$h$$@$$>BA        _ G C   C pu  C Cu  C    C P " C G $ C vP ' C  u 0 C Vu1 C ! PG@ @IA%%%% %!%"%#%$%%_$%%E%U% %!I%"G%#y%$_%%XA-A..///:_..///::DF!^'H CSATNOVA_freLE GG@OOkc MFfre'LA CHAINE DE L'ACTUALITE INTERNATION...Information non disponibleN freInformation non disponibleP freVideoP freAudioTUFRAO+GRAND MIX !!_4HCSATRADIO FG_freLA RADIO DE LA SCENE DJ!`4HCSAT VIBRATION_freBIEN PLUS QUE DES HITS!a5HCSAT CONTACT FM_freLA RADIO DANCE DU NORD!bG.HCSAT RADIO LATINA_fre LE SON LATINO!c1H CSATRFM_freLE MEILLEUR DE LA MUSIQUE!d6HCSAT CHERIE FM_freVOS PLUS BELLES EMOTIONS!f+HCSATVOLTAGE_G@N_ 0N!%%DM}fre MISSION GoRalis par Hoyt Yeatman en 2009. Avec Bill Nighy, Zach Galifianakis, Will Arnett. Film d'aventures amricain. Nfre$ Ralisateur Hoyt YeatmGfreHIT RADIO PARIS!g(H CSATOUI FM_fre LA RADIO ROCK!h0H CSATADO_freLA RADIO HIP HOP & R'N'B!kDHCSATRADIO NOTRE-DAME_#fre1ERE RADIO CHRETIEGNNE DE FRANCE!l@HCSAT RADIO ALFA_%fre!LA RADIO DES PORTUGUAIS DE FRANCE!m>HCSAT RCJ / SHALOM_!freRADIOS DE LA COMMUNAUTE JUIVE!n9HCSATBEUR FM_!freMUGanAnne2009Ralis par Hoyt Yeatman en 2009. Avec Bill Nighy, Zach Galifianakis, Will Arnett. Film d'aventures amricain. Des cochons d'Inde, auxiliaires du FBI, dcouvrent un complGSIQUE ET CULTURE DU MAGHREB!o9HCSAT BBC ARABIC_freVERSION ARABE DE BBC WORLD!p5HCSATRFI MULTILINGUE_freRFI EN 20 LANGUES!qHCSATRCI SAT!r4H CSATMEGot menaant les Etats-Unis. Ils tentent de N1fre+le djouer, en dpit de nombreux obstacles.P freVideoP freAudioP engAudioTUFRA5 0 0G@-DI 1_freLA RADIO DU GRAND MAGHREBhF~!s=HCSATFRANCE CULTURE_freRADIO NATIONALE CULTURELLE!t;H CSATWRN_'fre#MIX DE RADIOS PUBLIQUES EN FRANGAIS!u3HCSAT BBCW SERVICE_freLA RADIO DE LA BBC!v?HCSATRADIO COURTOISIE_freLA RADIO LIBRE FRANCOPHONE!HCSATRADIO 1!HCSATRADIO 2!HCSATRG@;E 0 0!%NN' 0NXb!T Mvfre$LES RENCONTRES DE LA SOIREE DE JEUDIMEN DIRECT. Phase de poules. 4e journe. Les rencontres G@?ADIO 3!HCSAT RADIO FRANCE#HCSAT DATASYSTEM 24SIFRD'AHCSAT YES ITALIA_&fre"LA CHAINE DES AMOUREUX DE L'ITALIE" FH!HCSAT 01 07 04 5G8!HCSAT 01 08 04 58!HCSAT 02 01 04 93!HCSAT 02 02 04 93!HCSAT 02 04 04 93!HCSAT 02 05 04 93!HCSAT 02 06 04 93!HCSATDATA SYSTEM[96]zGde la soire de jeudi.NSfreMEN DIRECT. Phase de poules. 4e journe. Les rencontres de la soire de jeudi.P freAudioP freVideoT!UFRA% 0!!M(kG@FtNeEHCSAT CANAL+ 3D_+fre'CANAL+ DONNE UNE 3EME DIMENSION A LA TVHCSATDATA SYSTEM[102]yx4FOT7HCSATLUXE.TV_freLA VITRINE DU MONDE GDU LUXE7HCSATSKY NEWS_freLa chane de news anglaise/X3HCSAT LIBERTY TV_freLA TELE DES VACANCES/bMHCSATCHAINE ETUDIANTE_,fre(LA CHAINE DE L'EMPLG@OO0i yM/freCANAL TV REALITEInformation non disponibleN freInformation non disponibleP freVideoP freAudioTUFRAv=O$ROR$"0%Mgfre GOI ET DE LA FORMATION/g@HCSATTV8 MONT-BLANC_!freLA CHAINE ALPINE DE PROXIMITE/5H CSATBFM TV_freL'INFO NOUVELLE GENERATION/5H CSATBFM TV_freL'INGTOUT DEPEND 2UPrsent par Benjamin Vincent. Invite : Aurlie Filippetti (dpute PS de Moselle). Nfre8 PrsentateurBenjamin VincentInvitAurlie FilippettiPrsent par BenjaminG@FO NOUVELLE GENERATION/>HCSATDIRECT 8_%fre!LA CHAINE GENERALISTE DE L'INEDIT/@HIMEDIADIRECT 8_%fre!LA CHAINE GENERALISTE DE L'INEDIT*4F`&I7HCGu< C  u@ C !huE C "ePuN C $AuR C %" V C % X C &P Z C &@ [ C &bu \ CGSATFR3 CAEN_freCANAL REGIONAL DE FRANCE 3&J9HCSAT FR3 NANTES_freCANAL REGIONAL DE FRANCE 3&K7HCSATFR3 NICE_freCANAL REGIONAL DE FRANCE 3&L:HCSAG Vincent. Invite : Aurlie Filippetti (dpute PS de Moselle). La dpute socialiste Aurlie Filippetti part la rencontre de Thibaut, 28 ans, qui a cr un cabinet de reNqfrekcrutGT FR3 ORLEANS_freCANAL REGIONAL DE FRANCE 3&M8HCSAT FR3 DIJON_freCANAL REGIONAL DE FRANCE 3&N;HCSAT FR3 POITIERS_freCANAL REGIONAL DE FRANCE 3&O8HGCSAT FR3 REIMS_freCANAL REGIONAL DE FRANCE 3&P;HCSAT FR3 GRENOBLE_freCANAL REGIONAL DE FRANCE 3&Q8HCSAT FR3 LILLE_freCANAL REGIONAL DE FRANCE 3&R=HGement pour les jeunes des quartiers. Endett, il doit dposer le bilan et dnonce l'absence de soutien.P freVideoP freAudioTkUFRA5#Rk#RkGCSATFR3 STRASBOURG_freCANAL REGIONAL DE FRANCE 3&S>HCSATFR3 MONTPELLIER_freCANAL REGIONAL DE FRANCE 3&T=HCSATFR3 VIA STELLA_freCANAL REGIONAL DEG@e0#Rk0#Rk0#Rk0#Rk!u|O#@BO""0PMxfrePERIL EN HAUTE MERaPril en haute mer (saison 5) DG@, FRANCE 3&HCSATDATA SYSTEM 120ɓJeXLPA!!!"""""""_(!+!!""S"?"F"j""gM&A mmmm_mmmmGReA'######$$$$ $ $ $ _4##'###$=$9$:$ >$ ?$ $ S-AD\D]D^D_D`_D\D]D^D_D`TBA/X/b/g/Gocumentaire amricain ralis en 2009 (Ep. 7). "Le sprint final". Nfre Anne2009Pril en haute mer (saison 5) Documentaire amricain ralis en 2009 (Ep. 7). "Le sprint final". LaG///_ ./X-/b/g/4/;/#/4WAz_zjX4A%%%%%%_%D%Y%%%)%>ZBA""""""""_ ""("T"G"z"p"q"[A3-35_3-35`^^A$%%%%%%%%%%%%_0%%%%%%%!%"%%%%$`^A$&I&J&K&L&M&N&O&P&Q&G saison du crabe royal s'achve : les quipes tentent de rentabiliser au maximum leurs dernires heures ; bord du Cornelia Marie, la frusNfretration est palpable.P freVideoP GR&S&T_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_|AJ_JA_!A 3_ 38UG@freAudioTKUFRAC5OTJ.Ou 9MfreLE POINT SUR L'INFOEN DIRECT. Prsent par T Dugeon, N Daynac. Avec la participation de F Pinet. Invite : La Seydoux (comG@JeXLPA!!!"""""""_(!+!!""S"?"F"j""gM&A mmmm_mmmmReA'######$$$$ $ G@ ¨%3A333 " 3A 3 3 3  @  &  (0  )  )@  6   G$ $ _4##'###$=$9$:$ >$ ?$ $ S-AD\D]D^D_D`_D\D]D^D_D`TBA/X/b/g////_ ./X-/b/g/4/;/Gdienne, pour Belle Epine). Nfre/ PrsentateurThierry DugeonInvit La SeydouxEN DIRECT. Prsent par T Dugeon, N Daynac. Avec la participation de F Pinet. Invite : La Seydoux G#/4WAz_zjX4A%%%%%%_%D%Y%%%)%>ZBA""""""""_ ""("T""z"p"q"[A3-35_3-G35`^^A$%%%%%%%%%%%%_0%%%%%%%!%"%%%%$`^A$&I&J&K&L&M&N&O&P&Q&R&S&T_0&I&J&K&L&M&N&O G(comdienne, pour Belle Epine). Chaque soir de la semaine, une synthse et une analyse des vnementNPfreJs de la journe. Les unes de la presse du lendemain sont passes en revue.G@&P&Q&R#&S&T%U5A_|AJ_JA_!A 3_ 3WJ2 %!A 3_ 3G@ـJ EAoFoG_oFoGFzA0B|B}B~BBBBBBBBBBBBB_@B|WB} B~JBMBBKBLB$BBoBBmBnBB,B7H-G@JP freVideoP freAudioP!freDVB subtitles (normal)TeUFRA\O;W.O1,"%E MfreBULLITTBullitt (version remasterise) Ralis par Peter Yates en 1968. Avec GA!!!!!_!\!^!!!eLPA!!!"""""""_(!+!!""S"?"F"j""gM&A mmmm_mmmmR`A#G &iP ] C &% ^ C & _ C '!u ` C '(P  C Pu2G####$$$$ $ _(##'##$=$9$:$ >$ ?_(#$ S-AD\D]D^D_D`_D\D]D^D_D`TBA/X/b/g////_ GSteve McQueen, R Vaughn, J Bisset. Film policier amricain. Nfre# Ralisateur Peter YatesAnne1968Bullitt (version remasterise) Ralis par Peter Yates en 1968. Avec Steve McQueeG./X-/b/g/4/;/#/4VdA$U$V$W$X$^$i$j$k$l$r_($Ub$V^$Wc$X$^$i $j$k $l$r_( $Wp$V$UdWAz_zjX@A%%%%%Gn, R Vaughn, J Bisset. Film policier amricain. Un policier, charg d'assurer la scurit d'un truand appel tmoigner contre la maNHfreBfia, se lance dans une folle poursuite aprG@M0  gP hF j   k        -eG%_%D%Y%%%)%>_(% ZBA""""""""_ ""("T""z"p"q"[A3-35_3-35`\dA&&&&&&&&&G@K&_(&a&_&`& &&&& &&_( &E&&QؗJ ^aA'%%%%%%%%%%%%&G_0%%%%%%%!%"%%%G@as le meurtre du tmoin.P freVideoP freAudioP!freDVB subtitles (normal)TUFRA2O$lVO]!05MUfreLES PAROIS DE L'EXTREME9Documentaire allemand ralis G%$`aA'&I&J&K&L&M&N&O&P&Q&R&S&T&_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_|AJ_JA_G!A 3_ 3BBA#)#*#+#,#=#>#?#@_ #)#*#+#,#=#>#?H#@BNAe_eDA'_'n#A_Gpar Pepe Danquart en 2007. Nfre% Ralisateur Pepe DanquartAnne2007Documentaire allemand ralis par Pepe Danquart en 2007. Les exploits des frres Alexander et Thomas Huber, des G@YJ$A_<}[JBBA#)#*#+#,#=#>#?#@_ #)#*#+#,#=#>#?H#@BCAy_y5DA'_'nEAG@passionns d'altitude qui n'hsitent pas prendre tous les risques pour assouvir leur got de l'extN frerme.P freVideoP freAudioTAUFRASUeOMBFO|!EP2MtGoFoG_oFoGFzA0B|B}B~BBBBBBBBBBBBB_@B|WB} B~JBMBBKBLB$BBoBBmBnBB,B7HBA!!!!!!!!_G !\!!^!!!!e!dJA ###_ ###LPA!!!"""""""_(!+!!""S"?"F"j""gM&A mmmm_GfreENTRE LA VIE ET LA MORGUEVDocumentaire franais ralis par Eric Wastiaux en 2004. "Entre la vie et la morgue". Nfre% Ralisateur Eric WastiauxAnne2004Documentaire franais rGmmmmRPA#####$$$$ $ _(##'##$=$9$:$ >$ ?S-AD\D]D^D_D`_D\D]D^D_D`TBA/X/b/g//G//_ ./X-/b/g/4/;/#/4VgA!$U$V$W$X$^$i$j$k$l$r$_($Ub$V^$Wc$X$^$i $j$k $l$r_( $Wp$V$WdWAz_zjXGalis par Eric Wastiaux en 2004. "Entre la vie et la morgue". L'histoire de quelques personnes qui travaillent l'Institut de science mdico-lgal de Richmond, l'une des morgues les G@CA%%%%%%%_%D%Y%%%)%>_(% ZBA""""""""_ ""("T""z"p"q"æJ[A3-35_3-3Gplus Nfrerputes des Etats-Unis.P freVideoP freAudioTEUFRAUBFE PBFEBFE BFE PBFEG5`\dA&&&&&&&&&&_(&a&_&`& &&&& &&_( &E&&Q^^A$%%%%%%%%%%%%_0%%%%%%G@ !1Or 2O )!WMfreCLOCKERS(-16) Ralis par Spike Lee en 1995. Avec Harvey Keitel, Mekhi Phifer, Isaiah Washington, John Turturro. Film policier amricain. GNfre! Ralisateur Spike LeeAnne1995(-16) Ralis par Spike Lee en 1995. Avec Harvey Keitel, Mekhi Phifer, Isaiah Washington, John Turturro. Film policier amricain. Deux frres dG%!%"%%%%$`^A$&I&J&K&L&M&N&O&P&Q&R&S&T_0&I&J&K&L&M&N&O &P&Q&R#&S&T%U5A_|A_Ge Brooklyn, l'un pre de famille, l'autre petit dlinquant, se retrouventNIfreC impliqus dans une affaire de meurtre et souponns par la police.P freVideoP freAudioP engAuG@:A_!A 3_ 3BM0 5H CSATCANAL+_freET TELLEMENT PLUS ENCORE ! 5HCSAT CANAL+ DECALE_freCOMPLETEMENT DECAG@ZdioTUFRA"E 2"P 2 2!..GOWo,O/"O$a"M/GALLEMANDEmk8HCSATZDF INFO_freLA CHAINE DE NEWS DE LA ZDFmn! ӅGoooo,&A oiojomoo_oioj9omloo.lA*ABCDEFGHIJUVWX_8ABfCeD%EFGHIPJ3U<V8W/X10^A$G$`Pu C Pu  C !HPu C #%  C uPu C XPu! C $u C P  C 5  C gP G@N" 0NO"E "Mfre30 ROCKuSrie humoristique amricaine avec Julianne Moore, Tina Fey, Alec Baldwin. Saison 4. (11/22). "Le blues de l'hiver". Nfre; NbEpSerie5 NationG@           g j_0  d {  R 0 g j1&A n-n.n@nE_n-n.n@nERNJ G TNTSAT C1J0 o;AG_1O]WA!YZ^`abcdfij_,YZt^]`za^bpcdifiwjxIA_Galit Etats-UnisTDELe blues de l'hiverSrie humoristique amricaine avec Julianne Moore, Tina Fey, Alec Baldwin. Saison 4. (11/22). "Le blues de l'hiver". Alors que Liz souhaiteraitG$7h_qhA!5!8!9!:!D!E!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!g!h!k!l!m!n!o!Gp!r!s!t!u!v_!5!8=!9V!:!DZ!E[!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!g!h!kG emmener toute l'quipe du Girlie Show MiamNLfreFi, Jack prfre prendre la direction de Boston pour y retrouver Nancy.P freVideoP freAudioP engAudioTS UFRA[!yG!l!m!n!o!p!r!s!t!u!vIA'.'B'N'O'S'T'U'V'W_$'.;'B:'N'O'S8'Ty'Us'Vu'Wv-Ap1p2p3p4p5_p1p2p3p4p5#AG@_*BAoooooooo_ oo}oooooo,&A oiojomoo_oioj9omlooJ +G TNTSAT C2J0 _6( G@Nj 0N"#% 2OMfre"PAR SUITE D'UN ARRET DE TRAVAIL...Par suite d'un arrt de travail... Ralis par Frdric Andri en 2008. Avec Charles Berling, Patrick Timsit. ComdiG(0X;A_1O]WA!YZ^`abcdfij_,YZt^]`za^bpcdifiwjxIAGe franaise. Nfre' RalisateurFrdric AndriAnne2008Par suite d'un arrt de travail... Ralis par Frdric Andri en 2008. Avec Charles Berling, Patrick Timsit. Comdie franaG_$7h_qhA!5!8!9!:!D!E!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!f!gG!h!k!l!m!n!o!p!r!s!t!u!v_!5!8=!9V!:!DZ!E[!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!cGise. Deux hommes que tout oppose voyagent ensemble en voiture pour se rendre Rome : NLfreFle premier est un doux rveur, l'autre a la tte bien sur les paules.P freVideoP frG!d!f!g!h!k!l!m!n!o!p!r!s!t!u!vIA'.'B'N'O'S'T'U'V'W_$'.;'B:'N'O'S8'Ty'Us'Vu'Wv&A p1p2p3p5_p1p2p3p5

1. What is this quickstart guide ?

It this guide I’ll explain how to stream a full transponder (all the channels multiplexed on the same carrier frequency) over a network, by assigning each channel to a different multicast IP. The SAP announces will automatically be generated.

For HTTP unicast or more advanced features, please refer to the full documentation.

I’ll take an example for DVB-S (satellite) and DVB-T (terrestrial). DVB-C and ATSC are similar.

I suppose you have one DVB card wich is already working, if you have more than one card refer to the full documentation.

If you don’t know your transponder frequencies, have a look to the README_CONF

3. DVB-T

  • It’s the same way as DVB-S excepted that you need other informations for tuning your card.

You can find these informations in : /usr/share/doc/dvb-utils/examples/scan/dvb-t/ if you installed the dvb-utils package

Your config file will be :

autoconfiguration=full
freq=__frequency in kHz__
Note
If your bandwith is different from 8Mhz or if you experience tuning issues, look for the following parameters in README_CONF : bandwidth, qam, trans_mode, guardinterval, coderate
Note
The SAP (session announcement protocol) announces will be sent automatically.

4. Troubleshooting

  • Try adding one ore several -v to the mumudvb command line to have more detailled messages

  • If you experience tuning issues, try with other dvb software like scan or szap and check your parameters

  • If it still don’t work, look at common issues in the README and you can contact (see the README for getting the e-mail addresses)

Note
When contacting about an issue, please join the config file used and the output of MuMuDVB in verbose mode ( -vvv on the command line) and any other information that could be useful.