mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-08 21:28:45 +00:00
16ce2d4ea4
Unify the ad-hoc markup to be asciidoc style in many places. Add a "html" target to Makefile to generate the output.
99 lines
3.1 KiB
Text
99 lines
3.1 KiB
Text
Tagreading
|
|
----------
|
|
|
|
The tagreading (metadata reading) use case for mediacenter applications is not
|
|
to well supported by the current GStreamer architecture. It uses demuxers on the
|
|
files, which generelly said takes too long (building seek-index, prerolling).
|
|
What we want is specialized elements / parsing modes that just do the
|
|
tag-reading.
|
|
|
|
The idea is to define a TagReadIFace. Tag-demuxers, classic demuxers and decoder
|
|
plugins can just implement the interface or provide a separate element that
|
|
implements the interface.
|
|
|
|
In addition we need a tagreadbin, that similar to decodebin does a typefind and
|
|
then plugs the right tagread element(s). If will only look at elements that
|
|
implement the interface. It can plug serval if possible.
|
|
|
|
For optimal performance typefind and tagread could share the list of already
|
|
peeked buffers (a queue element after sink, but that would change pull to push).
|
|
|
|
|
|
Design
|
|
~~~~~~
|
|
|
|
The plan is that applications can do the following:
|
|
pipeline = "filesrc ! tagbin"
|
|
for (file_path in list_of_files) {
|
|
filesrc.location=file_path
|
|
pipeline.set_state(PAUSED)
|
|
// wait for TAGS & EOS
|
|
pipeline.set_state(READY)
|
|
}
|
|
|
|
* it should have one sinkpad of type ANY
|
|
* it should send EOS when all metadata has been read
|
|
"done"-signal from all tagread-elements
|
|
* special tagread-elements should have RANK_NONE to be not autoplugged by
|
|
decodebin
|
|
|
|
Interface
|
|
~~~~~~~~~
|
|
|
|
* gboolean iface property "tag-reading"
|
|
Switches the element to tagreading mode. Needed if normal element implement
|
|
that behaviour. Elements will skip parsing unneeded data, don't build a
|
|
seeking index, etc.
|
|
* signal "done"
|
|
Equivalent of EOS.
|
|
|
|
Use Cases
|
|
~~~~~~~~~
|
|
|
|
* mp3 with id3- and apetags
|
|
* plug id3demux ! apedemux
|
|
* avi with vorbis audio
|
|
* plug avidemux
|
|
* new pad -> audio/vorbis
|
|
* plug vorbisdec or special vorbiscomment reader
|
|
|
|
Additional Thoughts
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
* would it make sense to have 2-phase tag-reading (property on tagbin and/or
|
|
tagread elements)
|
|
* 1st phase: get tag-data that are directly embedded in the data
|
|
* 2nd phase: get tag-data that has to be generated
|
|
* e.g. album-art via web, video-thumbnails
|
|
* what about caching backends
|
|
* it would be good to allow applications to supply tagbin with a tagcache-
|
|
object instance. Whenever tagbin gets a 'location' to tagread, it consults
|
|
the cache first. whenever there is a cache-miss it will tag-read and then
|
|
store in the cache
|
|
|
|
GstTagList *gst_tag_cache_load_tag_data (GstTagCache *self, const gchar *uri);
|
|
gst_tag_cache_store_tag_data (GstTagCache *self, const gchar *uri, GstTagList *tags);
|
|
|
|
Tests
|
|
~~~~~
|
|
|
|
* write a generic test for parsers/demuxers to ensure they send tags until they
|
|
reached PAUSED (elements need to parse file for prerolling anyway):
|
|
set pipeline to paused, check for tags, set to playing, error out if tags come
|
|
after paused
|
|
|
|
Code Locations
|
|
~~~~~~~~~~~~~~
|
|
|
|
* tagreadbin -> gst-plugins-base/gst/tagread
|
|
* tagreaderiface -> gst-plugins-base/gst-libs/gst/tag
|
|
|
|
Reuse
|
|
~~~~~
|
|
|
|
* ogg : gst-plugins-base/ext/ogg
|
|
* avi : gst-plugins-good/gst/avi
|
|
* mp3 : gst-plugins-good/gst/id3demux
|
|
* wav : gst-plugins-good/gst/wavparse
|
|
* qt : gst-plugins-bad/gst/qtdemux
|
|
|