...
 
Commits (493)
*.[oa]
*.pyc
*.gcda
*.gcno
*.la
*.lo
*.loT
*.sw[po]
*.tar.*
*~
*.gc??
.deps
.libs
ABOUT-NLS
INSTALL
Makefile
Makefile.in
aclocal.m4
autom4te.cache
autoregen.sh
compile
config.guess
config.h
config.h.in
config.log
config.rpath
config.status
config.sub
configure
depcomp
install-sh
libtool
ltmain.sh
missing
stamp-h1
tags
gst-rtsp.spec
stamp-h.in
.dirstamp
/m4/*m4
/gst/rtsp-server/GstRtspServer-1.0.gir
/gst/rtsp-server/GstRtspServer-1.0.typelib
/examples/test-multicast
/examples/test-multicast2
/test-driver
/tests/check/gst/*.log
/tests/check/gst/*.trs
/tests/check/test-suite.log
/tests/check/gst/addresspool
/tests/check/gst/client
/tests/check/gst/media
/tests/check/gst/mediafactory
/tests/check/gst/mountpoints
/tests/check/gst/permissions
/tests/check/gst/rtspserver
/tests/check/gst/sessionmedia
/tests/check/gst/sessionpool
/tests/check/gst/stream
/tests/check/gst/threadpool
/tests/check/gst/token
/tests/check/test-registry.reg
/tests/test-reuse
/po
/build
/_build
/b/
include: "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/master/gitlab/ci_template.yml"
[submodule "common"]
path = common
url = git://anongit.freedesktop.org/gstreamer/common
This source diff could not be displayed because it is too large. You can view the blob instead.
DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc
if BUILD_EXAMPLES
SUBDIRS_EXAMPLES = examples
else
SUBDIRS_EXAMPLES =
endif
SUBDIRS = \
gst \
common \
pkgconfig \
docs \
$(SUBDIRS_EXAMPLES) \
tests
DIST_SUBDIRS = gst common pkgconfig docs examples tests
EXTRA_DIST = \
ChangeLog autogen.sh depcomp \
AUTHORS COPYING NEWS README RELEASE REQUIREMENTS \
gst-rtsp.spec docs/design/gst-rtp-server-design \
gst-rtsp-server.doap
ACLOCAL_AMFLAGS = -I m4 -I common/m4
DISTCLEANFILES = _stdint.h gst-rtsp.spec
include $(top_srcdir)/common/release.mak
include $(top_srcdir)/common/po.mak
include $(top_srcdir)/common/coverage/lcov.mak
check-valgrind:
$(MAKE) -C tests/check check-valgrind
if HAVE_CHECK
check-torture:
$(MAKE) -C tests/check torture
build-checks:
$(MAKE) -C tests/check build-checks
else
check-torture:
true
build-checks:
true
endif
# cruft: plugins that have been merged or moved or renamed
CRUFT_FILES = \
$(top_builddir)/common/shave \
$(top_builddir)/common/shave-libtool \
$(top_builddir)/common/m4/codeset.m4 \
$(top_builddir)/common/m4/gettext.m4 \
$(top_builddir)/common/m4/glibc2.m4 \
$(top_builddir)/common/m4/glibc21.m4 \
$(top_builddir)/common/m4/iconv.m4 \
$(top_builddir)/common/m4/intdiv0.m4 \
$(top_builddir)/common/m4/intl.m4 \
$(top_builddir)/common/m4/intldir.m4 \
$(top_builddir)/common/m4/intlmacosx.m4 \
$(top_builddir)/common/m4/intmax.m4 \
$(top_builddir)/common/m4/inttypes-pri.m4 \
$(top_builddir)/common/m4/inttypes_h.m4 \
$(top_builddir)/common/m4/lcmessage.m4 \
$(top_builddir)/common/m4/lib-ld.m4 \
$(top_builddir)/common/m4/lib-link.m4 \
$(top_builddir)/common/m4/lib-prefix.m4 \
$(top_builddir)/common/m4/libtool.m4 \
$(top_builddir)/common/m4/lock.m4 \
$(top_builddir)/common/m4/longlong.m4 \
$(top_builddir)/common/m4/ltoptions.m4 \
$(top_builddir)/common/m4/ltsugar.m4 \
$(top_builddir)/common/m4/ltversion.m4 \
$(top_builddir)/common/m4/lt~obsolete.m4 \
$(top_builddir)/common/m4/nls.m4 \
$(top_builddir)/common/m4/po.m4 \
$(top_builddir)/common/m4/printf-posix.m4 \
$(top_builddir)/common/m4/progtest.m4 \
$(top_builddir)/common/m4/size_max.m4 \
$(top_builddir)/common/m4/stdint_h.m4 \
$(top_builddir)/common/m4/uintmax_t.m4 \
$(top_builddir)/common/m4/visibility.m4 \
$(top_builddir)/common/m4/wchar_t.m4 \
$(top_builddir)/common/m4/wint_t.m4 \
$(top_builddir)/common/m4/xsize.m4
include $(top_srcdir)/common/cruft.mak
all-local: check-cruft
This diff is collapsed.
This is GStreamer gst-rtsp-server 1.17.0.1.
Release notes for GStreamer RTSP Server Library 1.6.0
The GStreamer team is thrilled to announce a new major feature release in the
stable 1.0 API series of your favourite cross-platform multimedia framework!
As always, this release is again packed with new features, bug fixes and
other improvements.
The GStreamer team is proud to announce a new major feature release in the
stable 1.x API series of your favourite cross-platform multimedia framework!
The 1.16 release series adds new features on top of the 1.14 series and is
part of the API and ABI-stable 1.x release series of the GStreamer multimedia
framework.
Full release notes will one day be found at:
This release has been in the works for more than a year and is packed with new
features, bug fixes and other improvements.
https://gstreamer.freedesktop.org/releases/1.16/
Binaries for Android, iOS, Mac OS X and Windows will usually be provided
shortly after the release.
See
http://gstreamer.freedesktop.org/releases/1.6/
for the full list of changes.
This module will not be very useful by itself and should be used in conjunction
with other GStreamer modules for a complete multimedia experience.
- gstreamer: provides the core GStreamer libraries and some generic plugins
- gst-plugins-base: a basic set of well-supported plugins and additional
media-specific GStreamer helper libraries for audio,
video, rtsp, rtp, tags, OpenGL, etc.
There were no bugs fixed in this release
- gst-plugins-good: a set of well-supported plugins under our preferred
license
- gst-plugins-ugly: a set of well-supported plugins which might pose
problems for distributors
- gst-plugins-bad: a set of plugins of varying quality that have not made
their way into one of core/base/good/ugly yet, for one
reason or another. Many of these are are production quality
elements, but may still be missing documentation or unit
tests; others haven't passed the rigorous quality testing
we expect yet.
- gst-libav: a set of codecs plugins based on the ffmpeg library. This is
where you can find audio and video decoders and encoders
for a wide variety of formats including H.264, AAC, etc.
- gstreamer-vaapi: hardware-accelerated video decoding and encoding using
VA-API on Linux. Primarily for Intel graphics hardware.
- gst-omx: hardware-accelerated video decoding and encoding, primarily for
embedded Linux systems that provide an OpenMax
implementation layer such as the Raspberry Pi.
- gst-rtsp-server: library to serve files or streaming pipelines via RTSP
- gst-editing-services: library an plugins for non-linear editing
==== Download ====
You can find source releases of gst-rtsp-server in the download
directory: http://gstreamer.freedesktop.org/src/gst-rtsp-server/
You can find source releases of gstreamer in the download
directory: https://gstreamer.freedesktop.org/src/gstreamer/
The git repository and details how to clone it can be found at
http://cgit.freedesktop.org/gstreamer/gst-rtsp-server/
https://cgit.freedesktop.org/gstreamer/gstreamer/
==== Homepage ====
The project's website is http://gstreamer.freedesktop.org/
The project's website is https://gstreamer.freedesktop.org/
==== Support and Bugs ====
We use GNOME's bugzilla for bug reports and feature requests:
http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer
We have recently moved from GNOME Bugzilla to GitLab on freedesktop.org
for bug reports and feature requests:
Please submit patches via bugzilla as well.
https://gitlab.freedesktop.org/gstreamer
Please submit patches via GitLab as well, in form of Merge Requests. See
https://gstreamer.freedesktop.org/documentation/contribute/
for more details.
For help and support, please subscribe to and send questions to the
gstreamer-devel mailing list (see below for details).
......@@ -46,16 +86,14 @@ There is also a #gstreamer IRC channel on the Freenode IRC network.
==== Developers ====
GStreamer is stored in Git, hosted at git.freedesktop.org, and can be cloned
from there (see link above).
GStreamer source code repositories can be found on GitLab on freedesktop.org:
https://gitlab.freedesktop.org/gstreamer
and can also be cloned from there and this is also where you can submit
Merge Requests or file issues for bugs or feature requests.
Interested developers of the core library, plugins, and applications should
subscribe to the gstreamer-devel list.
Contributors to this release
* Jan Schmidt
* Sebastian Dröge
* Tim-Philipp Müller
 
\ No newline at end of file
subscribe to the gstreamer-devel list:
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
#!/bin/sh
#
# gst-rtsp-server autogen.sh
#
# Run this to generate all the initial makefiles, etc.
#
# This file has been generated from common/autogen.sh.in via common/update-autogen
test -n "$srcdir" || srcdir=`dirname "$0"`
test -n "$srcdir" || srcdir=.
olddir=`pwd`
cd "$srcdir"
package=gst-rtsp-server
srcfile=gst-rtsp-server.doap
# Make sure we have common
if test ! -f common/gst-autogen.sh;
then
echo "+ Setting up common submodule"
git submodule init
fi
git submodule update
# source helper functions
if test ! -f common/gst-autogen.sh;
then
echo There is something wrong with your source tree.
echo You are missing common/gst-autogen.sh
exit 1
fi
. common/gst-autogen.sh
# install pre-commit hook for doing clean commits
if test ! \( -x .git/hooks/pre-commit -a -L .git/hooks/pre-commit \);
then
rm -f .git/hooks/pre-commit
ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit
fi
# GNU gettext automake support doesn't get along with git.
# https://bugzilla.gnome.org/show_bug.cgi?id=661128
if test -d po ; then
touch -t 200001010000 po/gst-rtsp-server-1.0.pot
fi
CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc'
if test "x$package" = "xgstreamer"; then
CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --enable-docbook --enable-failing-tests --enable-poisoning"
fi
autogen_options $@
printf "+ check for build tools"
if test -z "$NOCHECK"; then
echo
printf " checking for autoreconf ... "
echo
which "autoreconf" 2>/dev/null || {
echo "not found! Please install the autoconf package."
exit 1
}
printf " checking for pkg-config ... "
echo
which "pkg-config" 2>/dev/null || {
echo "not found! Please install pkg-config."
exit 1
}
else
echo ": skipped version checks"
fi
# if no arguments specified then this will be printed
if test -z "$*" && test -z "$NOCONFIGURE"; then
echo "+ checking for autogen.sh options"
echo " This autogen script will automatically run ./configure as:"
echo " ./configure $CONFIGURE_DEF_OPT"
echo " To pass any additional options, please specify them on the $0"
echo " command line."
fi
toplevel_check $srcfile
# autopoint
if test -d po && grep ^AM_GNU_GETTEXT_VERSION configure.ac >/dev/null ; then
tool_run "autopoint" "--force"
fi
# aclocal
if test -f acinclude.m4; then rm acinclude.m4; fi
autoreconf --force --install || exit 1
test -n "$NOCONFIGURE" && {
echo "+ skipping configure stage for package $package, as requested."
echo "+ autogen.sh done."
exit 0
}
cd "$olddir"
echo "+ running configure ... "
test ! -z "$CONFIGURE_DEF_OPT" && echo " default flags: $CONFIGURE_DEF_OPT"
test ! -z "$CONFIGURE_EXT_OPT" && echo " external flags: $CONFIGURE_EXT_OPT"
echo
echo "$srcdir/configure" $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT
"$srcdir/configure" $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT || {
echo " configure failed"
exit 1
}
echo "Now type 'make' to compile $package."
common @ 9aed1d7a
Subproject commit 9aed1d7a80a38b76f9441ecf181942df99f09c38
This diff is collapsed.
if ENABLE_GTK_DOC
DOCS_SUBDIRS = libs
else
DOCS_SUBDIRS =
endif
SUBDIRS = $(DOCS_SUBDIRS)
DIST_SUBDIRS = libs
EXTRA_DIST = \
version.entities.in
upload:
@if test "x$(SUBDIRS)" != x; then \
for a in $(SUBDIRS); do \
cd $$a; \
make upload; \
cd ..; \
done; \
fi
......@@ -294,7 +294,7 @@ can build simple server applications with it.
When a client performs a PLAY request, its configured destination UDP ports are
added to the GstRTSPStream target destinations, at which point data will
be sent to the client. The corresponding GstRTSPMedia object will be set to the
PLAYING state if it was not allready in order to send the data to the
PLAYING state if it was not already in order to send the data to the
destination.
The server needs to prepare an RTP-Info header field in the PLAY response,
......@@ -320,7 +320,7 @@ can build simple server applications with it.
* session management
The server has to react to clients that suddenly disappear because of network
problems or otherwise. It needs to make sure that it can reasonable free the
problems or otherwise. It needs to make sure that it can reasonably free the
resources that are used by the various objects in use for streaming when the
client appears to be gone.
......@@ -331,7 +331,7 @@ can build simple server applications with it.
Various ways exist to detect activity from a client:
- RTSP keepalive requests. When a client is receiving RTP data, the RTSP TCP
connection is largely unused. It is the client's responsability to
connection is largely unused. It is the client's responsibility to
periodically send keep-alive requests over the TCP channel.
Whenever a keep-alive request is received by the server (any request that
......@@ -359,7 +359,7 @@ can build simple server applications with it.
expired and call gst_rtsp_session_pool_cleanup() to remove them.
When a session is removed from the sessionpool and its last reference is
unreffef, all related objects and media are destroyed as if a TEARDOWN happened
unreffed, all related objects and media are destroyed as if a TEARDOWN happened
from the client.
......@@ -397,9 +397,9 @@ can build simple server applications with it.
to a user.
- GstRTSPPermissions: a generic list of roles and matching permissions. These
can be attached to media and facties currently.
can be attached to media and factories currently.
An Auth implementation will usually authenticate a user, using method such as
An Auth implementation will usually authenticate a user, using a method such as
Basic authentication or client certificates or perhaps simply use the IP address.
The result of the authentication of the user will be a GstRTSPToken that is made
current in the context of the ongoing request.
......@@ -477,7 +477,7 @@ GstRTSPAddressPool
GstRTSPThreadPool
- a pool of threads used for various server tasks such as handling clients and
managin media pipelines.
managing media pipelines.
GstRTSPAuth
......
This diff is collapsed.
# GStreamer RTSP Server
*.stamp
html
tmpl
xml
Makefile
Makefile.in
*-decl.txt
*-decl-list.txt
*-presed-scan.c
*-undeclared.txt
*-undocumented.txt
*-unused.txt
*-overrides.txt
*.args
*.hierarchy
*.interfaces
*.prerequisites
*.signals
doc-registry.xml
*-unused.sgml
*.bak
GST_DOC_SCANOBJ = $(top_srcdir)/common/gstdoc-scangobj
## Process this file with automake to produce Makefile.in
# The name of the module, e.g. 'glib'.
MODULE=gst-rtsp-server
DOC_MODULE=$(MODULE)
# for upload-doc.mak
DOC=$(MODULE)
FORMATS=html
html: html-build.stamp
include $(top_srcdir)/common/upload-doc.mak
# generated basefiles
#basefiles = \
## $(DOC_MODULE).types \
# $(DOC_MODULE)-sections.txt \
# $(DOC_MODULE)-docs.sgml
# ugly hack to make -unused.sgml work
#unused-build.stamp:
# BUILDDIR=`pwd` && \
# cd $(srcdir)/tmpl && \
# ln -sf gstreamer-libs-unused.sgml \
# $$BUILDDIR/tmpl/gstreamer-libs-@GST_API_VERSION@-unused.sgml
# touch unused-build.stamp
# these rules are added to create parallel docs using GST_API_VERSION
#$(basefiles): gstreamer-libs-@GST_API_VERSION@%: gstreamer-libs%
# cp $< $@
#CLEANFILES = $(basefiles)
# The top-level SGML file. Change it if you want.
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
# The directory containing the source code. Relative to $(top_srcdir).
# gtk-doc will search all .c & .h files beneath here for inline comments
# documenting functions and macros.
DOC_SOURCE_DIR = $(top_srcdir)/gst/rtsp-server/
DOC_BUILD_DIR=$(top_builddir)/gst/rtsp-server/
SCAN_OPTIONS=
# FIXME :
# there's something wrong with gstreamer-sections.txt not being in the dist
# maybe it doesn't resolve; we're adding it below for now
#EXTRA_DIST = gstreamer.types.in gstreamer.hierarchy $(DOC_MODULE)-sections.txt gstreamer-sections.txt $(DOC_MAIN_SGML_FILE)
# Extra options to supply to gtkdoc-mkdb.
MKDB_OPTIONS=--sgml-mode --source-suffixes=c,h,cc,m
# Extra options to supply to gtkdoc-fixref.
FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
--extra-dir=$(GST_PREFIX)/share/gtk-doc/html \
--extra-dir=$(GSTPB_PREFIX)/share/gtk-doc/html
# Used for dependencies.
HFILE_GLOB=$(DOC_SOURCE_DIR)/*.h
CFILE_GLOB=$(DOC_SOURCE_DIR)/*.c
SCANOBJ_DEPS = \
$(top_builddir)/gst/rtsp-server/libgstrtspserver-@GST_API_VERSION@.la
# Extra options to supply to gtkdoc-scan.
SCANOBJ_OPTIONS=--type-init-func="g_type_init();gst_init(&argc,&argv)"
# Header files to ignore when scanning.
IGNORE_HFILES =
IGNORE_CFILES =
# we add all .h files of elements that have signals/args we want
# sadly this also pulls in the private methods - maybe we should
# move those around in the source ?
# also, we should add some stuff here conditionally based on whether
# or not the plugin will actually build
# but I'm not sure about that - it might be this Just Works given that
# the registry won't have the element
EXTRA_HFILES =
# Images to copy into HTML directory.
HTML_IMAGES =
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
content_files =
# Other files to distribute.
extra_files =
# CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib
# contains GtkObjects/GObjects and you want to document signals and properties.
GTKDOC_CFLAGS = -I$(top_srcdir) $(GST_PLUGINS_BASE_CFLAGS) \
$(GST_BASE_CFLAGS) $(GST_CFLAGS)
GTKDOC_LIBS = $(SCANOBJ_DEPS) $(GST_PLUGINS_BASE_LIBS) \
$(GST_BASE_LIBS) $(GST_LIBS) $(GCOV_LIBS)
# If you need to override some of the declarations, place them in this file
# and uncomment this line.
DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
include $(top_srcdir)/common/gtk-doc.mak
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY % version-entities SYSTEM "version.entities">
%version-entities;
]>
<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
<bookinfo>
<title>GStreamer RTSP Server Reference Manual</title>
<releaseinfo>
for GStreamer RTSP Server &GST_VERSION;
</releaseinfo>
</bookinfo>
<chapter>
<xi:include href="xml/rtsp-server.xml"/>
<xi:include href="xml/rtsp-client.xml"/>
<xi:include href="xml/rtsp-context.xml"/>
<xi:include href="xml/rtsp-mount-points.xml"/>
<xi:include href="xml/rtsp-media-factory.xml"/>
<xi:include href="xml/rtsp-media-factory-uri.xml"/>
<xi:include href="xml/rtsp-media.xml"/>
<xi:include href="xml/rtsp-stream.xml"/>
<xi:include href="xml/rtsp-session-pool.xml"/>
<xi:include href="xml/rtsp-session.xml"/>
<xi:include href="xml/rtsp-session-media.xml"/>
<xi:include href="xml/rtsp-stream-transport.xml"/>
<xi:include href="xml/rtsp-sdp.xml"/>
<xi:include href="xml/rtsp-address-pool.xml"/>
<xi:include href="xml/rtsp-thread-pool.xml"/>
<xi:include href="xml/rtsp-auth.xml"/>
<xi:include href="xml/rtsp-token.xml"/>
<xi:include href="xml/rtsp-permissions.xml"/>
<xi:include href="xml/rtsp-params.xml"/>
</chapter>
<chapter id="rtsp-server-hierarchy">
<title>Object Hierarchy</title>
<xi:include href="xml/tree_index.sgml"/>
</chapter>
<index id="api-index-full">
<title>API Index</title>
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
</index>
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
</book>
This diff is collapsed.
#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-auth.h>
gst_rtsp_auth_get_type
#include <gst/rtsp-server/rtsp-mount-points.h>
gst_rtsp_mount_points_get_type
#include <gst/rtsp-server/rtsp-media-factory.h>
gst_rtsp_media_factory_get_type
#include <gst/rtsp-server/rtsp-media.h>
gst_rtsp_media_get_type
#include <gst/rtsp-server/rtsp-server.h>
gst_rtsp_server_get_type
#include <gst/rtsp-server/rtsp-session-pool.h>
gst_rtsp_session_pool_get_type
#include <gst/rtsp-server/rtsp-session.h>
gst_rtsp_session_get_type
#include <gst/rtsp-server/rtsp-client.h>
gst_rtsp_client_get_type
#include <gst/rtsp-server/rtsp-address-pool.h>
gst_rtsp_address_pool_get_type
#include <gst/rtsp-server/rtsp-context.h>
gst_rtsp_context_get_type
#include <gst/rtsp-server/rtsp-media-factory-uri.h>
gst_rtsp_media_factory_uri_get_type
#include <gst/rtsp-server/rtsp-permissions.h>
gst_rtsp_permissions_get_type
#include <gst/rtsp-server/rtsp-session-media.h>
gst_rtsp_session_media_get_type
#include <gst/rtsp-server/rtsp-stream-transport.h>
gst_rtsp_stream_transport_get_type
#include <gst/rtsp-server/rtsp-stream.h>
gst_rtsp_stream_get_type
#include <gst/rtsp-server/rtsp-thread-pool.h>
gst_rtsp_thread_pool_get_type
#include <gst/rtsp-server/rtsp-token.h>
gst_rtsp_token_get_type
build_hotdoc = false
if meson.is_cross_build()
if get_option('doc').enabled()
error('Documentation enabled but building the doc while cross building is not supported yet.')
endif
message('Documentation not built as building it while cross building is not supported yet.')
subdir_done()
endif
required_hotdoc_extensions = ['gi-extension', 'gst-extension']
if gst_dep.type_name() == 'internal'
gst_proj = subproject('gstreamer')
plugins_cache_generator = gst_proj.get_variable('plugins_cache_generator')
else
required_hotdoc_extensions += ['gst-extension']
plugins_cache_generator = find_program(join_paths(gst_dep.get_pkgconfig_variable('libexecdir'), 'gstreamer-' + api_version, 'gst-plugins-doc-cache-generator'),
required: false)
endif
plugins_cache = join_paths(meson.current_source_dir(), 'gst_plugins_cache.json')
if plugins.length() == 0
message('All rtsp-server plugins have been disabled')
elif plugins_cache_generator.found()
plugins_doc_dep = custom_target('rtsp-server-plugins-doc-cache',
command: [plugins_cache_generator, plugins_cache, '@OUTPUT@', '@INPUT@'],
input: plugins,
output: 'gst_plugins_cache.json',
)
else
warning('GStreamer plugin inspector for documentation not found, can\'t update the cache')
endif
hotdoc_p = find_program('hotdoc', required: get_option('doc'))
if not hotdoc_p.found()
message('Hotdoc not found, not building the documentation')
subdir_done()
endif
hotdoc = import('hotdoc')
foreach extension: required_hotdoc_extensions
if not hotdoc.has_extensions(extension)
if get_option('doc').enabled()
error('Documentation enabled but @0@ missing'.format(extension))
endif
message('@0@ extension not found, not building documentation'.format(extension))
subdir_done()
endif
endforeach
if not build_gir
if get_option('doc').enabled()
error('Documentation enabled but introspection not built.')
endif
message('Introspection not built, can\'t build the documentation')
subdir_done()
endif
build_hotdoc = true
hotdoc = import('hotdoc')
libs_doc = [hotdoc.generate_doc('gst-rtsp-server',
project_version: api_version,
gi_c_sources: ['../gst/rtsp-server/*.[hc]'],
gi_sources: rtsp_server_gir[0].full_path(),
sitemap: 'sitemap.txt',
index: 'index.md',
gi_index: 'index.md',
gi_smart_index: true,
gi_order_generated_subpages: true,
)]
plugins_doc = [hotdoc.generate_doc('rtspclientsink',
project_version: api_version,
sitemap: 'plugin-sitemap.txt',
index: 'plugin-index.md',
gst_index: 'plugin-index.md',
gst_c_sources: ['../gst/rtsp-sink/*.[ch]'],
gst_dl_sources: [rtspsink.full_path()],
gst_smart_index: true,
dependencies: gst_rtsp_server_deps + [rtspsink],
gst_cache_file: plugins_cache,
gst_plugin_name: 'rtspclientsink',
)]
doc = libs_doc[0]
# rtspclientsink
gi-index
gst-index
<!ENTITY GST_API_VERSION "@GST_API_VERSION@">
<!ENTITY GST_VERSION "@VERSION@">
test-appsrc
test-cgroups
test-launch
test-mp4
test-ogg
test-readme
test-record
test-sdp
test-video
test-video-rtx
test-uri
test-auth
test-netclock
test-netclock-client
noinst_PROGRAMS = test-video test-ogg test-mp4 test-readme \
test-launch test-sdp test-uri test-auth \
test-multicast test-multicast2 test-appsrc \
test-video-rtx test-record \
test-netclock test-netclock-client
#INCLUDES = -I$(top_srcdir) -I$(srcdir)
AM_CFLAGS = $(GST_OBJ_CFLAGS)
LDADD = $(GST_OBJ_LIBS) $(GIO_LIBS)
if HAVE_LIBCGROUP
noinst_PROGRAMS += test-cgroups
LDADD += $(LIBCGROUP_LIBS)
endif
test_netclock_LDFLAGS = \
$(GST_LIBS) \
-lgstnet-@GST_API_VERSION@ \
$(top_builddir)/gst/rtsp-server/libgstrtspserver-@GST_API_VERSION@.la
test_netclock_client_LDFLAGS = \
$(GST_LIBS) \
-lgstnet-@GST_API_VERSION@
examples = [
'test-appsrc',
'test-appsrc2',
'test-auth',
'test-auth-digest',
'test-launch',
'test-mp4',
'test-multicast2',
'test-multicast',
'test-netclock',
'test-netclock-client',
'test-ogg',
'test-onvif-client',
'test-onvif-server',
'test-readme',
'test-record-auth',
'test-record',
'test-sdp',
'test-uri',
'test-video',
'test-video-rtx',
]
foreach example : examples
executable(example, '@0@.c'.format(example),
c_args : rtspserver_args,
include_directories : rtspserver_incs,
dependencies : [glib_dep, gst_dep, gstapp_dep, gstnet_dep, gst_rtsp_server_dep],
install: false)
endforeach
cgroup_dep = dependency('libcgroup', version : '>= 0.26', required : false)
if cgroup_dep.found()
executable('test-cgroups', 'test-cgroups.c',
c_args : rtspserver_args,
include_directories : rtspserver_incs,
dependencies : [glib_dep, gst_dep, gstnet_dep, gst_rtsp_server_dep, cgroup_dep],
install: false)
endif
......@@ -50,6 +50,7 @@ need_data (GstElement * appsrc, guint unused, MyContext * ctx)
ctx->timestamp += GST_BUFFER_DURATION (buffer);
g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
gst_buffer_unref (buffer);
}
/* called when a new media pipeline is constructed. We can query the
......
/* GStreamer
* Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <gst/gst.h>
#include <gst/app/app.h>
#include <gst/rtsp-server/rtsp-server.h>
typedef struct
{
GstElement *generator_pipe;
GstElement *vid_appsink;
GstElement *vid_appsrc;
GstElement *aud_appsink;
GstElement *aud_appsrc;
} MyContext;
/* called when we need to give data to an appsrc */
static void
need_data (GstElement * appsrc, guint unused, MyContext * ctx)
{
GstSample *sample;
GstFlowReturn ret;
if (appsrc == ctx->vid_appsrc)
sample = gst_app_sink_pull_sample (GST_APP_SINK (ctx->vid_appsink));
else
sample = gst_app_sink_pull_sample (GST_APP_SINK (ctx->aud_appsink));
if (sample) {
GstBuffer *buffer = gst_sample_get_buffer (sample);
GstSegment *seg = gst_sample_get_segment (sample);
GstClockTime pts, dts;
/* Convert the PTS/DTS to running time so they start from 0 */
pts = GST_BUFFER_PTS (buffer);
if (GST_CLOCK_TIME_IS_VALID (pts))
pts = gst_segment_to_running_time (seg, GST_FORMAT_TIME, pts);
dts = GST_BUFFER_DTS (buffer);
if (GST_CLOCK_TIME_IS_VALID (dts))
dts = gst_segment_to_running_time (seg, GST_FORMAT_TIME, dts);
if (buffer) {
/* Make writable so we can adjust the timestamps */
buffer = gst_buffer_copy (buffer);
GST_BUFFER_PTS (buffer) = pts;
GST_BUFFER_DTS (buffer) = dts;
g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
}
/* we don't need the appsink sample anymore */
gst_sample_unref (sample);
}
}
static void
ctx_free (MyContext * ctx)
{
gst_element_set_state (ctx->generator_pipe, GST_STATE_NULL);
gst_object_unref (ctx->generator_pipe);
gst_object_unref (ctx->vid_appsrc);
gst_object_unref (ctx->vid_appsink);
gst_object_unref (ctx->aud_appsrc);
gst_object_unref (ctx->aud_appsink);
g_free (ctx);
}
/* called when a new media pipeline is constructed. We can query the
* pipeline and configure our appsrc */
static void
media_configure (GstRTSPMediaFactory * factory, GstRTSPMedia * media,
gpointer user_data)
{
GstElement *element, *appsrc, *appsink;
GstCaps *caps;
MyContext *ctx;
ctx = g_new0 (MyContext, 1);
/* This pipeline generates H264 video and PCM audio. The appsinks are kept small so that if delivery is slow,
* encoded buffers are dropped as needed. There's slightly more buffers (32) allowed for audio */
ctx->generator_pipe =
gst_parse_launch
("videotestsrc is-live=true ! x264enc speed-preset=superfast tune=zerolatency ! h264parse ! appsink name=vid max-buffers=1 drop=true "
"audiotestsrc is-live=true ! appsink name=aud max-buffers=32 drop=true",
NULL);
/* make sure the data is freed when the media is gone */
g_object_set_data_full (G_OBJECT (media), "rtsp-extra-data", ctx,
(GDestroyNotify) ctx_free);
/* get the element (bin) used for providing the streams of the media */
element = gst_rtsp_media_get_element (media);
/* Find the 2 app sources (video / audio), and configure them, connect to the
* signals to request data */
/* configure the caps of the video */
caps = gst_caps_new_simple ("video/x-h264",
"stream-format", G_TYPE_STRING, "byte-stream",
"alignment", G_TYPE_STRING, "au",
"width", G_TYPE_INT, 384, "height", G_TYPE_INT, 288,
"framerate", GST_TYPE_FRACTION, 15, 1, NULL);
ctx->vid_appsrc = appsrc =
gst_bin_get_by_name_recurse_up (GST_BIN (element), "videosrc");
ctx->vid_appsink = appsink =
gst_bin_get_by_name (GST_BIN (ctx->generator_pipe), "vid");
gst_util_set_object_arg (G_OBJECT (appsrc), "format", "time");
g_object_set (G_OBJECT (appsrc), "caps", caps, NULL);
g_object_set (G_OBJECT (appsink), "caps", caps, NULL);
/* install the callback that will be called when a buffer is needed */
g_signal_connect (appsrc, "need-data", (GCallback) need_data, ctx);
gst_caps_unref (caps);
caps = gst_caps_new_simple ("audio/x-raw", "format", G_TYPE_STRING, "S24BE",
"layout", G_TYPE_STRING, "interleaved", "rate", G_TYPE_INT, 48000,
"channels", G_TYPE_INT, 2, NULL);
ctx->aud_appsrc = appsrc =
gst_bin_get_by_name_recurse_up (GST_BIN (element), "audiosrc");
ctx->aud_appsink = appsink =
gst_bin_get_by_name (GST_BIN (ctx->generator_pipe), "aud");
gst_util_set_object_arg (G_OBJECT (appsrc), "format", "time");
g_object_set (G_OBJECT (appsrc), "caps", caps, NULL);
g_object_set (G_OBJECT (appsink), "caps", caps, NULL);
g_signal_connect (appsrc, "need-data", (GCallback) need_data, ctx);
gst_caps_unref (caps);
gst_element_set_state (ctx->generator_pipe, GST_STATE_PLAYING);
gst_object_unref (element);
}
int
main (int argc, char *argv[])
{
GMainLoop *loop;
GstRTSPServer *server;
GstRTSPMountPoints *mounts;
GstRTSPMediaFactory *factory;
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
/* create a server instance */
server = gst_rtsp_server_new ();
/* get the mount points for this server, every server has a default object
* that be used to map uri mount points to media factories */
mounts = gst_rtsp_server_get_mount_points (server);
/* make a media factory for a test stream. The default media factory can use
* gst-launch syntax to create pipelines.
* any launch line works as long as it contains elements named pay%d. Each
* element with pay%d names will be a stream */
factory = gst_rtsp_media_factory_new ();
gst_rtsp_media_factory_set_launch (factory,
"( appsrc name=videosrc ! h264parse ! rtph264pay name=pay0 pt=96 "
" appsrc name=audiosrc ! audioconvert ! rtpL24pay name=pay1 pt=97 )");
/* notify when our media is ready, This is called whenever someone asks for
* the media and a new pipeline with our appsrc is created */
g_signal_connect (factory, "media-configure", (GCallback) media_configure,
NULL);
/* attach the test factory to the /test url */
gst_rtsp_mount_points_add_factory (mounts, "/test", factory);
/* don't need the ref to the mounts anymore */
g_object_unref (mounts);
/* attach the server to the default maincontext */
gst_rtsp_server_attach (server, NULL);
/* start serving */
g_print ("stream ready at rtsp://127.0.0.1:8554/test\n");
g_main_loop_run (loop);
return 0;
}
/* GStreamer
* Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
static gchar *htdigest_path = NULL;
static gchar *realm = NULL;
static GOptionEntry entries[] = {
{"htdigest-path", 'h', 0, G_OPTION_ARG_STRING, &htdigest_path,
"Path to an htdigest file to parse (default: None)", "PATH"},
{"realm", 'r', 0, G_OPTION_ARG_STRING, &realm,
"Authentication realm (default: None)", "REALM"},
{NULL}
};
static gboolean
remove_func (GstRTSPSessionPool * pool, GstRTSPSession * session,
GstRTSPServer * server)
{
return GST_RTSP_FILTER_REMOVE;
}
static gboolean
remove_sessions (GstRTSPServer * server)
{
GstRTSPSessionPool *pool;
g_print ("removing all sessions\n");
pool = gst_rtsp_server_get_session_pool (server);
gst_rtsp_session_pool_filter (pool,
(GstRTSPSessionPoolFilterFunc) remove_func, server);
g_object_unref (pool);
return FALSE;
}
static gboolean
timeout (GstRTSPServer * server)
{
GstRTSPSessionPool *pool;
pool = gst_rtsp_server_get_session_pool (server);
gst_rtsp_session_pool_cleanup (pool);
g_object_unref (pool);
return TRUE;
}
int
main (int argc, char *argv[])
{
GMainLoop *loop;
GstRTSPServer *server;
GstRTSPMountPoints *mounts;
GstRTSPMediaFactory *factory;
GstRTSPAuth *auth;
GstRTSPToken *token;
GOptionContext *optctx;
GError *error = NULL;
optctx = g_option_context_new (NULL);
g_option_context_add_main_entries (optctx, entries, NULL);
g_option_context_add_group (optctx, gst_init_get_option_group ());
if (!g_option_context_parse (optctx, &argc, &argv, &error)) {
g_printerr ("Error parsing options: %s\n", error->message);
g_option_context_free (optctx);
g_clear_error (&error);
return -1;
}
g_option_context_free (optctx);
loop = g_main_loop_new (NULL, FALSE);
/* create a server instance */
server = gst_rtsp_server_new ();
/* get the mounts for this server, every server has a default mapper object
* that be used to map uri mount points to media factories */
mounts = gst_rtsp_server_get_mount_points (server);
/* make a media factory for a test stream. The default media factory can use
* gst-launch syntax to create pipelines.
* any launch line works as long as it contains elements named pay%d. Each
* element with pay%d names will be a stream */
factory = gst_rtsp_media_factory_new ();
gst_rtsp_media_factory_set_launch (factory, "( "
"videotestsrc ! video/x-raw,width=352,height=288,framerate=15/1 ! "
"x264enc ! rtph264pay name=pay0 pt=96 "
"audiotestsrc ! audio/x-raw,rate=8000 ! "
"alawenc ! rtppcmapay name=pay1 pt=97 " ")");
/* attach the test factory to the /test url */
gst_rtsp_mount_points_add_factory (mounts, "/test", factory);
/* allow user and admin to access this resource */
gst_rtsp_media_factory_add_role (factory, "user",
GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE,
GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, TRUE, NULL);
gst_rtsp_media_factory_add_role (factory, "admin",
GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE,
GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, TRUE, NULL);
/* admin2 can look at the media but not construct so he gets a
* 401 Unauthorized */
gst_rtsp_media_factory_add_role (factory, "admin2",
GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE,
GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, FALSE, NULL);
/* Anonymous user can do the same things as admin2 on this resource */
gst_rtsp_media_factory_add_role (factory, "anonymous",
GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE,
GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, FALSE, NULL);
/* make another factory */
factory = gst_rtsp_media_factory_new ();
gst_rtsp_media_factory_set_launch (factory, "( "
"videotestsrc ! video/x-raw,width=352,height=288,framerate=30/1 ! "
"x264enc ! rtph264pay name=pay0 pt=96 )");
/* attach the test factory to the /test url */
gst_rtsp_mount_points_add_factory (mounts, "/test2", factory);
/* allow admin2 to access this resource */
/* user and admin have no permissions so they can't even see the
* media and get a 404 Not Found */
gst_rtsp_media_factory_add_role (factory, "admin2",
GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE,
GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, TRUE, NULL);
/* don't need the ref to the mapper anymore */
g_object_unref (mounts);
/* make a new authentication manager */
auth = gst_rtsp_auth_new ();
gst_rtsp_auth_set_supported_methods (auth, GST_RTSP_AUTH_DIGEST);
/* make default token, it has no permissions */
token =
gst_rtsp_token_new (GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING,
"anonymous", NULL);
gst_rtsp_auth_set_default_token (auth, token);
gst_rtsp_token_unref (token);
/* make user token */
token =
gst_rtsp_token_new (GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING,
"user", NULL);
gst_rtsp_auth_add_digest (auth, "user", "password", token);
gst_rtsp_token_unref (token);
if (htdigest_path) {
token =
gst_rtsp_token_new (GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING,
"user", NULL);
if (!gst_rtsp_auth_parse_htdigest (auth, htdigest_path, token)) {
g_printerr ("Could not parse htdigest at %s\n", htdigest_path);
gst_rtsp_token_unref (token);
goto failed;
}
gst_rtsp_token_unref (token);
}
if (realm)
gst_rtsp_auth_set_realm (auth, realm);
/* make admin token */
token =
gst_rtsp_token_new (GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING,
"admin", NULL);
gst_rtsp_auth_add_digest (auth, "admin", "power", token);
gst_rtsp_token_unref (token);
/* make admin2 token */
token =
gst_rtsp_token_new (GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING,
"admin2", NULL);
gst_rtsp_auth_add_digest (auth, "admin2", "power2", token);
gst_rtsp_token_unref (token);
/* set as the server authentication manager */
gst_rtsp_server_set_auth (server, auth);
g_object_unref (auth);
/* attach the server to the default maincontext */
if (gst_rtsp_server_attach (server, NULL) == 0)
goto failed;
g_timeout_add_seconds (2, (GSourceFunc) timeout, server);
g_timeout_add_seconds (10, (GSourceFunc) remove_sessions, server);
/* start serving */
g_print ("stream with user:password ready at rtsp://127.0.0.1:8554/test\n");
g_print ("stream with admin:power ready at rtsp://127.0.0.1:8554/test\n");
g_print ("stream with admin2:power2 ready at rtsp://127.0.0.1:8554/test2\n");
if (htdigest_path)
g_print
("stream with htdigest users ready at rtsp://127.0.0.1:8554/test\n");
g_main_loop_run (loop);
return 0;
/* ERRORS */
failed:
{
g_print ("failed to attach the server\n");
return -1;
}
}
......@@ -102,6 +102,10 @@ main (int argc, char *argv[])
gst_rtsp_media_factory_add_role (factory, "admin2",
GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE,
GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, FALSE, NULL);
/* Anonymous user can do the same things as admin2 on this resource */
gst_rtsp_media_factory_add_role (factory, "anonymous",
GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE,
GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, FALSE, NULL);
/* make another factory */
factory = gst_rtsp_media_factory_new ();
......@@ -124,10 +128,10 @@ main (int argc, char *argv[])
/* make a new authentication manager */
auth = gst_rtsp_auth_new ();
/* make default token, it has the same permissions as admin2 */
/* make default token, it has no permissions */
token =
gst_rtsp_token_new (GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING,
"admin2", NULL);
"anonymous", NULL);
gst_rtsp_auth_set_default_token (auth, token);
gst_rtsp_token_unref (token);
......
......@@ -47,6 +47,8 @@ main (int argc, char *argv[])
g_option_context_add_group (optctx, gst_init_get_option_group ());
if (!g_option_context_parse (optctx, &argc, &argv, &error)) {
g_printerr ("Error parsing options: %s\n", error->message);
g_option_context_free (optctx);
g_clear_error (&error);
return -1;
}
g_option_context_free (optctx);
......@@ -67,6 +69,7 @@ main (int argc, char *argv[])
* element with pay%d names will be a stream */
factory = gst_rtsp_media_factory_new ();
gst_rtsp_media_factory_set_launch (factory, argv[1]);
gst_rtsp_media_factory_set_shared (factory, TRUE);
/* attach the test factory to the /test url */
gst_rtsp_mount_points_add_factory (mounts, "/test", factory);
......
......@@ -51,6 +51,26 @@ on_ssrc_active (GObject * session, GObject * source, GstRTSPMedia * media)
}
}
static void
on_sender_ssrc_active (GObject * session, GObject * source,
GstRTSPMedia * media)
{
GstStructure *stats;
GST_INFO ("source %p in session %p is active", source, session);
g_object_get (source, "stats", &stats, NULL);
if (stats) {
gchar *sstr;
sstr = gst_structure_to_string (stats);
g_print ("Sender stats:\nstructure: %s\n", sstr);
g_free (sstr);
gst_structure_free (stats);
}
}
/* signal callback when the media is prepared for streaming. We can get the
* session manager for each of the streams and connect to some signals. */
static void
......@@ -75,6 +95,8 @@ media_prepared_cb (GstRTSPMedia * media)
g_signal_connect (session, "on-ssrc-active",
(GCallback) on_ssrc_active, media);
g_signal_connect (session, "on-sender-ssrc-active",
(GCallback) on_sender_ssrc_active, media);
}
}
......@@ -102,6 +124,8 @@ main (int argc, char *argv[])
g_option_context_add_group (optctx, gst_init_get_option_group ());
if (!g_option_context_parse (optctx, &argc, &argv, &error)) {
g_printerr ("Error parsing options: %s\n", error->message);
g_option_context_free (optctx);
g_clear_error (&error);
return -1;
}
......
......@@ -28,26 +28,8 @@ GstClock *global_clock;
#define TEST_TYPE_RTSP_MEDIA_FACTORY (test_rtsp_media_factory_get_type ())
#define TEST_TYPE_RTSP_MEDIA (test_rtsp_media_get_type ())
GType test_rtsp_media_factory_get_type (void);
GType test_rtsp_media_get_type (void);
static GstRTSPMediaFactory *test_rtsp_media_factory_new (void);
static GstElement *create_pipeline (GstRTSPMediaFactory * factory,
GstRTSPMedia * media);
typedef struct TestRTSPMediaFactoryClass TestRTSPMediaFactoryClass;
typedef struct TestRTSPMediaFactory TestRTSPMediaFactory;
struct TestRTSPMediaFactoryClass
{
GstRTSPMediaFactoryClass parent;
};
struct TestRTSPMediaFactory
{
GstRTSPMediaFactory parent;
};
typedef struct TestRTSPMediaClass TestRTSPMediaClass;
typedef struct TestRTSPMedia TestRTSPMedia;
......@@ -61,46 +43,8 @@ struct TestRTSPMedia