mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 00:36:51 +00:00
docs/random/phonon-gst: Random notes about a Phonon backend.
Original commit message from CVS: * docs/random/phonon-gst: Random notes about a Phonon backend.
This commit is contained in:
parent
38aad233cc
commit
473b67a986
2 changed files with 274 additions and 0 deletions
|
@ -1,3 +1,8 @@
|
|||
2006-07-28 Wim Taymans <wim@fluendo.com>
|
||||
|
||||
* docs/random/phonon-gst:
|
||||
Random notes about a Phonon backend.
|
||||
|
||||
2006-07-27 Jan Schmidt <thaytan@mad.scientist.com>
|
||||
|
||||
* libs/gst/base/gstbasetransform.c: (gst_base_transform_setcaps):
|
||||
|
|
269
docs/random/phonon-gst
Normal file
269
docs/random/phonon-gst
Normal file
|
@ -0,0 +1,269 @@
|
|||
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?
|
||||
|
||||
|
Loading…
Reference in a new issue