diff options
author | James Meyer <james.meyer@operamail.com> | 2008-10-23 01:40:37 (GMT) |
---|---|---|
committer | James Meyer <james.meyer@operamail.com> | 2008-10-23 01:40:37 (GMT) |
commit | 7f24a313f0815854ff88a0e33a066a73de4f3be1 (patch) | |
tree | 63f1de317bd6d4d3b283939c3481c3ed3e4e71f9 /abs/core-testing/local-website/htdocs/mythtv-doc/doxygen-architecture-document.cpp | |
parent | de2ffe85032410437eb7dabdec63031e908fd43c (diff) | |
download | linhes_pkgbuild-7f24a313f0815854ff88a0e33a066a73de4f3be1.zip linhes_pkgbuild-7f24a313f0815854ff88a0e33a066a73de4f3be1.tar.gz linhes_pkgbuild-7f24a313f0815854ff88a0e33a066a73de4f3be1.tar.bz2 |
initial checkin of lighttpd and supporting libs.
Also included is a new package callede local-website.
This package contains the contents of http://localhost that runs on every LinHES box.
The initial checkin is taken from R5.5
Diffstat (limited to 'abs/core-testing/local-website/htdocs/mythtv-doc/doxygen-architecture-document.cpp')
-rw-r--r-- | abs/core-testing/local-website/htdocs/mythtv-doc/doxygen-architecture-document.cpp | 787 |
1 files changed, 787 insertions, 0 deletions
diff --git a/abs/core-testing/local-website/htdocs/mythtv-doc/doxygen-architecture-document.cpp b/abs/core-testing/local-website/htdocs/mythtv-doc/doxygen-architecture-document.cpp new file mode 100644 index 0000000..16ad56d --- /dev/null +++ b/abs/core-testing/local-website/htdocs/mythtv-doc/doxygen-architecture-document.cpp @@ -0,0 +1,787 @@ +/** +\mainpage MythTV Architecture + +\section intro Introduction + +Over the last couple years %MythTV has grown into a rather large +application. The purpose of these pages is to provide a portal +into the code for developers to get their heads around it. +This is intended for both those new to %MythTV and experienced +with it to get familiar with different aspects of the code base. + +If you are just looking for the code formatting standards, +see the official %MythTV wiki article +<a href="http://www.mythtv.org/wiki/index.php/Coding_Standards"> +coding standards</a>. If you are looking for the +<a href="http://svn.mythtv.org/trac/wiki/TicketHowTo">bug tracker</a>, +it can be found on the official pages. +If you haven't already, you should subscribe to +the <a href="http://www.mythtv.org/mailman/listinfo/mythtv-dev/"> +developer mailing list</a> and the <a href="http://www.mythtv.org/mailman/listinfo/mythtv-commits/">SVN commits mailing list</a> + +If you just stumbled onto the developer pages +by accident, maybe you want to go to the official +<a href="http://www.mythtv.org/modules.php?name=MythInstall">%MythTV +Installation page</a>. There is also a good unofficial +<a href="http://wilsonet.com/mythtv/fcmyth.php">Fedora %MythTV installation</a> page, +and a +<a href="http://dev.gentoo.org/~cardoe/mythtv/">Gentoo %MythTV installation</a> page. + +If you are new to Qt programming it is essential that you keep in mind +that almost all Qt objects are not thread-safe, including QString. +Almost all Qt container objects, including QString, make shallow copies +on assignment, the two copies of the object must only be used in one +thread unless you use a lock on the object. You can use the +<a href="http://doc.trolltech.com/3.1/qdeepcopy.html">QDeepCopy</a> +template on most Qt containers to make a copy you can use in another +thread. + +There are also special dangers when +\ref qobject_dangers "using QObject" outside the Qt event thread. + +The is also short HOWTO on \ref profiling_mythtv available in addition +to documentation on the code itself. + +\section libs Libraries + +%MythTV is divided up into eleven libraries: +<dl> + <dt>libmyth <dd>Core %MythTV library. Used by the Plugins. + The \ref database_subsystem "database", + \ref audio_subsystem "audio", + \ref lcd_subsystem "LCD", + \ref osd_subsystem "OSD", + \ref lirc_subsystem "LIRC", and the + \ref myth_network_protocol "myth network protocol" are supported by libmyth. + <dt>libmythtv <dd>%MythTV %TV functionality library. + The + \ref recorder_subsystem "recorders", \ref video_subsystem "video" and + \ref av_player_subsystem "A/V players" are supported by libmythtv. + <dt>libmythui <dd>Main user interface rendering library + <dt>libavcodec/libavformat/libavutil + <dd>This is the ffmpeg A/V decoding library (aka avlib). + <a href="http://ffmpeg.mplayerhq.hu/documentation.html">Documented Externally</a>. + <dt>libmythmpeg2 <dd>Alternate MPEG-1/2 A/V decoding library. + <a href="http://libmpeg2.sourceforge.net/">External Website</a>. + <dt>libmythsamplerate <dd>Audio resampling library + <a href="http://www.mega-nerd.com/SRC/api.html">Documented Externally</a>. + We use this to support a different output sample rates than the sample + rate used in the audio streams we play. + <dt>libmythsoundtouch <dd>Pitch preserving audio resampling library. + <a href="http://www.surina.net/soundtouch/">External Website</a>. + We use this for the time-stretch feature. + <dt>libmythdvdnav + <dd>Used for navigating DVD menus when using the internal player + <dt>libmythfreemheg <dd>UK interactive %TV viewer + <dt>libmythlivemedia <dd>Support for the FreeBox recorder device + <dt>libmythupnp <dd>Initial uPnP (universal Plug and Play) support +</dl> +Two libraries libmythmpeg2 and libmythsamplerate appear redundant, but +libmpeg2 decodes MPEG-2 more quickly than ffmpeg on some systems, and +libmythsamplerate resamples audio with better quality when we only need +to match the hardware sample rate to the A/V streams audio sample rate. + +\section db Database Schema +The database schema is documented here \ref db_schema. + +\section apps Applications +%MythTV contains 14 applications: + +<dl> + <dt>mythbackend <dd>This is the backend which runs the recorders. + <dt>mythfrontend + <dd>This is the frontend which is the main application + for viewing programs and using the %MythTV plugins. + <dt>mythtv-setup <dd>This is the program which sets up the database + to use a machine as a backend server. + <dt>mythtv <dd>This was an "External Player" used to play videos + from within mythfrontend. Setting the player command + to "internal" does the same thing now. This is handy + for testing the audio and videoout code, though. + <dt>mythtvosd + <dd>This is used externally by programs that want to pop-up an + <i>on screen display</i> in %MythTV while one is watching a recording. + <dt>mythfilldatabase + <dd>This is used both internally and externally to fetch program listings. + <a href="http://tms.tribune.com/">Tribune Media</a> provides + listings in exchange for demographic information in the USA, + and Australia uses a + <a href="http://minnie.tuhs.org/twiki/bin/view/TVGuide"> + community-driven TV guide</a> originally developed for OzTiVo. + Other markets are served by the + <a href="http://membled.com/work/apps/xmltv/xmltv">XMLTV</a> + web spiders. + <dt>mythtranscode <dd>This is used both internally and externally to + transcode videos from one format to another. + This is used to shrink HDTV programs to lower + quality recordings that match the hardware the + user has. + <dt>mythjobqueue <dd>This is used internally by mythfrontend to schedule + jobs such as commercial flagging and transcoding. + <dt>mythcommflag <dd>This is used internally by mythfrontend to flag + commercials. + <dt>mythepg <dd>This is used internally by mythfrontend to find + upcoming programs to record based on the channel + and time. + <dt>mythprogfind <dd>This is used internally by mythfrontend to find + programs to record based on the first letter of + the program name. + <dt>mythuitest <dd>This is a test program for libmythui development. + <dt>mythlcdserver <dd>This is an interface between a number of Myth + clients and a small text display (LCDProc server). + <dt>mythwelcome/mythshutdown + <dd>These programs manage Power Saving (shutdown/wakeup) on your Myth PCs. +</dl> + +\section fe_plugins Frontend Plugins +<dl> + <dt>mytharchive <dd>Creates themed Video DVDs from recordings + (and other video files). + <dt>mythbrowser <dd>Provides a simple web browser. + <dt>mythcontrols<dd>Editor for Myth Key bindings, \e et \e c. + <dt>mythflix <dd> + <dt>mythgallery <dd>A simple picture viewer for your %TV. + <dt>mythgame <dd>Launches the xmame classic game system emulator. + <dt>mythmovies <dd> + <dt>mythmusic <dd>A simple music player for your %TV. + <dt>mythnews <dd>Browses RSS news feeds. + <dt>mythphone <dd>SIP based video phone. + <dt>mythvideo <dd>Launch DVD players, and a Video Browser for other files + (non-%MythTV recordings). + <dt>mythweather <dd>Presents your local weather report. + <dt>mythzoneminder<dd> +</dl> + +\section be_plugins Backend Plugins +<dl> + <dt>mythweb <dd>Provides a PHP based web pages to control mythbackend. +</dl> + +\section spt_scripts Support Scripts +These tools are in the contrib directory of the source tree: +<dl> + <dt>osx-packager.pl <dd>Downloads and builds all dependencies, then the + source, of %MythTV and all the official plugins, + on Mac OS 10.3 thru 10.5 + <dt>win32-packager.pl <dd>Similar tool for Windows XP +</dl> + */ + +/** \defgroup database_subsystem Database Subsystem + \todo No one is working on documenting the database subsystem. + +There are a few classes that deal directly with the database: +MythContext, MSqlDatabase, DBStorage, MDBManager, SimpleDBStorage. + +And one function UpgradeTVDatabaseSchema() located in dbcheck.cpp. + +MythTV's Configurable widgets also do save and restore their values +from the database automagically when used in %MythTV's window classes. + */ + +/** \defgroup audio_subsystem Audio Subsystem + \todo Ed W will be documenting the audio subsystem. + */ + +/** \defgroup lcd_subsystem LCD Subsystem + \todo No one is working on documenting the LCD Subsystem + */ + +/** \defgroup osd_subsystem OSD Subsystem + \todo No one is working on documenting the OSD Subsystem + */ + +/** \defgroup lirc_subsystem LIRC Subsystem + \todo No one is working on documenting the LIRC Subsystem + */ + +/** \defgroup video_subsystem Video Subsystem + \todo No one is working on documenting the video subsystem + */ + +/** \defgroup recorder_subsystem Recorder Subsystem +This line is filler that is ignored by Doxygen. + +TVRec is the main class for handling recording. +It is passed a ProgramInfo for the current and next recordings, +and in turn creates three main worker classes: +<dl> + <dt>RecorderBase <dd>Recordings from device into RingBuffer. + <dt>ChannelBase <dd>Changes the channel and other recording device attributes. Optional. + <dt>RingBuffer <dd>Handles A/V file I/O, including streaming. +</dl> + +%TVRec also presents the public face of a recordings to the +\ref myth_network_protocol, and hence the rest of %MythTV. This +means that any call to the %RecorderBase, %RingBuffer, or +%ChannelBase is marshalled via methods in the %TVRec. + +RecorderBase contains classes for recording %MythTV's +specialized Nuppel Video files, as well as classes for +handling various hardware encoding devices such as MPEG2, +HDTV, DVB and Firewire recorders. +ChannelBase meanwhile only contains three subclasses, %Channel +for handling v4l and v4l2 devices, and %DVBChannel and +%FirewireChannel, for handling DVB and Firewire respectively. +Other channel changing hardware use ChannelBase's external +channel changing program support. +Finally, RingBuffer does all reading and writing of A/V files +for both TV (playback) and %TVRec, including streaming +over network connections to the frontend's %RingBuffer. + +%TVRec has four active states, the first three of which +correspond to the same states in %TV: kState_WatchingLiveTV, +kState_WatchingPreRecorded, kState_WatchingRecording, and +kState_RecordingOnly. +When watching "Live TV" the recorder records whatever the +frontend requests and streams it out using the %RingBuffer, +this may be to disk or over the network. +When watching pre-recorded programs %TVRec simply streams a +file on disk out using the %RingBuffer. +When just watching a recording, %TVRec continues a recording +started as recording-only while simultaneously streaming out +using the %RingBuffer. +Finally, when in the recording-only mode the recording +is only saved to disk using %RingBuffer and no streaming +to the frontend is performed. + +%TVRec also has three additional states: kState_Error, +kState_None, kState_ChangingState. The error state allows +%MythTV to know when something has gone wrong. The null or +none state means the recorder is not doing anything and +is ready for commands. Finally, the "ChangingState" state +tells us that a state change request is pending, so other +state changing commands should not be issued. + +\todo Check if the TVRec is actually still passed a ProgramInfo for the current and next recordings + +\todo Document the massive changes Daniel has made in the Vid and MultiRec branches + */ + +/** \defgroup av_player_subsystem A/V Player Subsystem +This line is filler that is ignored by Doxygen. + +TV is the main class for handling playback. +It instantiates several important classes: +<dl> +<dt>NuppelVideoPlayer <dd>Decodes audio and video from the RingBuffer, then plays and displays them, resp. +<dt>RemoteEncoder <dd>Communicates with TVRec on the backend. +<dt>OSD <dd>Creates on-screen-display for NuppelVideoPlayer to display. +<dt>RingBuffer <dd>Handles A/V file I/O, including streaming. +</dl> + +NuppelVideoPlayer is a bit of a misnomer. This class plays all video formats +that %MythTV can handle. It creates AudioOutput to handle the audio, a FilterChain +to perform post-processing on the video, a DecoderBase class to do the actual +video decoding, and a VideoOutput class to do the actual video output. See +that class for more on what it does. + +%TV has three active states that correspond to the same states in TVRec: +kState_WatchingLiveTV, kState_WatchingPreRecorded, kState_WatchingRecording. +When watching "LiveTV" the %TVRec via RemoteEncoder responds to channel +changing and other commands from %TV while streaming the recording to +%TV's %RingBuffer. +When watching a pre-recorded stream, a recording is streamed from TVRec's +%RingBuffer to %TV's %RingBuffer, but no channel changing commands can be +sent to TVRec. +When watching an 'in-progress' recording things work pretty much as when +watching a pre-recorded stream, except %TV must be prevented from seeking +too far ahead in the program, and keyframe and commercial flags must be +synced from the recorder periodically. + +%TV also has three additional states: kState_Error, +kState_None, kState_ChangingState. The error state allows +%MythTV to know when something has gone wrong. The null or +none state means the player is not doing anything and +is ready for commands. Finally, the "ChangingState" state +tells us that a state change request is pending, so other +state changing commands should not be issued. + + */ + +/** \defgroup plugin_arch Plugin Architecture +This line is filler that is ignored by Doxygen. + +MythPlugins are shared object files (<I>i.e.</I> libraries) which are loaded +from a specific directory (<I>%e.g.</I> /usr/local/lib/mythtv/plugins). +Currently, all plugins are written in the C++ language, but there is nothing +preventing other languages being used (the functions are in the C name space). + +int mythplugin_init(const char *libversion); is invoked whenever mythfrontend +is started. This typically handles upgrading any database records - it will be +the first method called after a new version of the plugin has been installed. + +int mythplugin_run(); is invoked when the action attribute of a menu item +requests it via the PLUGIN directive. This is when the user chooses to enter +the plugin from the main menu or the appropriate submenu. + +int mythplugin_config(); is invoked when the action attribute of a menu item +requests it via the CONFIGPLUGIN directive. This should be when the users +wishes to change the plugin's settings (in the main Setup menu). + +Other plugin functions are listed in the file \link mythpluginapi.h \endlink +(see also the \link MythPlugin \endlink + and \link MythPluginManager \endlink classes.) + +*/ + +/** \defgroup mtd MTD (the Myth Transcoding Daemon) +This line is filler that is ignored by Doxygen. + +The %MTD is a simple program that is used by the MythVideo plugin. + +It currently \b only transcodes tracks from DVDs, but could in the +future also rip CD/VCD tracks, transcode %TV recordings, \e et \e cetera. + +The DVD Rip screen will offer to start %MTD if it is not running. +It does \b not currently shut it down afterwards, though. + +By default, the %MTD listens on port 2442, for commands of this format: + +\verbatim +halt +quit +shutdown +\endverbatim +- Tells the %MTD to wait for all jobs to finish, stop listening, and exit. + +\verbatim +hello +\endverbatim +- Send a trivial response if the %MTD is listening. + +\verbatim +status +\endverbatim +<B>\verbatim +status dvd summary 1 +status dvd job 0 overall 0.0262568 ISO copy of UNTITLED +status dvd job 0 subjob 0.0262568 Ripping to file ~ 00:08/05:04 +status dvd complete +\endverbatim</B> +- Sends a response listing the status of all jobs. + +\verbatim +media +\endverbatim +<B>\verbatim +media dvd summary 1 UNTITLED +media dvd title 1 1 1 0 5 27 8 +media dvd title-audio 1 1 2 nl ac3 2Ch +media dvd complete +\endverbatim</B> +- Sends a detailed list of titles/tracks on the current disk. + +\verbatim +job dvd TITLE AUDIOTRK QUALITY AC3 SUBTITLETRK DESTPATH +\endverbatim +\verbatim +e.g. job dvd 1 1 -1 0 -1 /myth/video/UNTITLED +\endverbatim +- Starts a transcoding job. TITLE, AUDIOTRK and SUBTITLETRK are integers + to select the track details. AC3 is 0 or 1. DESTPATH is the output file. + QUALITY is one of enum \ref RIP_QUALITIES (-1, 0 or 1). + +\verbatim +abort dvd job NNNN +\endverbatim +- Stops the job identified by the job number NNNN. + +\verbatim +use dvd PATH +\endverbatim +- Check dvd PATH is usable, and if so set the current drive to it. + +\verbatim +no dvd +\endverbatim +- Forget about the current dvd path, ending any jobs that are trying to read it. + +\verbatim +no dvd PATH +\endverbatim +- End any jobs that are reading from dvd PATH, and if it is the current drive, + forget about it. + */ + +/** \defgroup myth_media Myth Media Manager +This line is filler that is ignored by Doxygen. + +The Myth Media Manager is a thread in the frontend which looks for any +changes to removable media, and sends events to any Frontend Plugins +which are interested in that media. + +At startup, it creates a list of MythMediaDevice objects (currently +MythHDD or MythCDROM and its subclasses) for each removable device +configured on the system. A runtime loop then monitors each of these +via its checkMedia() method. + +When any of these devices change status, a MediaEvent object is created. +If the device has a status which is usable, the window jumps to the main menu +(to allow the registered jump to work correctly), and the event is dispatched +to the relevant plugin's registered media handler. If the device status is +unusable (<I>%e.g.</I> ejected), the plugin's media handler is called directly +(so it can "forget" about this device). + +The following tables show +typical status transitions for CD/DVD and USB flash drive devices: + +\verbatim + CD/DVD USB/FireWire HDD +State Action State Action +-------------------------------------------------- +NODISK NODISK + eject attach +OPEN USEABLE + insert disk, close detach +USEABLE UNPLUGGED + mount +MOUNTED + unmount +NOTMOUNTED +-------------------------------------------------- +\endverbatim + */ + +/** \defgroup myth_network_protocol Myth Network Protocol +This line is filler that is ignored by Doxygen. + +The MythTV backend process currently opens sockets for three different types +of commands; a custom protocol (by default at port 6543), +an HTML server (by default <A HREF="http://127.0.0.1:6544"> +http://127.0.0.1:6544 +</A> for the status, and other services under that, like +< HREF="http://127.0.0.1:6544/Myth/GetMusic?Id=1"> +http://127.0.0.1:6544/Myth/GetMusic?Id=1 +</A>), and a UPnP media server (several ports that I cannot +remember right now that throw around lots of little bits of XML :-) + +The custom protocol is an ASCII encoded length and command string. +Command sequences can be easily sent to the backend using telnet. +<I>%e.g.</I> \verbatim telnet 127.0.0.1 5432 +Trying 127.0.0.1... +Connected to localhost. +Escape character is '^]'.\endverbatim +<B>\verbatim21 MYTH_PROTO_VERSION 36 23 ANN Playback hostname 1 10 QUERY_LOAD 4DONE\endverbatim</B> +\verbatim13 ACCEPT[]:[]362 OK34 0.919922[]:[]0.908203[]:[]0.856445Connection closed by foreign host.\endverbatim +The command string is prefixed by 8 characters, containing the length +of the forthcoming command. This can be justified in any way +(as the above example shows) + +The backend responds with a length, and the response to the command. +This can be numbers (up to 32 bit, represented in ASCII), +a single string, or an ASCII encoding of a QStringList. +The 5 byte sequence "[]:[]" seperates items in the stringlist. +Any 64 bit numbers are represented as a stringlist of two 32bit words +(MSB first). + +\section commands Commands + +There are three main types of networking interactions in MythTV; +identification commands (which tell the backend about this client), +query commands that are sent to the master backend +(<I>%e.g.</I> listing recordings or viewing guide data), and +file streaming commands (when a frontend is watching or editing a recording). + +Until a client is identified to the backend (via the ANN commands), +any of the query or file streaming commands will silently fail. + +The following summarises some of these commands. +For a full understanding of all the commands, either read the source code +(programs/mythbackend/mainserver.cpp), or look on the Wiki +(http://www.mythtv.org/wiki/index.php/Myth_Protocol_Command_List). + + */ + +/** \defgroup qobject_dangers QObject is dangerous for your health +This line is filler that is ignored by Doxygen. + +QObject derived classes can be quite useful, they can send and receive +signals, get keyboard events, translate strings into another language +and use QTimers. + +But they also can't be \ref qobject_delete "deleted" easily, they +are not \ref qobject_threadsafe "thread-safe", can't participate +as equals in multiple \ref qobject_inheritence "inheritence", can +not be used at all in virtual \ref qobject_inheritence "inheritence". + +\section qobject_delete Deleting QObjects + +The problem with deleting QObjects has to do with signals, and events. +These can arrive from any thread, and often arrive from the Qt event +thread even if you have not explicitly requested them. + +If you have not explicitly connected any signals or slots, and the +only events you might get are dispatched with qApp->postEvent(), +not qApp->sendEvent(), then it is safe to delete the QObject in the +Qt event thread. If your QObject is a GUI object you've passed +given to Qt for it to delete all is good. If your object is only +deleted in response to a posted event or a signal from the Qt event +thread (say from a QTimer()) then you are OK as well. + +If your class may be deleted outside a Qt thread, but it does not +explicitly connect any signals or slots, and the only events it +might get are dispatched with qApp->postEvent(), then you can +safely use deleteLater() to queue your object up for deletion +in the event thread. + +%MythTV is a very much a multithreaded program so you may need to have +a QObject that may get events from another thread if you send signals +but do not get any signals and or events from outside the Qt event +thread, then you can use deleteLater() or delete depending on whether +you are deleteing the QObject in the event thread, see above. But +if you are not in the Qt event thread then you need to call disconnect() +in the thread that is sending the signals, before calling deleteLater(). +This prevents your object from sending events after you consider it +deleted (and begin to delete other QObjects that may still be getting +signals from your object.) + +What about if you are getting events via qApp->sendEvent() or a signal +from another thread? In this case things get complicated, so we highly +discourage this in %MythTV and prefer that you use callbacks if at all +possible. But in say you need to do this, then you need to disconnect +all the signals being sent to your QObject. But disconnect() itself +is not atomic. That is you may still get a signal after you disconnect +it. What you need to is disconnect the signal from your slot in the +thread that is sending the signal. This prevents the signal from +being emitted while you are disconnecting. Doing this gracefully is +left as an excersize for the reader. + +Ok, so the above is not entirely complete, for instance you could wrap +every signal emit in an instance lock and reimplement a disconnect +that uses that instance lock. But if you've figured this or another +solution out already all you need to know is that almost all Qt +objects are reenterant but not thread-safe, and that QObjects recieve +events and signals from the Qt event thread and from other threads +if you use qApp->sendEvent() or send signals to it from another thread. + +\section qobject_threadsafe QObject thread-safety + +The only thread-safe classes in Qt are QThread and the mutex classes. +when you call any non-static QObject method you must have a lock on +it or make sure only thread ever calls that function. + +QObject itself is pretty safe because when you assign one QObject to +another you make a copy. Qt's container classes, including QString +do not make a copy but rather pass a reference counted pointer to +the data when you assign one to another. This reference counter is +not protected by a mutex so you can not use regular assignment when +passing a QString or other Qt container from one thread to another. + +In order to use these classes safely you must use +<a href="http://doc.trolltech.com/3.1/qdeepcopy.html">QDeepCopy</a> +when passing them from one thread to another. This is thankfully quite +easy to use. + +\code + QString original = "hello world"; + QString unsafe = original; + QString safe = QDeepCopy<QString>(original); +\endcode + +In this case safe and original can be used by two seperate +threads, while unsafe can only be used in the same thread +as originalStr. + +The QDeepCopy template will work on the most popular Qt containers, +for the ones it doesn't support you will have to copy manually. + +\section qobject_inheritence QObject inheritence + +You can not inherit more than one QObject derived class. +This is because of how signals and slots are implemented. What +happens is that each slot is transformed into an integer that +is used to find the right function pointer quickly when a signal +is sent. But if you have more than one QObject in the inheritence +tree the integers will alias so that signals intended for the +second slot in parent class B might get sent to the second slot +in parent class A instead. Badness ensues. + +For the similar reason you can not inherit a QObject derived +class virtually, in this case the badness is a little more +complicated. The result is the same however, signals arrive +at the wrong slot. Usually, what happens is that the developer +tries to inherit two QObject derived classes but gets linking +errors, so they make one or more of the classes virtual, or +inherit a QObject non-virtually but then also inherit one +or more QObject derived classes virtually. The linker doesn't +complain, but strange unexplainable behaviour ensues when +the application is run and signals start showing up on the +wrong slots. + +*/ + +/** \defgroup profiling_mythtv Profiling MythTV +This line is filler that is ignored by Doxygen. + +You can use any sampling profiler to profile %MythTV, the most +popular GPL one is OProfile and this section tells you how to +use it to profile %MythTV. For Intel also makes VTune, AMD +makes CodeAnalyst, and Apple makes Shark. These all work +similarly to oprofile, so the %MythTV portions are the same. + +This do not describe how to install oprofile. There are a +few cotchas on installation: You must have APIC enabled to +use performance counters. This is usually the default, but +you may want to check this in your kernel configuration. You +also need the oprofile module, this is part of the kernel +config in Linux 2.6+, but must be compiled seperately for +earlier kernels. Finally, some RedHat kernels does not work +with the standard oprofile, so you must use the RedHat +version of oprofile, or compile your own kernel. + + +\section prof_compile Compiling MythTV for profiling + +The first thing you need to do is compile with profiling in +mind. %MythTV has three compile types "release", "debug" and +"profile". The "release" type enables optimizations that +make debugging practically impossible, while "debug" has so +few optimizations that profiling it usually won't tell you +where the real performance problems are. The "profile" compile +type enables the all the optimizations in "release" but also +enables debugging symbols, so that you know which functions +are the CPU hogs. + +So we configure thusly: +\code + make distclean + ./configure --compile-type=profile --enable-proc-opt [+your normal opts] +\endcode + +The "make distclean" clears out all your old binaries and the the configure +sets the compile type approriately. You may not want the "--enable-proc-opt" +if you plan on making a package for other CPUs. This only makes about a +10% difference in playback speed because MMX and CMOV are enabled for +CPUs that support them regardless of this option. + +Next, you compile and install %MythTV as you normally would. +\code + qmake; make -j2 -k + su + make install +\endcode + + +\section prof_init Initializing profiler + +Most sampling profilers, OProfile included, require a kernel module so +this module must be loaded. In oprofile's case the module gets confused +when it has been loaded a long time, so it is best to begin each session +by shutting down the OProfile server and reloading the module: + +\code + opcontrol --deinit + opcontrol --init +\endcode + +You also will want to tell the profiler whether to profile the +kernel as well, if you want the kernel profiled, and assuming +your compiled kernel is in /usr/src/linux, issue this command: +\code + opcontrol --vmlinux=/usr/src/linux/vmlinux +\endcode +If you don't want it in your profile report, use this command: +\code + opcontrol --no-vmlinux +\endcode +Normally, you don't need it when profiling %MythTV, but there are +times when the kernel is a bottleneck. For example when writing +streams to disk is taking too long. + +Now all CPU's are not profiled the same way. In the days of olde, +a sampling profiler would hook into the clock interupt and record +the instuction pointer's location at the instant the interrupt was +triggered. But the wall clock timer still ticks as often as it did +when CPU's ran at 5 Mhz, and now they run almost a thousand times +faster. Such a profile would now take a thousand times longer than +it did in 1985. + +So modern processors include explicit support for profiling. For, +example the Pentium Pro has the INST_RETIRED counter, the Pentium 4 +has the INSTR_RETIRED counter, the AMD64 has the RETIRED_INSNS +counter, etc. For a full list see the +<a href="http://oprofile.sourceforge.net/docs/">OProfile documentation</a>. +You need to find a performance counter you can use for your CPU, +after you've run "opcontrol --init" you can run the following command: +\code + opcontrol --list-events +\endcode +And it will list all the performance counters available with your +CPU. You need to pick the best one for what you want to measure, +for overall performance you want something line INSTR_RETIRED. + +For an Intel Pentium 4, the following will work +\code + opcontrol -e INSTR_RETIRED:6000:0x0f:0:1 +\endcode + +This tells OProfile to schedule an interrupt on every 6000th +instruction that finishes and matches the flag 0x0f. You +could also count cycles when not in idle for the same type of +measurements. The last two numbers tell OProfile it should not +profile the kernel and should profile userspace, if you want +to profile the kernel as well you need to replace the zero with +a one. + +It is possible to profile in oprofile the old fashioned way, by +using the real-time-clock. But you must compile your Linux kernel +WITHOUT RTC support, and run %MythTV significantly longer to get +enough samples for a good report. + + +\section prof_run Running Profiler + +Normally, oprofile will tell you about everything running in +its reports. You can limit what information is collected by +running a opcontrol command such as: +\code + opcontrol --image=/usr/local/bin/mythfrontend +\endcode +This tells OProfile to only profile the frontend. + +Now you want to start %MythTV as usual: + +Then begin doing whatever you want to profile, then issue these +commands: +\code + opcontrol --reset ; opcontrol --start +\endcode + +After a few seconds/minutes your should have collected enough data. +Then you want to issue the following commands: +\code + opcontrol --shutdown + opreport --merge tgid -l --image-path=/usr/local/bin > report.txt +\endcode + +Now you can peruse the report at your pleasure. + +This should be enough to get you started with finding and fixing +performance problems in %MythTV, but there is more information +available from the +<a href=http://oprofile.sourceforge.net/doc/index.html>OProfile manual</a>. +This includes information on constructing callgraphs, producing +an annotated versions of the code, and saving results. + +*/ + +// The file ac3.h in ffmpeg contains no Doxygen markup, +// but for some reason generates the following modules: +// * Coded elements +// * Derived values +// +// They add nothing useful to this programmer doco, so I camouflage these +// by manually defining the block here. Same thing for the few modules +// in ffmpeg that are documented; Macroblock and VC9 bitplanes from vc1.c, +// Monkey Audio from apedec.c, multithreaded slicing from h264.h, + +/** + @defgroup coded . + @defgroup derived . + @defgroup block . + @defgroup std_mb . + @defgroup rangecoder . + @defgroup multithreading . + @defgroup bitplane . + */ |