Q: GStreamer内核 采用什么样的代码风格(coding style) ? Q: 怎么编译一个使用了GStreamer的程序? A: GStreamer使用 pkg-config 加一些参数来编译和链接软件。pkg-config 已经广泛使用于GTK+, GNOME, SDL等;如果你对这命令很熟悉,知道如何设定,那么你就可以自己定制了。
如果你不知道如何用 pkg-config 来编译和链接一些单文件的小程序,那么请学习一下 pkg-config 中 --cflags 和 --libs 这两个参数。例如: $ libtool --mode=link gcc `pkg-config --cflags --libs gstreamer-0.10` -o myprog myprog.c
这对于只是基于 gstreamer 的程序已经足够了,但如果程序同时也用了 GTK+ 2.0,那么你得这样: $ libtool --mode=link gcc `pkg-config --cflags --libs gstreamer-0.10 gtk+-2.0` -o myprog myprog.c
这些参数都是 back-ticks (就像键盘上的每个键都一起合作都很重要), 不会单独的引用。
对于更大的项目,你得在 Makefile 中集成 pkg-config,或者用pkg.m4 macro 和 autoconf 集成一起。 Q: 怎么通过末安装GStreamer拷贝(uninstalled GStreamer copy)来开发呢 ? A: 利用末安装的GStreamer和插件的包(例如,能过CVS上的包)开发和编译是可以实现的。最简单的办法是通脚本来实现(在bash下): #!/bin/bash -i
#
# this script is in CVS as gstreamer/docs/faq/gst-uninstalled
#
# set up environment to use and develop gstreamer and friends uninstalled
#
# set up PATH, LD_LIBRARY_PATH, PKG_CONFIG_PATH, GST_PLUGIN_PATH, MANPATH,
# PYTHONPATH
#
# prefer uninstalled versions, but also put installed ones on the path
#
# this script assumes that the relevant modules are checked out one by one
# under a given tree specified below in MYGST
#
# symlink this script in a directory in your path (for example $HOME/bin)
# to a name that reflects the version of your checkout
#
# e.g.:
# - mkdir $HOME/gst/head
# - ln -sf gst-uninstalled $HOME/bin/gst-head
# - checkout copies of gstreamer modules in $HOME/gst/head
# - gst-head
# this script is run -i so that PS1 doesn't get cleared
# change this variable to a different location depending on where you
# store your cvs checkouts
MYGST=$HOME/gst
# extract version from $0
# if this script is called "gst-head" then version will be "head"
VERSION=`echo $0 | sed s/.*gst-//g`
# base path under which dirs are installed
GST=$MYGST/$VERSION
if test ! -e $GST; then
echo "$GST does not exist !"
exit
fi
# set up a bunch of paths
PATH=$GST/gstreamer/tools:$GST/gst-plugins/tools:$GST/gst-player/src:$GST/gst-editor/src:$GST/prefix/bin:$PATH
# /some/path: makes the dynamic linker look in . too, so avoid this
LD_LIBRARY_PATH=$GST/prefix/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
for path in audio cdda interfaces netbuffer riff rtp tag video
do
LD_LIBRARY_PATH=$GST/gst-plugins-base/gst-libs/gst/$path/.libs:$LD_LIBRARY_PATH
done
for path in base net check controller dataprotocol
do
LD_LIBRARY_PATH=$GST/gstreamer/libs/gst/$path/.libs:$LD_LIBRARY_PATH
done
LD_LIBRARY_PATH=$GST/gstreamer/gst/.libs:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$GST/prefix/lib/pkgconfig:$GST/gstreamer/pkgconfig:$GST/gst-plugins/pkgconfig:$GST/gst-plugins-base/pkgconfig:$GST/gst-plugins-good/pkgconfig:$GST/gst-python/pkgconfig:$PKG_CONFIG_PATH
export GST_PLUGIN_PATH=$GST/gstreamer:$GST/gst-plugins:$GST/gst-plugins-base:$GST/gst-plugins-good:$GST/gst-plugins-ugly:$GST/gst-plugins-bad:$GST/gst-ffmpeg:$GST/gnonlin:$GST/gst-monkeysaudio:$GST/plugins:$GST_PLUGIN_PATH
export GST_PLUGIN_SYSTEM_PATH=
export GST_REGISTRY=$GST/gstreamer/registry.xml
export MANPATH=$GST/gstreamer/tools:$GST/prefix/share/man:$MANPATH
pythonver=`python -c "import sys; print sys.version[:3]"`
export PYTHONPATH=$GST/gst-python:$GST/prefix/lib/python$pythonver/site-packages${PYTHONPATH:+:$PYTHONPATH}
# if we got a command, run it, else start a shell
if test ! -z "$1";
then
$@
exit $?
fi
# set up prompt to help us remember we're in a subshell, cd to
# the gstreamer base dir and start $SHELL
cd $GST
shell=$SHELL
if test "x$SHELL" == "x/bin/bash"
then
# debian/ubuntu resets our PS1. bastards.
shell="$SHELL --noprofile"
fi
PS1="[gst-$VERSION] $PS1" $shell
如果你将上面的脚本放在你的目录下,并且链接(symlink)到 gst-cvs (如果你想通过cvs最新版本(HEAD)开发) 或者链接(symlink )到 gst-0.8 (如果你想通过 0.8 版本来开发),它将会自动的选择当前目录下末安装的版本。
当然,这要求你已经下载了相应的gstreamer 和 gst-plugins 在 ~/gst/cvs(对于CVS最新版本(HEAD version))目录。如果不是这种情况,只要做相应的简单修改。
通过运行上面的脚本,你将会建立一个使用末安装工具的开发环境,并且它的gst-register注册中心默认下是使用末安装的插件的。同时,pkg-config 也优先识别末安装的拷贝(uninstalled copies)。 Q: 怎么利用 GConf 来得到系统级默认调用(system-wide defaults) ? A: 对于 GNOME 下的软件来说,通过 GConf 来得到系统音视频的默认输出是很好的想法。你可以通过'gconfaudiosink' 和 'gconfvideosink' 元件(elements)来分别得到音频和视频的输出。它们会为你处理所有和 GConf相关的事务,并会自动的选择调用用户自定义的输出。 Q: 怎么调试 libtool 产生的奇怪 shell 脚本(funny shell scripts )? A: 当你使用libtool 在末安装GStreamer (uninstalled GStreamer) 链接一个程序时,奇怪的shell脚本(funny shell scripts)是用来修改你的共享对象搜索路径,并启动程序。例如,想要调试gst-launch,则: libtool --mode=execute gdb /path/to/gst-launch
. 如果,以上不能正常运行,那么你的libtool可能有问题。 Q: 在GStreamer开发(gstreamer-devel)中为什么邮件交流这么慢(少) ? A: 我们主要通过在线聊天系统来进行工作协调,而不是 email。可以通过 #gstreamer on irc.freenode.net
来加入我们的讨论。当然,对于大篇幅的提问或想得到更多人的回馈,一封 email 永远不会是坏主意。 Q: GStreamer 采用什么类型的版本标签(version scheme)呢 ? A: 对于公开发布的版本,GStreamer采用标准的 主版本号.次版本号.微版本号(MAJOR.MINOR.MICRO) 的版本标签(version scheme)方式。如果发布的版本中有大量bug修正或其它增加的改变,那么,微版本号(MICRO)将增加。如果发布的版本中有大量改变,那么次版本号(MINOR)将增加。如果有非常独特的改进,主版本号(MAJOR)将增加。但你没必要为那屏住呼吸。
在开发周期中,GStreamer 也使用了第四级版本标记(或者说是NANO number)。如果这个数是 1,那么说明这是一个CVS版本。所有的 tarball 或 包有一个为 1 的nano number话,都是从CVS发布,它将不会被维护支持。另外,如果你下载的这个包或tarball不是从GStreamer团队得到的,不要对它有太高的期望。
如果这个数是 2 或者更大,那么这是一个官方重新发布的完整版本。如果你帮助开测试这些包和tarball,我们将非常欢迎,感谢。 Q: GStreamer内核 采用什么样的代码风格(coding style) ? A: GStreamer内核是在 K&R 下用两格缩进(2-space indenting) 编码的。你只需和原代码的风格保持一致就可以了。虽然内核可以使用一个代码整理器来规整。
对于想被加入到 gst-plugins 模块中的个人插件,应当保持(follow)一样的代码风格。如果所有的一切都保持统一,那么将很简单容易。当然,Consistency 也是一个目标。
如果你使用 emacs, 请尝试下面: (defun gstreamer-c-mode ()
"C mode with adjusted defaults for use with GStreamer."
(interactive)
(c-mode)
(c-set-style "K&R")
(setq c-basic-offset 2))
(setq auto-mode-alist (cons '("gst.*/.*\\.[ch]$" . gstreamer-c-mode)
auto-mode-alist))
Or, run your code through indent -br -bad -cbi0 -cli2 -bls -l100 -ut -ce
before submitting a patch(FIXME: check if these are indeed the proper options).
对于代码本身, GNOME 编码指南(GNOME coding guidelines)
值得一读。只要可以,我们都将按照Gobject的精神来编写代码,并且使用大家熟悉的命名。
Patches 应当以统一内容的格式('unified context' format,使用diff -u -p),在 CVS 或最近的发布版本上进行。并且通过 bugzilla
将其附在 bug 报告中,而不仅仅是发送到邮件列表中。