mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
89 lines
4.2 KiB
Text
89 lines
4.2 KiB
Text
Implementing GstToc support in GStreamer elements
|
|
|
|
1. General info about GstToc structure
|
|
|
|
GstToc introduces a general way to handle chapters within multimedia
|
|
formats. GstToc can be represented as tree structure with arbitrary
|
|
hierarchy. Tree item can be either of two types: chapter or edition.
|
|
Chapter acts like a part of the media data, for example audio track
|
|
in CUE sheet, or part of the movie. Edition acts like some kind of
|
|
alternative way to process media content, for example DVD angles.
|
|
GstToc has one limitation on tree structure: on the same level of
|
|
hierarchy there couldn't be items of different type, i.e. you shouldn't
|
|
have editions and chapters mixed together. Here is an example of right TOC:
|
|
|
|
------- TOC -------
|
|
/ \
|
|
edition1 edition2
|
|
| |
|
|
-chapter1 -chapter3
|
|
-chapter2
|
|
|
|
Here are two editions, the first contains two chapters, and the second
|
|
has only one chapter. And here is an example of invalid TOC:
|
|
|
|
------- TOC -------
|
|
/ \
|
|
edition1 chapter1
|
|
|
|
|
-chapter1
|
|
-chapter2
|
|
|
|
Here you have edition1 and chapter1 mixed on the same level of hierarchy,
|
|
and such TOC will be considered broken.
|
|
|
|
GstToc has 'entries' field of GList type which consists of children items.
|
|
Each item is of type GstTocEntry. Also GstToc has list of tags and
|
|
GstStructure called 'info'. Please, use GstToc.info and GstTocEntry.info
|
|
fields this way: create a GstStructure, put all info related to your element
|
|
there and put this structure into the 'info' field under the name of your
|
|
element. Some fields in the 'info' structure can be used for internal
|
|
purposes, so you should use it in the way described above to not to
|
|
overwrite already existent fields.
|
|
|
|
Let's look at GstTocEntry a bit closer. One of the most important fields
|
|
is 'uid', which must be unique for each item within the TOC. This is used
|
|
to identify each item inside TOC, especially when element receives TOC
|
|
select event with UID to seek on. Field 'subentries' of type GList contains
|
|
children items of type GstTocEntry. Thus you can achieve arbitrary hierarchy
|
|
level. Field 'type' can be either GST_TOC_ENTRY_TYPE_CHAPTER or
|
|
GST_TOC_ENTRY_TYPE_EDITION which corresponds to chapter or edition type of
|
|
item respectively. Field 'pads' of type GList contains list of GStreamer
|
|
pads related to the item. It can be used for example to link a TOC with
|
|
specific pad. Field 'tags' is a list of tags related to the item. And field
|
|
'info' is similar to GstToc.info described above.
|
|
|
|
So, a little more about managing GstToc. Use gst_toc_new() and gst_toc_unref()
|
|
to create/free it. GstTocEntry can be created using gst_toc_entry_new() and
|
|
gst_toc_entry_new_with_pad(). The latter method used to create GstTocEntry
|
|
linked to particular pad. While building GstToc you can set start and stop
|
|
timestamps for each item using gst_toc_entry_set_start_stop().
|
|
The best way to process already created GstToc is to recursively go through
|
|
the 'entries' and 'subentries' fields.
|
|
|
|
2. Working with GstQuery
|
|
|
|
GstQuery with GstToc can be created using gst_query_new_toc(). Use
|
|
gst_query_set_toc() to set TOC into the query and parse it with
|
|
gst_query_parse_toc(). The 'extend_uid' parameter (0 for root level) in two
|
|
last methods should be used for TOC extending: get GstTocEntry with
|
|
gst_toc_find_entry() by given UID and use it to add your own chapters/editions.
|
|
The common action on such query is to set TOC for it.
|
|
|
|
3. Working with GstMessage
|
|
|
|
GstMessage with GstToc can be created using gst_message_new_toc() and parsed
|
|
with gst_message_parse_toc(). The 'updated' parameter in these methods indicates
|
|
whether the TOC was just discovered (set to false) or TOC was already found and
|
|
have been updated (set to true). The common usage for such message is to post it
|
|
to pipeline in case you have discovered TOC data within your element.
|
|
|
|
4. Working with GstEvent
|
|
|
|
GstToc supports select event through GstEvent infrastructure. The idea is the
|
|
following: when you receive TOC select event, parse it with
|
|
gst_event_parse_toc_select() and seek stream (if it is not streamable) for
|
|
specified TOC UID (you can use gst_toc_find_entry() to find entry in TOC by UID).
|
|
To create TOC select event use gst_event_new_toc_select(). The common action on
|
|
such event is to seek to specified UID within your element.
|
|
|