| Phonon backend |
| -------------- |
| |
| The phonon design is based around forming graphs using 3 basic components: |
| |
| - a source component that generates raw audio/video/subtitle data, aka |
| MediaObject. |
| - an effect component that applies effects to raw audio/video known as |
| AudioPath/VideoPath respectively. Subtitles are routed to a VideoPath |
| - output components that render audio or video called AudioOutput and |
| VideoOutput. |
| |
| there is also a special input object that allows for feeding raw data in the |
| pipeline and specialized sinks to retrieve audio samples and video frames from |
| the pipeline. |
| |
| A typical graph or a source that produces an audio and a video stream that |
| need to be played. The VideoPath and AudioPath typically contain no filters |
| in this case: |
| |
| +----+ +--- |
| | FX | | ... |
| +----+ +--- |
| V V |
| +-----------+ +-------------+ |
| ----->| VideoPath |----->| VideoOutput | |
| | +-----------+ +-------------+ |
| +-------------+ |
| | MediaObject | |
| +-------------+ |
| | +-----------+ +-------------+ |
| +---->| AudioPath |----->| AudioOutput | |
| +-----------+ +-------------+ |
| ^ ^ |
| +----+ +--- |
| | FX | | ... |
| +-+--+ +--- |
| |
| - This is very similar to a regular gstreamer playback pipeline. |
| |
| A typical graph of playing and crosfading two sources: |
| |
| +--------+ |
| | volume | |
| +--------+ |
| V |
| +-------------+ +-----------+ |
| | MediaObject |--->| AudioPath |\ |
| +-------------+ +-----------+ \ +-------------+ |
| ---->| AudioOutput | |
| +-------------+ +-----------+ / +-------------+ |
| | MediaObject |--->| AudioPath |/ |
| +-------------+ +-----------+ |
| ^ |
| +--------+ |
| | volume | |
| +--------+ |
| |
| - As soon as two audio paths are connected to one sink, the input signals are |
| mixed before sending them to the sink. The mixing is typically done in the |
| audio sink by an element such as adder. |
| |
| Other types of graphs are possible too: |
| |
| +-----------+ |
| /| AudioPath |\ |
| +-------------+ / +-----------+ \ +-------------+ |
| | MediaObject |-- ---->| AudioOutput | |
| +-------------+ \ +-----------+ / +-------------+ |
| \| AudioPath |/ |
| +-----------+ |
| |
| - This graph sends the same out data to 2 effect filter graphs and then mixes |
| it to an audio output. The splitting of the graph typically happens with a |
| tee element after the media object. |
| |
| |
| Questions |
| --------- |
| |
| 1) do the following chains run |
| |
| - synchronized with a shared clock? |
| |
| +-------------+ +-----------+ +-------------+ |
| | MediaObject |--->| AudioPath |--->| AudioOutput | |
| +-------------+ +-----------+ +-------------+ |
| |
| +-------------+ +-----------+ +-------------+ |
| | MediaObject |--->| VideoPath |--->| VideoOutput | |
| +-------------+ +-----------+ +-------------+ |
| |
| - no API to set both MediaObjects atomically to play so it is assumed that |
| the playback starts and follows the rate of the global clock as soon as |
| the MediaObject is set to play. This makes unconnected chains run as if |
| they were in different GstPipelines. |
| |
| 2) Threading: |
| |
| - Can signals be emited from any thread? |
| - what operations are permited from a signal handler? |
| |
| 3) Error reporting |
| |
| - How does error reporting work? |
| * an audio/video device/port is busy. |
| * a fatal decoding error occured. |
| * a media type is not supported |
| |
| |
| General |
| ------- |
| |
| - Setting up KDE and Phonon build environment |
| - Testing, identifying test applications, building test cases |
| - Asking questions to Phonon maintainers/designers |
| |
| Essential classes |
| ----------------- |
| |
| These classes are essential to implement a backend and should be implemented |
| first. |
| |
| Phonon::BackendCapabilities |
| |
| Mostly exposes features in the registry like available decoders and effects. |
| |
| Phonon::Factory |
| |
| Entry point for the GStreamer backend. Provides methods to create instances of |
| object from our backed. |
| |
| |
| Simple playback |
| --------------- |
| |
| The following classes need to be implemented in order to have simple playback |
| capabilities from the backend. |
| |
| Phonon::AudioOutput |
| |
| - Wrapper around audiosinks. Also needs provision for rate and format |
| conversions. |
| - Mixing capabilities in the case when 2 audio paths are routed to it. |
| |
| Notes: |
| |
| * is the volume related to the device or to the connection to the device. |
| |
| Phonon::VideoWidget |
| |
| - Wrapper around videosinks. Also needs provision for colorspace and size |
| conversions. Extends QWidget and probably needs to hook into the XOverlay |
| stuff to draw in the QT widget. Supports fullscreen mode with a switch. |
| |
| - Needs mixing capabilities in the case when 2 video paths are routed to it. |
| |
| Phonon::AbstractMediaProducer |
| |
| - contains stream selection |
| - play/pause/stop |
| - seeking |
| - periodically performs tick callbacks. |
| |
| Phonon::MediaObject: |
| |
| - The object that decodes the media into raw audio/video/subtitle. |
| This object will use the GStreamer decodebin element to perform the |
| typefinding and decoding. |
| |
| Phonon::AudioPath/Phonon::VideoPath |
| |
| - Simple container for audio/video effect plugins. |
| - Handles adding/removing of effects, making sure that the streaming is not |
| interrupted and the formats are all compatible. |
| |
| |
| Effect support |
| -------------- |
| |
| Phonon::Visualization |
| |
| Connects an AudioPath to a VideoWidget and allows for selection of a |
| visualisation plugin. |
| |
| Phonon::AudioEffect/Phonon::VideoEffect |
| |
| Base classes |
| |
| Phonon::VolumeFaderEffect |
| |
| Alows fade-in and fade-out with a configurable curve and time. Needs |
| GstController. |
| |
| Phonon::BrightnessControl |
| |
| Controls the brightness of video. |
| |
| |
| Playlist support |
| ---------------- |
| |
| Phonon::MediaQueue: |
| |
| ?? don't know yet where this fits in. |
| |
| |
| Capture |
| ------- |
| |
| Phonon::AvCapture |
| |
| Synchronized audio and video capture. |
| |
| Phonon::AudioWriter |
| |
| Compress audio. |
| |
| |
| Advanced features |
| ----------------- |
| |
| Phonon::ByteStream |
| |
| Feed raw data into the pipeline. Used for streaming network access. |
| |
| Implementation: |
| |
| Possibly a specialized source element connected to a decodebin. |
| |
| Notes: |
| |
| * Phonon::ByteStream::writeData |
| - can it block? |
| |
| * Phonon::ByteStream::setStreamSeekable |
| - If called before starting the ByteStream, decodebin might operate in pull |
| based mode when supported. Else the source is activated in push mode. |
| - If called after starting ByteStream, the Phonon::ByteStream::seekStream |
| signal can be called for push-based seekable streams. |
| |
| * Can the signals be emited from a streaming thread? |
| |
| |
| Phonon::AudioDataOutput/Phonon::VideoDataOutput/ |
| |
| Receive raw audio/video data from the pipeline. Used to allow applications to |
| deal with the raw data themselves. |
| |
| Implementation: |
| |
| Possibly a specialized sink element. |
| |
| Notes : |
| |
| * Phonon::AudioDataOutput::dataReady |
| - can this be emited from the streaming threads? |
| |
| * Phonon::AudioDataOutput::endOfMedia |
| - can this be emited from the streaming threads? |
| - We need to grab this EOS message synchronously from the bus. |
| - should be emited _before_ sending the last dataReady. This means we need |
| to cache at least one dataReady. |
| |
| * Phonon::AudioDataOutput::setDataSize |
| - can this be a _suggested_ data size or does every callback need to be of |
| this size? |
| |
| |