summaryrefslogtreecommitdiffstats
path: root/abs/core-testing/local-website/htdocs/mythtv-doc/doxygen-architecture-document.cpp
diff options
context:
space:
mode:
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.cpp787
1 files changed, 0 insertions, 787 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
deleted file mode 100644
index 16ad56d..0000000
--- a/abs/core-testing/local-website/htdocs/mythtv-doc/doxygen-architecture-document.cpp
+++ /dev/null
@@ -1,787 +0,0 @@
-/**
-\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 .
- */