mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-18 15:51:11 +00:00
368 lines
15 KiB
Text
368 lines
15 KiB
Text
GStreamer documentation notes
|
|
|
|
IMPORTANT
|
|
=========
|
|
|
|
Please make sure you've read and understood everything in this file
|
|
before you try changing documentation.
|
|
|
|
Some of the docbook-related bits in this README might be out of date now that
|
|
quite a bit of the documentation has moved into the gst-docs repository.
|
|
|
|
OVERVIEW
|
|
========
|
|
|
|
GStreamer has two sets of documentation that we maintain:
|
|
* API references, using gtk-doc (gstreamer, gstreamer-libs)
|
|
* FAQ / Application Development Manual / Plugin Writer's Guide / Tutorials -
|
|
these are maintained in markdown format and live in the gst-docs repository.
|
|
|
|
DOCBOOK NOTES
|
|
=============
|
|
|
|
OK, I've grown so tired of having to coax the docs to build every time I
|
|
get round to it that I've decided to note down some of the things that
|
|
are important to know.
|
|
|
|
OVERVIEW
|
|
--------
|
|
* Our documentation should all be Docbook/XML. No SGML.
|
|
* The source for the documentation is:
|
|
- one or more .xml files, with the main one being gstreamer-(whatever).xml
|
|
- image files
|
|
- in .svg
|
|
- in .png (and maybe others)
|
|
* We want to generate docs in HTML, PS and PDF
|
|
* We want to use xml to to generate these
|
|
|
|
CONVENTIONS
|
|
-----------
|
|
We stick to some simple conventions for writing docbook documentation.
|
|
* id names:
|
|
- all id's start with chapter-, part-, section-, or misc-
|
|
- verify this is the case by looking at the generated file names in html/
|
|
- sections should also include the chapter name;
|
|
for example in a chapter called chapter-example, a section would be
|
|
called section-example-hello-world
|
|
|
|
HOW IMAGES ARE HANDLED
|
|
----------------------
|
|
* the format of images used is:
|
|
- PNG for html
|
|
- EPS for ps
|
|
- PDF for pdf
|
|
|
|
* images may need to be converted from their source format to the end format
|
|
|
|
* a file called image.entities is generated that provides two entities:
|
|
ℑ and ℑ
|
|
ℑ is the file extension (png, ps, pdf)
|
|
* all generated images will be put in images/
|
|
|
|
HOW THE BUILD WORKS FOR EACH FORMAT
|
|
-----------------------------------
|
|
* HTML:
|
|
- xmlto html gstreamer-whatever.xml should produce the html docs.
|
|
- We do this in the html subdir of the doc builddir.
|
|
- images are copied to (builddir)/html/images
|
|
- PNGS should be set to all of the png's referenced for html, both
|
|
already there and auto-generated
|
|
|
|
* PS :
|
|
- images are converted to .ps files in EPS format. Generated images are
|
|
put in images/
|
|
- xmlto ps gstreamer-whatever.xml generates the ps file
|
|
|
|
* PDF :
|
|
There are two ways:
|
|
- ps2pdf is the easiest
|
|
- we specify ps, PS as the image type, but using xmlto the build will fail
|
|
because it uses ps2pdf internally and it fails to generate the images
|
|
By hand-generating .pdf images before xmlto we can make the build succeed.
|
|
(This is why image-pdf has file ext pdf but type EPS; this tricks xmlto in
|
|
doing the right thing)
|
|
xmlto pdf gstreamer-whatever.xml generates pdf (but seems to fail on the
|
|
FAQ, so for now we use ps2pdf)
|
|
|
|
HOW THE BUILD SYSTEM IS SET UP
|
|
------------------------------
|
|
* make all should build html, ps, and pdf
|
|
* html is built in a subdir, with the png/ps images copied there
|
|
* ps and pdf are built in the current dir, in one file
|
|
|
|
SPELL CHECKING
|
|
--------------
|
|
* with aspell
|
|
* aspell -b -c --mode=sgml --lang=en <file>.xml
|
|
unfortunately the curses-ui of aspell (0.50.5) has problems with the xml tags
|
|
|
|
|
|
GTK-DOC NOTES
|
|
=============
|
|
|
|
* files under revision control:
|
|
- Makefile.am
|
|
- gstreamer-sections.txt
|
|
describes which symbols later appear on one api-doc page
|
|
configure which symbols are shown/invisible/private
|
|
- gstreamer.types
|
|
the types file lists all get_type() functions that register the GObject types
|
|
- gstreamer-docs.sgml
|
|
defines the overall structure of the api documentation
|
|
- tmpl/
|
|
- only add the file to CVS if you have at least filled the short description
|
|
(filename corresponds to the <FILE> tag in the sections file)
|
|
- document as much as possible in the source (*.c files)
|
|
|
|
* what to do when adding a new piece of API:
|
|
- add both an entity and use the entity in gstreamer-docs.sgml
|
|
- add a new <SECTION> to gstreamer-sections.txt in the correct alphabetical
|
|
position related to the other sections (so that it is easier to locate)
|
|
- add all documented symbols to gstreamer-sections.txt in the proper section
|
|
(default),<SUBSECTION Standard>,<SUBSECTION Private>
|
|
- document at least the Short_Description in tmpl/.sgml
|
|
- document symbols where they are defined, so that when one changes the
|
|
definition, the chaces are good that docs are updated.
|
|
- document functions, signals in the .c files
|
|
- document structs, typedefs, enums in the .h files
|
|
|
|
* checklist:
|
|
- make sure *-sections.txt has a <TITLE> set for each <FILE>
|
|
- add only *one* <TITLE> to each file, when you have multiple classes in one
|
|
source-file, create one <FILE> section for each class
|
|
- the <TITLE> *must* be named like the type of the GType, when it gets
|
|
registered (otherwise gtkdoc introspection fails)
|
|
- for clarity name the <FILE> like the <TITLE>, but all lowercase
|
|
|
|
* what to do when trying to improve the docs
|
|
- compare the output of
|
|
grep "_get_type" gstreamer-sections.txt | sort
|
|
with the types in XXX.types to detect entries that
|
|
are maybe missing
|
|
- gtk docs does not warns about empty member docs!, run
|
|
find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@.*: *$" {} \;
|
|
in the project root to find them
|
|
- gtk docs does not warns about empty Returns: docs!, run
|
|
find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@Returns: *$" {} \;
|
|
in the project root to find them
|
|
|
|
* what happens during a gtk-doc build ?
|
|
- Scan step:
|
|
- based on a $(MODULE).types file:
|
|
- gtkdoc-scangobj creates a gtkdoc-scan binary
|
|
- using CC, LD, CFLAGS, LDFLAGS env var
|
|
- using --type-init-func and --module parameters
|
|
- gtkdoc-scan creates
|
|
- $MODULE.signals.new
|
|
- $MODULE.hierarchy.new
|
|
- $MODULE.interfaces.new
|
|
- $MODULE.prerequisites.new
|
|
- $MODULE.args.new
|
|
- generated source and objects get deleted
|
|
- gtkdoc-scangobj merges changes into the original files
|
|
- gtkdoc-scan
|
|
- extracts decls of functions, macros, enums, structs, unions from headers
|
|
- generates
|
|
- $MODULE-decl.txt
|
|
- $MODULE-decl-list.txt
|
|
- $MODULE-decl-list.txt then should get copied to $MODULE-sections.txt
|
|
- scan-build.stamp gets created
|
|
|
|
- Template generation step:
|
|
- gtkdoc-mktmpl --module=$MODULE
|
|
- reads in tmpl/*.sgml
|
|
- moves them to tmpl/*.sgml.bak
|
|
- recreates tmpl/*.sgml according to $MODULE-sections.txt
|
|
- moves unused stuff to $MODULE-unused.txt
|
|
- tmpl-build.stamp gets generated
|
|
|
|
* Possible errors and how to fix them
|
|
- Warning: multiple "IDs" for constraint linkend: gst-tag-register.
|
|
- check if gst_tag_register is listed more than once in -sections.txt
|
|
|
|
STYLE GUIDE FOR GTK-DOC
|
|
=======================
|
|
- this is in addition to gtk-doc's style-guide.txt
|
|
|
|
- when documenting signals, use "the #Gst..." for the object receiving the
|
|
signal; no trailing dot, and no "that received the signal"
|
|
- function/macro descriptions are descriptive, not imperative
|
|
ie, it uses the third person verb
|
|
- synopsis and description should have most-used/application functions at the
|
|
top
|
|
- functions that can return FALSE/NULL or fail should describe their failure
|
|
conditions like this:
|
|
* Returns NULL if no element with the given name is found in the bin, if
|
|
* the frobble was stuck in the froob, or the frizzle was frazzed.
|
|
- a line with function attributes should be added before Returns:
|
|
- can contain:
|
|
"MT safe." - the function is verified to be multithreadingsafe
|
|
"Caller owns returned reference" for refcounted classes
|
|
"Caller owns returned value" for other types (iterators, ..)
|
|
- we do this because, in contrast with GLib/GTK, we are more explicit
|
|
about threadsafety and related issues
|
|
- link to signals from the description like this:
|
|
* The <link linkend="GstBin-element-added">element-added</link> signal
|
|
|
|
WEBSITE DOCUMENTATION
|
|
=====================
|
|
|
|
Updating the online documentation is pretty simple.
|
|
Make sure that you
|
|
a) have a working freedesktop.org account
|
|
b) $HOME/.ssh/config set up so that it has the right User for the Host
|
|
(for example, I have:
|
|
Host freedesktop.org
|
|
User thomasvs
|
|
c) verify this works by doing ssh freedesktop.org and being logged in without
|
|
a password prompt
|
|
d) have verified your changes build documentation locally.
|
|
|
|
Then, after updating any of the docs, run "make upload" from that directory.
|
|
Or, run "make upload" from this (docs) directory.
|
|
|
|
DOCUMENTING ELEMENTS
|
|
====================
|
|
As of september 2005 we have some system to document plugins and elements
|
|
in the various plugin packages.
|
|
|
|
- in a submodule, docs go in docs/plugins
|
|
- template can be copied from gst-plugins-base
|
|
- to add plugins documentation:
|
|
- create docs/plugins
|
|
- create Makefile.am and friends, add to configure.ac
|
|
- create docs/version.entities.in, add to configure.ac
|
|
- in docs/plugins:
|
|
- create $(module)-plugins.types with #include <gst/gst.h>
|
|
- run make
|
|
- edit the -docs.sgml
|
|
- add to cvs:
|
|
cvs add *-plugins-docs.sgml *-plugins.args *-plugins.hierarchy *-plugins.interfaces *-plugins.prerequisites *-plugins.signals *-plugins.types inspect-build.stamp inspect.stamp scanobj-build.stamp
|
|
cvs add inspect
|
|
cvs add inspect/*.xml
|
|
- Additional types can be added to the documentation by placing them in
|
|
the .types file like this:
|
|
type:GstPlayBaseBin
|
|
This is useful for documenting plugin-private types that implement
|
|
signals or properties. The GType is looked up by name after all the
|
|
element classes have been printed - so this is only useful for types
|
|
that are created as a consequence of loading plugins and registering
|
|
the element(s).
|
|
|
|
- to add a plugin to be documented:
|
|
- make sure inspect/ has generated a inspect/plugin-xxx.xml file for it.
|
|
- if it has not, make sure you have pygst installed and run 'make update'.
|
|
and add it to CVS.
|
|
- add an xi:include in -docs.sgml in the Plugins chapter for that plugin
|
|
|
|
- to add an element to be documented:
|
|
- add an xi:include in the Elements chapter for the element
|
|
in the main -docs.sgml
|
|
- add a section for it in -sections.txt with
|
|
<SECTION>
|
|
<FILE>element-(element)</FILE>
|
|
<TITLE>(element)</TITLE>
|
|
GstXxx
|
|
<SUBSECTION Standard>
|
|
GstXxxClass
|
|
GST_XXX
|
|
GST_XXX_CLASS
|
|
GST_IS_XXX
|
|
GST_IS_XXX_CLASS
|
|
GST_TYPE_XXX
|
|
gst_xxx_get_type
|
|
</SECTION>
|
|
- add a gtk-doc section to the source code like:
|
|
/**
|
|
* SECTION:element-multifdsink
|
|
|
|
and fill it with documentation about the element, preferably inside
|
|
a <refsect2> docbook container.
|
|
- add an example:
|
|
- either a few pipelines, inside <programlisting>
|
|
- or a piece of code:
|
|
- create an example program (element)-example.c in the plugin dir
|
|
- add the full path (starting with $(top_srcdir)) for this example
|
|
to the EXAMPLE_CFILES variable in Makefile.am
|
|
- add an xinclude of a file named "element-(element)-example.xml"
|
|
to the docbook documentation piece in the element source code
|
|
- add the header to EXTRA_HFILES in Makefile.am to be able to document
|
|
signals and args; in that case, the object struct needs to be in
|
|
-sections.txt outside of the Standard Subsection (which is annoying,
|
|
but ...)
|
|
(FIXME: are we sure we can both do the xinclude from the tmpl/ sgml,
|
|
as well as an override from the source itself ? maybe we should just
|
|
make sure the xinclude is in the source itself instead ?)
|
|
- if the plugin has no public header, don't add the c-file, add entries to the
|
|
-overrides.txt file (see playbin docs in plugins-base).
|
|
- to rebuild the docs, do:
|
|
make clean
|
|
make update
|
|
make
|
|
- examples will only show up using gtk-doc 1.4 or later - it relies on
|
|
merging stuff from .sgml with inline docs. We might want to change
|
|
this to only get stuff from the source.
|
|
- you need to commit resulting files to git:
|
|
- changes to *.signals and *.args
|
|
- new files for your plugin created in inspect/
|
|
- if you get this warning:
|
|
" Documentation in template xxx for ./tmpl/element-yyy:Short_Description
|
|
being overridden by inline comments"
|
|
per-default the description from the GST_ELEMENT_DETAILS is put to the
|
|
Short_Description. This warning mean you have a different one in the section
|
|
docs as "@short_description:".
|
|
|
|
- the plugin-doc-list on the gstreamer homepage is updated along with other
|
|
web site updates.
|
|
|
|
- maintainer tricks:
|
|
- in gst-plugins-foo/docs/plugins/, run
|
|
make check-inspected-versions
|
|
to show plugins whose inspect information is not up-to-date (which is
|
|
usually either because they have been moved to a different module or
|
|
because they are not built on the maintainer's machine for some reason).
|
|
Whether it really makes sense to update the version number is debatable
|
|
(after all, the inspected information may be outdated and things may have
|
|
changed, in which case it would be bad to change the version number)
|
|
- find files that have docs
|
|
for file in `find . -name "*.c" -exec grep -l " * SECTION:element-" {} \; | sort`; do if [ -e ${file/.c/.h} ]; then echo ${file/.c/.h}; else echo "no header for $file"; fi; done
|
|
for file in `find . -name "*.cc" -exec grep -l " * SECTION:element-" {} \; | sort`; do if [ -e ${file/.cc/.h} ]; then echo ${file/.cc/.h}; else echo "no header for $file"; fi; done
|
|
- add those .h files to EXTRA_HFILES in Makefile.am
|
|
- update gst-plugins-xxx-docs.sgml
|
|
cd docs/plugins
|
|
ls -1 xml/plugin-*.xml | sort | sed -e "s/\(.*\)/ \<xi:include href=\"\1\" \/\>/"
|
|
ls -1 xml/element-*.xml | grep -v -- "-details.xml" | sort | sed -e "s/\(.*\)/ \<xi:include href=\"\1\" \/\>/"
|
|
- maybe we can generate these lists after "make update" and just xi:include
|
|
them in gst-plugins-xxx-docs.sgml. They should be committed to the vcs.
|
|
|
|
- possible errors:
|
|
- "multiple constraints for linkend ID":
|
|
check if each section in -sections.txt actually starts and ends with
|
|
<SECTION> and </SECTION>
|
|
- if a plugin does not show up:
|
|
- check inspect/plugin-xxx.xml and tmpl/elements-
|
|
|
|
RANDOM THINGS I'VE LEARNED
|
|
==========================
|
|
|
|
* for clean builddir != srcdir separation, I wanted to use xmlto --searchpath
|
|
so the source xml could find the built entity file.
|
|
But xmlto --searchpath is (right now) for TeX input, not xml input.
|
|
xsltproc has a --path option (that xmlto doesn't use yet), but it
|
|
resolves single files to $(specified_path)/$(srcdir)/$(file)
|
|
For now, we need to hack around it by copying xml to the build dir.
|
|
|
|
|
|
DEVHELP INTEGRATION
|
|
-------------------
|
|
Check https://wiki.gnome.org/Apps/Devhelp
|
|
It's a really nice development app allowing you to look up API stuff
|
|
from various gtk-doc'd libraries. GStreamer is one of these ;)
|
|
|
|
gtk-doc generates both html API docs and the matching .devhelp(2) books.
|
|
|
|
IMAGES
|
|
------
|
|
It's important to keep the original source format for images, to be able
|
|
to change and regenerate later on. Original files go in
|
|
docs/images
|