Updated GUPnP-DLNA version to 0.10.0 (a245d94)
authorRegis Merlino <regis.merlino@intel.com>
Thu, 7 Mar 2013 09:58:13 +0000 (10:58 +0100)
committerRegis Merlino <regis.merlino@intel.com>
Mon, 18 Mar 2013 15:12:22 +0000 (16:12 +0100)
204 files changed:
Makefile.am
Makefile.in
NEWS
TODO
aclocal.m4
build-aux/compile [new file with mode: 0755]
common.am [new file with mode: 0644]
config.h.in
configure
configure.ac
data/Makefile.am
data/Makefile.in
data/common.xml
data/png.xml
doc/Makefile.am
doc/Makefile.in
doc/gupnp-dlna-gst/Makefile.am [new file with mode: 0644]
doc/gupnp-dlna-gst/Makefile.in [new file with mode: 0644]
doc/gupnp-dlna-gst/gupnp-dlna-gst-docs.sgml [new file with mode: 0644]
doc/gupnp-dlna-gst/gupnp-dlna-gst-overrides.txt [moved from doc/gupnp-dlna-overrides.txt with 100% similarity]
doc/gupnp-dlna-gst/gupnp-dlna-gst-sections.txt [new file with mode: 0644]
doc/gupnp-dlna-gst/gupnp-dlna-gst.types [new file with mode: 0644]
doc/gupnp-dlna-gst/html/annotation-glossary.html [new file with mode: 0644]
doc/gupnp-dlna-gst/html/ch01.html [new file with mode: 0644]
doc/gupnp-dlna-gst/html/gupnp-dlna-gst-gupnp-dlna-gst-utils.html [new file with mode: 0644]
doc/gupnp-dlna-gst/html/gupnp-dlna-gst.devhelp2 [new file with mode: 0644]
doc/gupnp-dlna-gst/html/home.png [moved from doc/html/home.png with 100% similarity]
doc/gupnp-dlna-gst/html/index.html [new file with mode: 0644]
doc/gupnp-dlna-gst/html/index.sgml [new file with mode: 0644]
doc/gupnp-dlna-gst/html/left.png [moved from doc/html/left.png with 100% similarity]
doc/gupnp-dlna-gst/html/right.png [moved from doc/html/right.png with 100% similarity]
doc/gupnp-dlna-gst/html/style.css [moved from doc/html/style.css with 100% similarity]
doc/gupnp-dlna-gst/html/up.png [moved from doc/html/up.png with 100% similarity]
doc/gupnp-dlna-metadata/Makefile.am [new file with mode: 0644]
doc/gupnp-dlna-metadata/Makefile.in [new file with mode: 0644]
doc/gupnp-dlna-metadata/gupnp-dlna-metadata-docs.sgml [new file with mode: 0644]
doc/gupnp-dlna-metadata/gupnp-dlna-metadata-overrides.txt [new file with mode: 0644]
doc/gupnp-dlna-metadata/gupnp-dlna-metadata-sections.txt [new file with mode: 0644]
doc/gupnp-dlna-metadata/gupnp-dlna-metadata.types [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/GUPnPDLNAMetadataExtractor.html [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/annotation-glossary.html [moved from doc/html/annotation-glossary.html with 73% similarity]
doc/gupnp-dlna-metadata/html/ch01.html [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/gupnp-dlna-metadata.devhelp2 [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/home.png [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/index.html [moved from doc/html/index.html with 63% similarity]
doc/gupnp-dlna-metadata/html/index.sgml [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/left.png [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/right.png [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/style.css [new file with mode: 0644]
doc/gupnp-dlna-metadata/html/up.png [new file with mode: 0644]
doc/gupnp-dlna-sections.txt [deleted file]
doc/gupnp-dlna.types [deleted file]
doc/gupnp-dlna/Makefile.am [new file with mode: 0644]
doc/gupnp-dlna/Makefile.in [new file with mode: 0644]
doc/gupnp-dlna/gupnp-dlna-docs.sgml [moved from doc/gupnp-dlna-docs.sgml with 73% similarity]
doc/gupnp-dlna/gupnp-dlna-overrides.txt [new file with mode: 0644]
doc/gupnp-dlna/gupnp-dlna-sections.txt [new file with mode: 0644]
doc/gupnp-dlna/gupnp-dlna.types [new file with mode: 0644]
doc/gupnp-dlna/html/GUPnPDLNAAudioInformation.html [new file with mode: 0644]
doc/gupnp-dlna/html/GUPnPDLNAContainerInformation.html [new file with mode: 0644]
doc/gupnp-dlna/html/GUPnPDLNAImageInformation.html [new file with mode: 0644]
doc/gupnp-dlna/html/GUPnPDLNAInformation.html [new file with mode: 0644]
doc/gupnp-dlna/html/GUPnPDLNAProfile.html [new file with mode: 0644]
doc/gupnp-dlna/html/GUPnPDLNAProfileGuesser.html [new file with mode: 0644]
doc/gupnp-dlna/html/GUPnPDLNAVideoInformation.html [new file with mode: 0644]
doc/gupnp-dlna/html/annotation-glossary.html [new file with mode: 0644]
doc/gupnp-dlna/html/ch01.html [new file with mode: 0644]
doc/gupnp-dlna/html/gupnp-dlna-GUPnP-DLNA-Values.html [new file with mode: 0644]
doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-g-values.html [new file with mode: 0644]
doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-restriction.html [new file with mode: 0644]
doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-value-list.html [new file with mode: 0644]
doc/gupnp-dlna/html/gupnp-dlna.devhelp2 [new file with mode: 0644]
doc/gupnp-dlna/html/home.png [new file with mode: 0644]
doc/gupnp-dlna/html/index.html [new file with mode: 0644]
doc/gupnp-dlna/html/index.sgml [new file with mode: 0644]
doc/gupnp-dlna/html/left.png [new file with mode: 0644]
doc/gupnp-dlna/html/right.png [new file with mode: 0644]
doc/gupnp-dlna/html/style.css [new file with mode: 0644]
doc/gupnp-dlna/html/up.png [new file with mode: 0644]
doc/html/GUPnPDLNADiscoverer.html [deleted file]
doc/html/GUPnPDLNAInformation.html [deleted file]
doc/html/GUPnPDLNAProfile.html [deleted file]
doc/html/ch01.html [deleted file]
doc/html/gupnp-dlna.devhelp2 [deleted file]
doc/html/index.sgml [deleted file]
doc/version.xml
gupnp-dlna-1.0-uninstalled.pc.in [deleted file]
gupnp-dlna-1.0.pc.in [deleted file]
gupnp-dlna-2.0.pc.in [new file with mode: 0644]
gupnp-dlna-gst-2.0.pc.in [new file with mode: 0644]
gupnp-dlna-gst-legacy-2.0.pc.in [new file with mode: 0644]
gupnp-dlna-metadata-2.0.pc.in [new file with mode: 0644]
libgupnp-dlna/Makefile.am
libgupnp-dlna/Makefile.in
libgupnp-dlna/gupnp-dlna-audio-information.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-audio-information.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-container-information.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-container-information.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-discoverer.c [deleted file]
libgupnp-dlna/gupnp-dlna-discoverer.h [deleted file]
libgupnp-dlna/gupnp-dlna-field-value.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-field-value.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-g-values-private.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-g-values.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-g-values.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-image-information.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-image-information.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-info-set.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-info-set.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-info-value.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-info-value.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-information.c
libgupnp-dlna/gupnp-dlna-information.h
libgupnp-dlna/gupnp-dlna-marshal.c [deleted file]
libgupnp-dlna/gupnp-dlna-marshal.h [deleted file]
libgupnp-dlna/gupnp-dlna-marshal.list [deleted file]
libgupnp-dlna/gupnp-dlna-metadata-backend.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-metadata-backend.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-profile-guesser-impl.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-profile-guesser-impl.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-profile-guesser.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-profile-guesser.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-profile-loader.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-profile-loader.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-profile-private.h
libgupnp-dlna/gupnp-dlna-profile.c
libgupnp-dlna/gupnp-dlna-profile.h
libgupnp-dlna/gupnp-dlna-profiles.c [deleted file]
libgupnp-dlna/gupnp-dlna-restriction-private.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-restriction.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-restriction.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-utils.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-utils.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-value-list-private.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-value-list.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-value-list.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-value-type.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-value-type.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-value-union.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-value.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-value.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-values.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-video-information.c [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna-video-information.h [new file with mode: 0644]
libgupnp-dlna/gupnp-dlna.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gstreamer.am [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-legacy-utils.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gstreamer.am [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-container-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-image-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-information.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.h [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c [new file with mode: 0644]
libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-video-information.h [new file with mode: 0644]
libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.c [new file with mode: 0644]
libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.h [new file with mode: 0644]
libgupnp-dlna/metadata/metadata.am [new file with mode: 0644]
libgupnp-dlna/profile-loading.c [deleted file]
libgupnp-dlna/profile-loading.h [deleted file]
m4/vapigen.m4 [new file with mode: 0644]
packaging/GUPnP-DLNA.changes
packaging/GUPnP-DLNA.spec
tests/Makefile.am
tests/Makefile.in
tests/dlna-encoding.c [deleted file]
tests/dlna-profile-parser.c [deleted file]
tests/sets.c [new file with mode: 0644]
tests/test-discoverer.sh.in
tools/Makefile.am
tools/Makefile.in
tools/gupnp-dlna-info.c
tools/gupnp-dlna-ls-profiles.c
vala/GUPnPDLNA-2.0.metadata [new file with mode: 0644]
vala/Makefile.am [new file with mode: 0644]
vala/Makefile.in [new file with mode: 0644]
vala/gupnp-dlna-2.0-custom.vala [new file with mode: 0644]
vala/gupnp-dlna-2.0.deps [new file with mode: 0644]

index 218bed3..50dbc53 100644 (file)
@@ -1,11 +1,19 @@
 ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
 
-SUBDIRS = libgupnp-dlna tools tests data doc
+SUBDIRS = libgupnp-dlna tools tests data doc vala
 
-pkgconfig_DATA = gupnp-dlna-1.0.pc
+pkgconfig_DATA = gupnp-dlna-2.0.pc gupnp-dlna-metadata-2.0.pc
 pkgconfigdir = $(libdir)/pkgconfig
 
-DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
+if GSTREAMER_METADATA_BACKEND_ENABLED
+pkgconfig_DATA += gupnp-dlna-gst-2.0.pc
+endif
+
+if GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED
+pkgconfig_DATA += gupnp-dlna-gst-legacy-2.0.pc
+endif
+
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
 
 # Extra clean files so that maintainer-clean removes *everything*
 MAINTAINERCLEANFILES = aclocal.m4 compile config.guess config.sub configure depcomp install-sh ltmain.sh Makefile.in missing config.h.in
@@ -16,7 +24,7 @@ dist-hook:
                echo Creating ChangeLog && \
                ( cd "$(top_srcdir)" && \
                  echo '# Generated by Makefile. Do not edit.'; echo; \
-                 $(top_srcdir)/missing --run git log --stat ) > ChangeLog.tmp \
+                 $(top_srcdir)/build-aux missing --run git log --stat ) > ChangeLog.tmp \
                && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \
                || ( rm -f ChangeLog.tmp ; \
                     echo Failed to generate ChangeLog >&2 ); \
index 4067096..6271cb0 100644 (file)
@@ -51,12 +51,17 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am__append_1 = gupnp-dlna-gst-2.0.pc
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am__append_2 = gupnp-dlna-gst-legacy-2.0.pc
 subdir = .
 DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in $(srcdir)/config.h.in \
-       $(srcdir)/gupnp-dlna-1.0-uninstalled.pc.in \
-       $(srcdir)/gupnp-dlna-1.0.pc.in $(top_srcdir)/configure AUTHORS \
-       COPYING ChangeLog INSTALL NEWS TODO build-aux/config.guess \
+       $(srcdir)/gupnp-dlna-2.0.pc.in \
+       $(srcdir)/gupnp-dlna-gst-2.0.pc.in \
+       $(srcdir)/gupnp-dlna-gst-legacy-2.0.pc.in \
+       $(srcdir)/gupnp-dlna-metadata-2.0.pc.in \
+       $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
+       TODO build-aux/compile build-aux/config.guess \
        build-aux/config.sub build-aux/depcomp build-aux/install-sh \
        build-aux/ltmain.sh build-aux/missing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -64,14 +69,15 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = gupnp-dlna-1.0.pc gupnp-dlna-1.0-uninstalled.pc
+CONFIG_CLEAN_FILES = gupnp-dlna-2.0.pc gupnp-dlna-metadata-2.0.pc \
+       gupnp-dlna-gst-2.0.pc gupnp-dlna-gst-legacy-2.0.pc
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_GEN = $(am__v_GEN_@AM_V@)
 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
@@ -196,18 +202,30 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
 GST_LIBS = @GST_LIBS@
 GST_MAJORMINOR = @GST_MAJORMINOR@
 GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
 GST_PBU_LIBS = @GST_PBU_LIBS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
 GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
 HTML_DIR = @HTML_DIR@
 INSTALL = @INSTALL@
@@ -233,8 +251,10 @@ LIBXML_LIBS = @LIBXML_LIBS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -258,6 +278,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -312,10 +333,11 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
-SUBDIRS = libgupnp-dlna tools tests data doc
-pkgconfig_DATA = gupnp-dlna-1.0.pc
+SUBDIRS = libgupnp-dlna tools tests data doc vala
+pkgconfig_DATA = gupnp-dlna-2.0.pc gupnp-dlna-metadata-2.0.pc \
+       $(am__append_1) $(am__append_2)
 pkgconfigdir = $(libdir)/pkgconfig
-DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
 
 # Extra clean files so that maintainer-clean removes *everything*
 MAINTAINERCLEANFILES = aclocal.m4 compile config.guess config.sub configure depcomp install-sh ltmain.sh Makefile.in missing config.h.in
@@ -325,7 +347,7 @@ all: config.h
 .SUFFIXES:
 am--refresh: Makefile
        @:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
            *$$dep*) \
@@ -352,9 +374,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        $(SHELL) ./config.status --recheck
 
-$(top_srcdir)/configure:  $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
        $(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
        $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
 $(am__aclocal_m4_deps):
 
@@ -365,16 +387,20 @@ config.h: stamp-h1
 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
        @rm -f stamp-h1
        cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in:  $(am__configure_deps) 
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
        ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
        rm -f stamp-h1
        touch $@
 
 distclean-hdr:
        -rm -f config.h stamp-h1
-gupnp-dlna-1.0.pc: $(top_builddir)/config.status $(srcdir)/gupnp-dlna-1.0.pc.in
+gupnp-dlna-2.0.pc: $(top_builddir)/config.status $(srcdir)/gupnp-dlna-2.0.pc.in
        cd $(top_builddir) && $(SHELL) ./config.status $@
-gupnp-dlna-1.0-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gupnp-dlna-1.0-uninstalled.pc.in
+gupnp-dlna-metadata-2.0.pc: $(top_builddir)/config.status $(srcdir)/gupnp-dlna-metadata-2.0.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+gupnp-dlna-gst-2.0.pc: $(top_builddir)/config.status $(srcdir)/gupnp-dlna-gst-2.0.pc.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+gupnp-dlna-gst-legacy-2.0.pc: $(top_builddir)/config.status $(srcdir)/gupnp-dlna-gst-legacy-2.0.pc.in
        cd $(top_builddir) && $(SHELL) ./config.status $@
 
 mostlyclean-libtool:
@@ -867,7 +893,7 @@ dist-hook:
                echo Creating ChangeLog && \
                ( cd "$(top_srcdir)" && \
                  echo '# Generated by Makefile. Do not edit.'; echo; \
-                 $(top_srcdir)/missing --run git log --stat ) > ChangeLog.tmp \
+                 $(top_srcdir)/build-aux missing --run git log --stat ) > ChangeLog.tmp \
                && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \
                || ( rm -f ChangeLog.tmp ; \
                     echo Failed to generate ChangeLog >&2 ); \
diff --git a/NEWS b/NEWS
index 3962118..379cac8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,115 @@
+0.10.0
+======
+- Various fixes for the GStreamer 0.10 meta-data back-end.
+
+All contributors to this release:
+  Krzesimir Nowak <krnowak@openismus.com>
+  Jens Georg <mail@jensge.org>
+
+0.9.5
+=====
+- Add --disable-maintainer-mode option.
+- Add a GStreamer 0.10 meta-data back-end.
+
+All contributors to this release:
+  Jens Georg <jensg@openismus.com>
+
+0.9.4
+=====
+- Introduce new API to guess a DLNA profile from existing
+  GUPnPDLNAInformation.
+- Introduce a new library to create GUPnPDLNAInformation from
+  GstDiscovererInfo.
+- Fix an issue with GValue conversion.
+- Get rid of the old profile backend and move most of it to the library
+  itself.
+- Introduce single-include header file.
+
+All contributors to this release:
+  Krzesimir Nowak <krnowak@openismus.com>
+  Jens Georg <jensg@openismus.com>
+
+Changes in dependencies:
+ - vapigen >= 0.18 for GStreamer 1.0 vapis.
+
+0.9.3
+=====
+- Fix underlinking of gstreamer plug-in.
+- Fix out-of-srcdir build with --enable-gtk-doc.
+- Fix signal G-I annotation.
+- Link meta-data back-end as a plug-in.
+
+All contributors to this release:
+  Jens Georg <mail@jensge.org>
+  Krzesimir Nowak <krnowak@openismus.com>
+
+0.9.2
+=====
+- Remove the old gupnp-dlna-1.1.pc.in file.
+- Remove gupnp and gstreamer-* dependencies from VAPI file generation.
+- Lower vapigen requirements.
+
+All contributors to this release:
+  Jens Georg <jensg@openismus.com>
+
+Changes in dependencies:
+ - vapigen >= 0.14 instead of 0.18
+
+0.9.1
+=====
+- Fix a potential crash in profile guessing.
+- Fix issues from static code check.
+- Lower GLib dependency to 2.32.
+
+All contributors to this release:
+  Krzesimir Nowak <krnowak@openismus.com>
+  Mark Ryan <mark.d.ryan@intel.com>
+  Jens Georg <jensg@openismus.com>
+
+Bugs fixed in this release:
+ - https://bugzilla.gnome.org/show_bug.cgi?id=689596
+ - https://bugzilla.gnome.org/show_bug.cgi?id=689598
+ - https://bugzilla.gnome.org/show_bug.cgi?id=689612
+ - https://bugzilla.gnome.org/show_bug.cgi?id=689615
+ - https://bugzilla.gnome.org/show_bug.cgi?id=689616
+
+Changes in dependencies:
+ - GLib >= 2.32
+
+0.9.0
+=====
+- Make DLNA profile handling independant from GStreamer.
+- Add plugin architecture to support different meta-data extraction back-ends.
+- Make GStreamer default implementation of meta-data extraction back-end.
+- Split API docs into users and back-end implementers API.
+
+All contributors to this release:
+  Krzesimir Nowak <krnowak@openismus.com>
+  Jens Georg <jensg@openismus.com>
+
+Changes in API:
+ - so version bump
+ - API version bump to 2.0
+
+Changes in dependencies:
+ - GStreamer 1.0
+ - GLib >= 2.34
+
+0.7.0
+=====
+- Port to GStreamer 1.0
+- Add parallel installability with gstreamer-0.10-based gupnp-dlna.
+
+All contributors to this release:
+
+Jens Georg <mail@jensge.org>
+Riko Yamada <rik0yamada@yahoo.co.jp>
+Dominique Leuenberger <dimstar@opensuse.org>
+
+Changes in API:
+ - so version bump
+ - API version bump to 1.1
+
 0.6.6
 =====
 - Fix minor issues found by static code analysis
diff --git a/TODO b/TODO
index 4fe6f15..963b4e2 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,62 +1,20 @@
-This is a list of things that need to be addressed yet.
+* More about extending tools - gupnp-dlna-info-2.0 could show DLNA
+  profiles restrictions and discovered metadata attributes.
+  gupnp-dlna-ls-profiles-2.0 could show restrictions of listed DLNA
+  profiles.
 
-In gupnp-dlna:
-----
+* Write a GStreamer-only utility for creating a GstEncodingProfile
+  from GUPnPDLNAProfile. That could be easily done when above points
+  are done.
 
-* Encoding still needs quite a bit of testing.
+* Bring the tests back to life. And make them being run on make check.
 
-* Speaking of testing, some automated tests would be nice. Right now, there are
-  a bunch of corner cases in tests/xml which can be run through the parser with
-  tests/dlna-profile-parser, and we make sure it doesn't crash.
+* Don't export all functions out there. There should be some linker
+  flag that either takes a regexp for functions to export or takes a
+  file listing them. Otherwise using G_GNUC_INTERNAL for every
+  function not to be exported will be tedious.
 
-* A set of (non-copyright-encombered) media for each profile would be aces. One
-  way of getting this would be to use encodebin once the issues above are
-  resolved, but these must go through some manual verification as well.
+* Read TODO.old for some ideas.
 
-* We don't have a way of checking the system bitratem.
-
-* We're not checking channel maps, or verifying that 6 channels is actually
-  5.1, etc.
-
-* It would be nice to have the bitrate check to be intelligent enough to work
-  with either bitrate or maximum-bitrate, whichever is available. For example,
-  if the restriction specifies that bitrate = 1-128000, and the stream has no
-  bitrate tag, but does have maximum-bitrate = 112000, it should be matched
-  anyway.
-
-* And, of course, MOAR PROFILES!!111!
-
-Outside gupnp-dlna (mostly GStreamer):
-----
-
-* Bitrate for AAC ADTS streams - there is no stream header, and guessing the
-  bitrate based on the first few frames (as is done in aacparse), can be wildly
-  inaccurate.
-
-* HE-AAC support. There isn't any code around for HE-AAC support at all. We
-  need to detect both implicitly and explicitly signaled HE-AAC before we can
-  support these streams. There's a detailed explanation of the problem at:
-  https://bugzilla.gnome.org/show_bug.cgi?id=612312#c7
-
-* Encoding needs a way for properties such as bitrate to be passed to the
-  encoder from encodebin. Edward has a plan for this.
-
-* Bitrate/profile/level are not exported by MPEG-TS streams.
-
-
-More on encoding
-----
-
-Jotting down discussion on the encoding API. This is not necessarily final.
-
-1. Rygel fetches list of DLNA profile names that it should offer to transcode
-   to from config
-2. Rygel asks gupnp-dlna for list of all supported profiles
-3. Rygel filters that list against the profiles that config has asked for
-4. Rygel sorts the filtered list by "distance" from the streams
-   GUPnPDLNAInformation
-
-Here distance is a metric of transcoding "difficulty" (shorter distance =>
-easier to transcode). Basically:
-
-transmuxing < audio transcode < video transcode < audio+video transcode
+* Add a gupnp-dlna-metadata.h main headers. Maybe make the single include
+  headers the only includable ones.
index d3476b0..3fa6f84 100644 (file)
@@ -760,6 +760,46 @@ fi
 rmdir .tst 2>/dev/null
 AC_SUBST([am__leading_dot])])
 
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
 # Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
@@ -812,6 +852,41 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
+# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_PROG_CC_C_O
+# --------------
+# Like AC_PROG_CC_C_O, but changed for automake.
+AC_DEFUN([AM_PROG_CC_C_O],
+[AC_REQUIRE([AC_PROG_CC_C_O])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+dnl Make sure AC_PROG_CC is never called again, or it will override our
+dnl setting of CC.
+m4_define([AC_PROG_CC],
+          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
+])
+
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
 # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
@@ -1212,3 +1287,4 @@ m4_include([m4/ltoptions.m4])
 m4_include([m4/ltsugar.m4])
 m4_include([m4/ltversion.m4])
 m4_include([m4/lt~obsolete.m4])
+m4_include([m4/vapigen.m4])
diff --git a/build-aux/compile b/build-aux/compile
new file mode 100755 (executable)
index 0000000..862a14e
--- /dev/null
@@ -0,0 +1,343 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-03-05.13; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
+# Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/common.am b/common.am
new file mode 100644 (file)
index 0000000..bf8751f
--- /dev/null
+++ b/common.am
@@ -0,0 +1 @@
+shareddir = $(datadir)/gupnp-dlna-2.0
index 423fcf8..a62ccaa 100644 (file)
@@ -34,6 +34,9 @@
    */
 #undef LT_OBJDIR
 
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
 /* Name of package */
 #undef PACKAGE
 
@@ -60,3 +63,6 @@
 
 /* Version number of package */
 #undef VERSION
+
+/* Naive g_clear_pointer implementation. */
+#undef g_clear_pointer
index 7038a8c..b9cfb00 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for gupnp-dlna 0.6.6.
+# Generated by GNU Autoconf 2.69 for gupnp-dlna 0.10.0.
 #
 # Report bugs to <https://bugzilla.gnome.org/enter_bug.cgi?product=gupnp&component=gupnp-dlna>.
 #
@@ -567,6 +567,66 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 SHELL=${CONFIG_SHELL-/bin/sh}
 
+as_awk_strverscmp='
+  # Use only awk features that work with 7th edition Unix awk (1978).
+  # My, what an old awk you have, Mr. Solaris!
+  END {
+    while (length(v1) && length(v2)) {
+      # Set d1 to be the next thing to compare from v1, and likewise for d2.
+      # Normally this is a single character, but if v1 and v2 contain digits,
+      # compare them as integers and fractions as strverscmp does.
+      if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) {
+       # Split v1 and v2 into their leading digit string components d1 and d2,
+       # and advance v1 and v2 past the leading digit strings.
+       for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue
+       for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue
+       d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1)
+       d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1)
+       if (d1 ~ /^0/) {
+         if (d2 ~ /^0/) {
+           # Compare two fractions.
+           while (d1 ~ /^0/ && d2 ~ /^0/) {
+             d1 = substr(d1, 2); len1--
+             d2 = substr(d2, 2); len2--
+           }
+           if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) {
+             # The two components differ in length, and the common prefix
+             # contains only leading zeros.  Consider the longer to be less.
+             d1 = -len1
+             d2 = -len2
+           } else {
+             # Otherwise, compare as strings.
+             d1 = "x" d1
+             d2 = "x" d2
+           }
+         } else {
+           # A fraction is less than an integer.
+           exit 1
+         }
+       } else {
+         if (d2 ~ /^0/) {
+           # An integer is greater than a fraction.
+           exit 2
+         } else {
+           # Compare two integers.
+           d1 += 0
+           d2 += 0
+         }
+       }
+      } else {
+       # The normal case, without worrying about digits.
+       d1 = substr(v1, 1, 1); v1 = substr(v1, 2)
+       d2 = substr(v2, 1, 1); v2 = substr(v2, 2)
+      }
+      if (d1 < d2) exit 1
+      if (d1 > d2) exit 2
+    }
+    # Beware Solaris /usr/xgp4/bin/awk (at least through Solaris 10),
+    # which mishandles some comparisons of empty strings to integers.
+    if (length(v2)) exit 1
+    if (length(v1)) exit 2
+  }
+'
 
 test -n "$DJDIR" || exec 7<&0 </dev/null
 exec 6>&1
@@ -591,8 +651,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='gupnp-dlna'
 PACKAGE_TARNAME='gupnp-dlna'
-PACKAGE_VERSION='0.6.6'
-PACKAGE_STRING='gupnp-dlna 0.6.6'
+PACKAGE_VERSION='0.10.0'
+PACKAGE_STRING='gupnp-dlna 0.10.0'
 PACKAGE_BUGREPORT='https://bugzilla.gnome.org/enter_bug.cgi?product=gupnp&component=gupnp-dlna'
 PACKAGE_URL='http://www.gupnp.org/'
 
@@ -637,6 +697,7 @@ ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
+GLIB_PREFIX
 GTK_DOC_USE_REBASE_FALSE
 GTK_DOC_USE_REBASE_TRUE
 GTK_DOC_USE_LIBTOOL_FALSE
@@ -653,6 +714,9 @@ HTML_DIR
 GTKDOC_MKPDF
 GTKDOC_REBASE
 GTKDOC_CHECK
+HAVE_VAPIGEN_FALSE
+HAVE_VAPIGEN_TRUE
+VAPIGEN
 HAVE_INTROSPECTION_FALSE
 HAVE_INTROSPECTION_TRUE
 INTROSPECTION_MAKEFILE
@@ -663,7 +727,23 @@ INTROSPECTION_GIRDIR
 INTROSPECTION_GENERATE
 INTROSPECTION_COMPILER
 INTROSPECTION_SCANNER
-GLIB_GENMARSHAL
+GMODULE_LIBS
+GMODULE_CFLAGS
+GOBJECT_LIBS
+GOBJECT_CFLAGS
+GLIB_LIBS
+GLIB_CFLAGS
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS
+METADATA_DIRECTORY
+GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_FALSE
+GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE
+GST_LEGACY_MAJORMINOR
+GST_PBU_LEGACY_LIBS
+GST_PBU_LEGACY_CFLAGS
+GST_LEGACY_LIBS
+GST_LEGACY_CFLAGS
+GSTREAMER_METADATA_BACKEND_ENABLED_FALSE
+GSTREAMER_METADATA_BACKEND_ENABLED_TRUE
 GST_MAJORMINOR
 GST_PBU_LIBS
 GST_PBU_CFLAGS
@@ -727,6 +807,9 @@ AM_BACKSLASH
 AM_DEFAULT_VERBOSITY
 AM_DEFAULT_V
 AM_V
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
 am__untar
 am__tar
 AMTAR
@@ -791,6 +874,7 @@ SHELL'
 ac_subst_files=''
 ac_user_opts='
 enable_option_checking
+enable_maintainer_mode
 enable_silent_rules
 enable_dependency_tracking
 enable_shared
@@ -800,6 +884,10 @@ enable_fast_install
 with_gnu_ld
 with_sysroot
 enable_libtool_lock
+with_default_metadata_backend
+enable_gstreamer_metadata_backend
+enable_legacy_gstreamer_metadata_backend
+with_default_metadata_backend_dir
 enable_debug
 enable_introspection
 with_html_dir
@@ -825,6 +913,16 @@ GST_CFLAGS
 GST_LIBS
 GST_PBU_CFLAGS
 GST_PBU_LIBS
+GST_LEGACY_CFLAGS
+GST_LEGACY_LIBS
+GST_PBU_LEGACY_CFLAGS
+GST_PBU_LEGACY_LIBS
+GLIB_CFLAGS
+GLIB_LIBS
+GOBJECT_CFLAGS
+GOBJECT_LIBS
+GMODULE_CFLAGS
+GMODULE_LIBS
 GTKDOC_DEPS_CFLAGS
 GTKDOC_DEPS_LIBS'
 
@@ -1367,7 +1465,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures gupnp-dlna 0.6.6 to adapt to many kinds of systems.
+\`configure' configures gupnp-dlna 0.10.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1437,7 +1535,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of gupnp-dlna 0.6.6:";;
+     short | recursive ) echo "Configuration of gupnp-dlna 0.10.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1445,6 +1543,8 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-maintainer-mode  disable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer
   --enable-silent-rules          less verbose build output (undo: `make V=1')
   --disable-silent-rules         verbose build output (undo: `make V=0')
   --disable-dependency-tracking  speeds up one-time build
@@ -1454,7 +1554,11 @@ Optional Features:
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
-  --enable-debug          enable debugging
+  --enable-gstreamer-metadata-backend
+                          build a GStreamer metadata backend [default=auto]
+  --enable-legacy-gstreamer-metadata-backend
+                          build a GStreamer 0.10 metadata backend [default=no]
+  --enable-debug          enable debugging [default=no]
   --enable-introspection=[no/auto/yes]
                           Enable introspection for this build
   --enable-gtk-doc        use gtk-doc to build documentation [[default=no]]
@@ -1469,6 +1573,11 @@ Optional Packages:
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
   --with-sysroot=DIR Search for dependent libraries within DIR
                         (or the compiler's sysroot if not specified).
+  --with-default-metadata-backend=your_backend
+                          set a default metadata backend [default=gstreamer]
+  --with-default-metadata-backend-dir=your_directory
+                          set a default metadata backend directory
+                          [default=$libdir/$PACKAGE_NAME]
   --with-html-dir=PATH    path to installed docs
 
 Some influential environment variables:
@@ -1494,6 +1603,24 @@ Some influential environment variables:
               C compiler flags for GST_PBU, overriding pkg-config
   GST_PBU_LIBS
               linker flags for GST_PBU, overriding pkg-config
+  GST_LEGACY_CFLAGS
+              C compiler flags for GST_LEGACY, overriding pkg-config
+  GST_LEGACY_LIBS
+              linker flags for GST_LEGACY, overriding pkg-config
+  GST_PBU_LEGACY_CFLAGS
+              C compiler flags for GST_PBU_LEGACY, overriding pkg-config
+  GST_PBU_LEGACY_LIBS
+              linker flags for GST_PBU_LEGACY, overriding pkg-config
+  GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config
+  GLIB_LIBS   linker flags for GLIB, overriding pkg-config
+  GOBJECT_CFLAGS
+              C compiler flags for GOBJECT, overriding pkg-config
+  GOBJECT_LIBS
+              linker flags for GOBJECT, overriding pkg-config
+  GMODULE_CFLAGS
+              C compiler flags for GMODULE, overriding pkg-config
+  GMODULE_LIBS
+              linker flags for GMODULE, overriding pkg-config
   GTKDOC_DEPS_CFLAGS
               C compiler flags for GTKDOC_DEPS, overriding pkg-config
   GTKDOC_DEPS_LIBS
@@ -1566,7 +1693,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-gupnp-dlna configure 0.6.6
+gupnp-dlna configure 0.10.0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1844,7 +1971,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by gupnp-dlna $as_me 0.6.6, which was
+It was created by gupnp-dlna $as_me 0.10.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2665,7 +2792,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='gupnp-dlna'
- VERSION='0.6.6'
+ VERSION='0.10.0'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -2787,6 +2914,29 @@ $as_echo "$am_cv_prog_tar_ustar" >&6; }
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=yes
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
 # Check whether --enable-silent-rules was given.
 if test "${enable_silent_rules+set}" = set; then :
   enableval=$enable_silent_rules;
@@ -2827,7 +2977,7 @@ fi
 AM_BACKSLASH='\'
 
 
-GUPNP_DLNA_CURRENT=2
+GUPNP_DLNA_CURRENT=3
 
 GUPNP_DLNA_REVISION=0
 
@@ -11923,9 +12073,167 @@ $as_echo "yes" >&6; }
 
 fi
 
-GST_MAJORMINOR=0.10
-GST_REQ=0.10.29.2
-GSTPBU_REQ=0.10.32
+if test "x$CC" != xcc; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
+$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
+$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
+fi
+set dummy $CC; ac_cc=`$as_echo "$2" |
+                     sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+# Make sure it works both with $CC and with simple cc.
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+rm -f conftest2.*
+if { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } &&
+   test -f conftest2.$ac_objext && { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; };
+then
+  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
+  if test "x$CC" != xcc; then
+    # Test first that cc exists at all.
+    if { ac_try='cc -c conftest.$ac_ext >&5'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+      rm -f conftest2.*
+      if { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } &&
+        test -f conftest2.$ac_objext && { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; };
+      then
+       # cc works too.
+       :
+      else
+       # cc exists but doesn't like -o.
+       eval ac_cv_prog_cc_${ac_cc}_c_o=no
+      fi
+    fi
+  fi
+else
+  eval ac_cv_prog_cc_${ac_cc}_c_o=no
+fi
+rm -f core conftest*
+
+fi
+if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
+
+fi
+
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+
+
+
+
+# Check whether --with-default-metadata-backend was given.
+if test "${with_default_metadata_backend+set}" = set; then :
+  withval=$with_default_metadata_backend;
+fi
+
+
+if test "x$with_default_metadata_backend" = 'x'
+then
+        with_default_metadata_backend='gstreamer'
+fi
+
+if test "x$with_default_metadata_backend" = 'xyes' || test "x$with_default_metadata_backend" = 'xno'
+then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Dubious default metadata backend name: $with_default_metadata_backend" >&5
+$as_echo "$as_me: WARNING: Dubious default metadata backend name: $with_default_metadata_backend" >&2;}
+fi
+
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS="$GUPNP_DLNA_METADATA_BACKEND_CFLAGS -DGUPNP_DLNA_DEFAULT_METADATA_BACKEND=\\\"$with_default_metadata_backend\\\""
+
+# Check whether --enable-gstreamer-metadata-backend was given.
+if test "${enable_gstreamer_metadata_backend+set}" = set; then :
+  enableval=$enable_gstreamer_metadata_backend;
+else
+  enable_gstreamer_metadata_backend=auto
+fi
+
+
+if test "x$enable_gstreamer_metadata_backend" != 'xno'
+then
+        gstreamer_found='yes'
+        GST_MAJORMINOR=1.0
+        GST_REQ=1.0
+        GSTPBU_REQ=1.0
 
 
 pkg_failed=no
        # Put the nasty error message in config.log where it belongs
        echo "$GST_PKG_ERRORS" >&5
 
-       as_fn_error $? "Package requirements (gstreamer-$GST_MAJORMINOR >= $GST_REQ) were not met:
-
-$GST_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-Alternatively, you may set the environment variables GST_CFLAGS
-and GST_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details." "$LINENO" 5
+       gstreamer_found='no'
 elif test $pkg_failed = untried; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-Alternatively, you may set the environment variables GST_CFLAGS
-and GST_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details" "$LINENO" 5; }
+       gstreamer_found='no'
 else
        GST_CFLAGS=$pkg_cv_GST_CFLAGS
        GST_LIBS=$pkg_cv_GST_LIBS
        # Put the nasty error message in config.log where it belongs
        echo "$GST_PBU_PKG_ERRORS" >&5
 
-       as_fn_error $? "Package requirements (gstreamer-pbutils-$GST_MAJORMINOR >= $GSTPBU_REQ) were not met:
-
-$GST_PBU_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-Alternatively, you may set the environment variables GST_PBU_CFLAGS
-and GST_PBU_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details." "$LINENO" 5
+       gstreamer_found='no'
 elif test $pkg_failed = untried; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-Alternatively, you may set the environment variables GST_PBU_CFLAGS
-and GST_PBU_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details" "$LINENO" 5; }
+       gstreamer_found='no'
 else
        GST_PBU_CFLAGS=$pkg_cv_GST_PBU_CFLAGS
        GST_PBU_LIBS=$pkg_cv_GST_PBU_LIBS
@@ -12110,101 +12378,690 @@ $as_echo "yes" >&6; }
 
 fi
 
+        if test "x$gstreamer_found" = 'xyes'
+        then
 
-GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
 
+                GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
 
-# glib-genmarshal
-GLIB_GENMARSHAL=`pkg-config --variable=glib_genmarshal glib-2.0`
-
+                enable_gstreamer_metadata_backend='yes'
+        elif test "x$enable_gstreamer_metadata_backend" = 'xyes'
+        then
+                as_fn_error $? "GStreamer $GST_MAJORMINOR not found." "$LINENO" 5
+        else
+                enable_gstreamer_metadata_backend='no'
+        fi
+fi
 
-# Debugging
-# Check whether --enable-debug was given.
-if test "${enable_debug+set}" = set; then :
-  enableval=$enable_debug;
+if test "x$enable_gstreamer_metadata_backend" = 'xyes'
+then
+         if true; then
+  GSTREAMER_METADATA_BACKEND_ENABLED_TRUE=
+  GSTREAMER_METADATA_BACKEND_ENABLED_FALSE='#'
 else
-  enable_debug=no
+  GSTREAMER_METADATA_BACKEND_ENABLED_TRUE='#'
+  GSTREAMER_METADATA_BACKEND_ENABLED_FALSE=
 fi
 
-if test "x$enable_debug" = "xyes"; then
-        CFLAGS="$CFLAGS -g -Wall"
+else
+         if false; then
+  GSTREAMER_METADATA_BACKEND_ENABLED_TRUE=
+  GSTREAMER_METADATA_BACKEND_ENABLED_FALSE='#'
+else
+  GSTREAMER_METADATA_BACKEND_ENABLED_TRUE='#'
+  GSTREAMER_METADATA_BACKEND_ENABLED_FALSE=
 fi
 
+fi
 
-
-
-                # Check whether --enable-introspection was given.
-if test "${enable_introspection+set}" = set; then :
-  enableval=$enable_introspection;
+# Check whether --enable-legacy-gstreamer-metadata-backend was given.
+if test "${enable_legacy_gstreamer_metadata_backend+set}" = set; then :
+  enableval=$enable_legacy_gstreamer_metadata_backend;
 else
-  enable_introspection=auto
+  enable_legacy_gstreamer_metadata_backend=no
 fi
 
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5
-$as_echo_n "checking for gobject-introspection... " >&6; }
+if test "x$enable_legacy_gstreamer_metadata_backend" != 'xno'
+then
+        gstreamer_found='yes'
+        GST_LEGACY_MAJORMINOR=0.10
+        GST_LEGACY_REQ=0.10.36
+        GSTPBU_LEGACY_REQ=0.10.36
 
-        case $enable_introspection in #(
-  no) :
-            found_introspection="no (disabled, use --enable-introspection to enable)"
-     ;; #(
-      yes) :
-            if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_LEGACY" >&5
+$as_echo_n "checking for GST_LEGACY... " >&6; }
+
+if test -n "$GST_LEGACY_CFLAGS"; then
+    pkg_cv_GST_LEGACY_CFLAGS="$GST_LEGACY_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-\$GST_LEGACY_MAJORMINOR >= \$GST_LEGACY_REQ\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gstreamer-$GST_LEGACY_MAJORMINOR >= $GST_LEGACY_REQ") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  :
+  pkg_cv_GST_LEGACY_CFLAGS=`$PKG_CONFIG --cflags "gstreamer-$GST_LEGACY_MAJORMINOR >= $GST_LEGACY_REQ" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
 else
-  as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5
+  pkg_failed=yes
 fi
-        if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.6.4\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.4") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  found_introspection=yes
-else
-  as_fn_error $? "You need to have gobject-introspection >= 0.6.4 installed to build gupnp-dlna" "$LINENO" 5
+ else
+    pkg_failed=untried
 fi
-     ;; #(
-      auto) :
-            if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.6.4\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.4") 2>&5
+if test -n "$GST_LEGACY_LIBS"; then
+    pkg_cv_GST_LEGACY_LIBS="$GST_LEGACY_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-\$GST_LEGACY_MAJORMINOR >= \$GST_LEGACY_REQ\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gstreamer-$GST_LEGACY_MAJORMINOR >= $GST_LEGACY_REQ") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  found_introspection=yes
+  pkg_cv_GST_LEGACY_LIBS=`$PKG_CONFIG --libs "gstreamer-$GST_LEGACY_MAJORMINOR >= $GST_LEGACY_REQ" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
 else
-  found_introspection=no
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
 fi
-     ;; #(
-  *) :
-                as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5
-     ;;
-esac
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
-$as_echo "$found_introspection" >&6; }
-
-    INTROSPECTION_SCANNER=
-    INTROSPECTION_COMPILER=
-    INTROSPECTION_GENERATE=
-    INTROSPECTION_GIRDIR=
-    INTROSPECTION_TYPELIBDIR=
-    if test "x$found_introspection" = "xyes"; then
-       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
-       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
-       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
-       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
-       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
-       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
-       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
-       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
-    fi
-
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GST_LEGACY_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gstreamer-$GST_LEGACY_MAJORMINOR >= $GST_LEGACY_REQ" 2>&1`
+        else
+               GST_LEGACY_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gstreamer-$GST_LEGACY_MAJORMINOR >= $GST_LEGACY_REQ" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GST_LEGACY_PKG_ERRORS" >&5
+
+       gstreamer_found='no'
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       gstreamer_found='no'
+else
+       GST_LEGACY_CFLAGS=$pkg_cv_GST_LEGACY_CFLAGS
+       GST_LEGACY_LIBS=$pkg_cv_GST_LEGACY_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PBU_LEGACY" >&5
+$as_echo_n "checking for GST_PBU_LEGACY... " >&6; }
+
+if test -n "$GST_PBU_LEGACY_CFLAGS"; then
+    pkg_cv_GST_PBU_LEGACY_CFLAGS="$GST_PBU_LEGACY_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-pbutils-\$GST_LEGACY_MAJORMINOR >= \$GSTPBU_LEGACY_REQ\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gstreamer-pbutils-$GST_LEGACY_MAJORMINOR >= $GSTPBU_LEGACY_REQ") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GST_PBU_LEGACY_CFLAGS=`$PKG_CONFIG --cflags "gstreamer-pbutils-$GST_LEGACY_MAJORMINOR >= $GSTPBU_LEGACY_REQ" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GST_PBU_LEGACY_LIBS"; then
+    pkg_cv_GST_PBU_LEGACY_LIBS="$GST_PBU_LEGACY_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-pbutils-\$GST_LEGACY_MAJORMINOR >= \$GSTPBU_LEGACY_REQ\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gstreamer-pbutils-$GST_LEGACY_MAJORMINOR >= $GSTPBU_LEGACY_REQ") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GST_PBU_LEGACY_LIBS=`$PKG_CONFIG --libs "gstreamer-pbutils-$GST_LEGACY_MAJORMINOR >= $GSTPBU_LEGACY_REQ" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GST_PBU_LEGACY_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gstreamer-pbutils-$GST_LEGACY_MAJORMINOR >= $GSTPBU_LEGACY_REQ" 2>&1`
+        else
+               GST_PBU_LEGACY_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gstreamer-pbutils-$GST_LEGACY_MAJORMINOR >= $GSTPBU_LEGACY_REQ" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GST_PBU_LEGACY_PKG_ERRORS" >&5
+
+       gstreamer_found='no'
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       gstreamer_found='no'
+else
+       GST_PBU_LEGACY_CFLAGS=$pkg_cv_GST_PBU_LEGACY_CFLAGS
+       GST_PBU_LEGACY_LIBS=$pkg_cv_GST_PBU_LEGACY_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+        if test "x$gstreamer_found" = 'xyes'
+        then
+
+                enable_legacy_gstreamer_metadata_backend='yes'
+        elif test "x$enable_legacy_gstreamer_metadata_backend" = 'xyes'
+        then
+                as_fn_error $? "GStreamer $GST_LEGACY_MAJORMINOR not found." "$LINENO" 5
+        else
+                enable_legacy_gstreamer_metadata_backend='no'
+        fi
+fi
+
+if test "x$enable_legacy_gstreamer_metadata_backend" = 'xyes'
+then
+         if true; then
+  GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE=
+  GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_FALSE='#'
+else
+  GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE='#'
+  GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_FALSE=
+fi
+
+else
+         if false; then
+  GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE=
+  GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_FALSE='#'
+else
+  GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE='#'
+  GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_FALSE=
+fi
+
+fi
+
+
+# Check whether --with-default-metadata-backend-dir was given.
+if test "${with_default_metadata_backend_dir+set}" = set; then :
+  withval=$with_default_metadata_backend_dir;
+fi
+
+
+if test "x$with_default_metadata_backend_dir" = 'x'
+then
+        with_default_metadata_backend_dir="$libdir/$PACKAGE_NAME"
+fi
+
+if test "x$with_default_metadata_backend_dir" = 'xyes' || test "x$with_default_metadata_backend_dir" = 'xno'
+then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Dubious default metadata backend directory: $with_default_metadata_backend_dir" >&5
+$as_echo "$as_me: WARNING: Dubious default metadata backend directory: $with_default_metadata_backend_dir" >&2;}
+fi
+
+METADATA_DIRECTORY=$with_default_metadata_backend_dir
+
+
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS="$GUPNP_DLNA_METADATA_BACKEND_CFLAGS -DGUPNP_DLNA_DEFAULT_METADATA_BACKEND_DIR=\\\"$with_default_metadata_backend_dir\\\""
+
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5
+$as_echo_n "checking for GLIB... " >&6; }
+
+if test -n "$GLIB_CFLAGS"; then
+    pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.32\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.32") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.32" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GLIB_LIBS"; then
+    pkg_cv_GLIB_LIBS="$GLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.32\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.32") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.32" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.32" 2>&1`
+        else
+               GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.32" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GLIB_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (glib-2.0 >= 2.32) were not met:
+
+$GLIB_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GLIB_CFLAGS
+and GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GLIB_CFLAGS
+and GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS
+       GLIB_LIBS=$pkg_cv_GLIB_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOBJECT" >&5
+$as_echo_n "checking for GOBJECT... " >&6; }
+
+if test -n "$GOBJECT_CFLAGS"; then
+    pkg_cv_GOBJECT_CFLAGS="$GOBJECT_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GOBJECT_CFLAGS=`$PKG_CONFIG --cflags "gobject-2.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GOBJECT_LIBS"; then
+    pkg_cv_GOBJECT_LIBS="$GOBJECT_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GOBJECT_LIBS=`$PKG_CONFIG --libs "gobject-2.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gobject-2.0" 2>&1`
+        else
+               GOBJECT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gobject-2.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GOBJECT_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (gobject-2.0) were not met:
+
+$GOBJECT_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GOBJECT_CFLAGS
+and GOBJECT_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GOBJECT_CFLAGS
+and GOBJECT_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       GOBJECT_CFLAGS=$pkg_cv_GOBJECT_CFLAGS
+       GOBJECT_LIBS=$pkg_cv_GOBJECT_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GMODULE" >&5
+$as_echo_n "checking for GMODULE... " >&6; }
+
+if test -n "$GMODULE_CFLAGS"; then
+    pkg_cv_GMODULE_CFLAGS="$GMODULE_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmodule-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gmodule-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GMODULE_CFLAGS=`$PKG_CONFIG --cflags "gmodule-2.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GMODULE_LIBS"; then
+    pkg_cv_GMODULE_LIBS="$GMODULE_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmodule-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gmodule-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GMODULE_LIBS=`$PKG_CONFIG --libs "gmodule-2.0" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               GMODULE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gmodule-2.0" 2>&1`
+        else
+               GMODULE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gmodule-2.0" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GMODULE_PKG_ERRORS" >&5
+
+       as_fn_error $? "Package requirements (gmodule-2.0) were not met:
+
+$GMODULE_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GMODULE_CFLAGS
+and GMODULE_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GMODULE_CFLAGS
+and GMODULE_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+       GMODULE_CFLAGS=$pkg_cv_GMODULE_CFLAGS
+       GMODULE_LIBS=$pkg_cv_GMODULE_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+
+
+
+
+
+
+# Check for g_clear_pointer
+have_g_clear_pointer='no'
+if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.34\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.34") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  have_g_clear_pointer='yes'
+fi
+if test "x$have_g_clear_pointer" = xno; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for g_clear_pointer" >&5
+$as_echo_n "checking for g_clear_pointer... " >&6; }
+           GUPNP_DLNA_TEMP_CFLAGS="$CFLAGS"
+           CFLAGS="$CFLAGS $GLIB_CFLAGS"
+           GUPNP_DLNA_TEMP_LIBS="$LIBS"
+           LIBS="$LIBS $GLIB_LIBS"
+           ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+           cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                                             #include <glib.h>
+
+int
+main ()
+{
+
+                                             gchar *test = g_malloc (2);
+                                             g_clear_pointer (&test, g_free);
+                                             return (test == NULL)
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  have_g_clear_pointer='yes'
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+          LIBS="$GUPNP_DLNA_TEMP_LIBS"
+          CFLAGS="$GUPNP_DLNA_TEMP_CFLAGS"
+          { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_g_clear_pointer" >&5
+$as_echo "$have_g_clear_pointer" >&6; }
+fi
+
+if test "x$have_g_clear_pointer" = xno; then :
+
+$as_echo "#define g_clear_pointer(ptr, func) \\
+                      G_STMT_START { \\
+                        if (ptr != NULL && func != NULL) { \\
+                          gpointer g_clear_pointer_tmp_var = *ptr; \\
+                          *ptr = NULL; \\
+                          func (g_clear_pointer_tmp_var); \\
+                        } \\
+                      } G_STMT_END" >>confdefs.h
+
+fi
+
+# Debugging
+# Check whether --enable-debug was given.
+if test "${enable_debug+set}" = set; then :
+  enableval=$enable_debug;
+else
+  enable_debug=no
+fi
+
+if test "x$enable_debug" = "xyes"; then
+        CFLAGS="$CFLAGS -g -Wall"
+fi
+
+
+
+
+                # Check whether --enable-introspection was given.
+if test "${enable_introspection+set}" = set; then :
+  enableval=$enable_introspection;
+else
+  enable_introspection=auto
+fi
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5
+$as_echo_n "checking for gobject-introspection... " >&6; }
+
+        case $enable_introspection in #(
+  no) :
+            found_introspection="no (disabled, use --enable-introspection to enable)"
+     ;; #(
+      yes) :
+            if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  :
+else
+  as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5
+fi
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.6.4\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.4") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  found_introspection=yes
+else
+  as_fn_error $? "You need to have gobject-introspection >= 0.6.4 installed to build gupnp-dlna" "$LINENO" 5
+fi
+     ;; #(
+      auto) :
+            if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 0.6.4\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.4") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  found_introspection=yes
+else
+  found_introspection=no
+fi
+     ;; #(
+  *) :
+                as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5
+     ;;
+esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
+$as_echo "$found_introspection" >&6; }
+
+    INTROSPECTION_SCANNER=
+    INTROSPECTION_COMPILER=
+    INTROSPECTION_GENERATE=
+    INTROSPECTION_GIRDIR=
+    INTROSPECTION_TYPELIBDIR=
+    if test "x$found_introspection" = "xyes"; then
+       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
+       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
+       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
+       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
+    fi
+
 
 
 
 
 
 
+# vapigen
+if test "x$found_introspection" = "xyes"; then :
+
+       # Extract the first word of "vapigen", so it can be a program name with args.
+set dummy vapigen; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_VAPIGEN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $VAPIGEN in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_VAPIGEN="$VAPIGEN" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_VAPIGEN="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+VAPIGEN=$ac_cv_path_VAPIGEN
+if test -n "$VAPIGEN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VAPIGEN" >&5
+$as_echo "$VAPIGEN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test -z "$VAPIGEN"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No Vala API Generator found. You will not be able to generate .vapi files." >&5
+$as_echo "$as_me: WARNING: No Vala API Generator found. You will not be able to generate .vapi files." >&2;}
+else
+  if test -n "0.18"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking $VAPIGEN is at least version 0.18" >&5
+$as_echo_n "checking $VAPIGEN is at least version 0.18... " >&6; }
+         am__vapigen_version=`$VAPIGEN --version | sed 's/Vala API Generator  *//'`
+         as_arg_v1=0.18
+as_arg_v2="$am__vapigen_version"
+awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null
+case $? in #(
+  1) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; } ;; #(
+  0) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; } ;; #(
+  2) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+            { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Vala API Generator 0.18 not found." >&5
+$as_echo "$as_me: WARNING: Vala API Generator 0.18 not found." >&2;} ;; #(
+  *) :
+     ;;
+esac
+fi
+fi
+
+
+
+fi
+ if test "x$VAPIGEN" != "x"; then
+  HAVE_VAPIGEN_TRUE=
+  HAVE_VAPIGEN_FALSE='#'
+else
+  HAVE_VAPIGEN_TRUE='#'
+  HAVE_VAPIGEN_FALSE=
+fi
+
+
 
 
 
@@ -12545,8 +13486,13 @@ else
 fi
 
 
+# for fixxref
+GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
+
 
-ac_config_files="$ac_config_files Makefile libgupnp-dlna/Makefile tools/Makefile tests/Makefile tests/test-discoverer.sh doc/Makefile doc/version.xml data/Makefile gupnp-dlna-1.0.pc gupnp-dlna-1.0-uninstalled.pc"
+ac_config_files="$ac_config_files Makefile libgupnp-dlna/Makefile tools/Makefile tests/Makefile data/Makefile gupnp-dlna-2.0.pc gupnp-dlna-metadata-2.0.pc gupnp-dlna-gst-2.0.pc gupnp-dlna-gst-legacy-2.0.pc doc/Makefile doc/version.xml doc/gupnp-dlna/Makefile doc/gupnp-dlna-metadata/Makefile doc/gupnp-dlna-gst/Makefile vala/Makefile"
+
+ac_config_files="$ac_config_files tests/test-discoverer.sh"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -12665,6 +13611,10 @@ else
   am__EXEEXT_FALSE=
 fi
 
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
   as_fn_error $? "conditional \"AMDEP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -12673,10 +13623,30 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${GSTREAMER_METADATA_BACKEND_ENABLED_TRUE}" && test -z "${GSTREAMER_METADATA_BACKEND_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"GSTREAMER_METADATA_BACKEND_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GSTREAMER_METADATA_BACKEND_ENABLED_TRUE}" && test -z "${GSTREAMER_METADATA_BACKEND_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"GSTREAMER_METADATA_BACKEND_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE}" && test -z "${GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE}" && test -z "${GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_VAPIGEN_TRUE}" && test -z "${HAVE_VAPIGEN_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_VAPIGEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
   as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -13094,7 +14064,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by gupnp-dlna $as_me 0.6.6, which was
+This file was extended by gupnp-dlna $as_me 0.10.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -13161,7 +14131,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-gupnp-dlna config.status 0.6.6
+gupnp-dlna config.status 0.10.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
     "libgupnp-dlna/Makefile") CONFIG_FILES="$CONFIG_FILES libgupnp-dlna/Makefile" ;;
     "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
     "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
-    "tests/test-discoverer.sh") CONFIG_FILES="$CONFIG_FILES tests/test-discoverer.sh" ;;
+    "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
+    "gupnp-dlna-2.0.pc") CONFIG_FILES="$CONFIG_FILES gupnp-dlna-2.0.pc" ;;
+    "gupnp-dlna-metadata-2.0.pc") CONFIG_FILES="$CONFIG_FILES gupnp-dlna-metadata-2.0.pc" ;;
+    "gupnp-dlna-gst-2.0.pc") CONFIG_FILES="$CONFIG_FILES gupnp-dlna-gst-2.0.pc" ;;
+    "gupnp-dlna-gst-legacy-2.0.pc") CONFIG_FILES="$CONFIG_FILES gupnp-dlna-gst-legacy-2.0.pc" ;;
     "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
     "doc/version.xml") CONFIG_FILES="$CONFIG_FILES doc/version.xml" ;;
-    "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
-    "gupnp-dlna-1.0.pc") CONFIG_FILES="$CONFIG_FILES gupnp-dlna-1.0.pc" ;;
-    "gupnp-dlna-1.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES gupnp-dlna-1.0-uninstalled.pc" ;;
+    "doc/gupnp-dlna/Makefile") CONFIG_FILES="$CONFIG_FILES doc/gupnp-dlna/Makefile" ;;
+    "doc/gupnp-dlna-metadata/Makefile") CONFIG_FILES="$CONFIG_FILES doc/gupnp-dlna-metadata/Makefile" ;;
+    "doc/gupnp-dlna-gst/Makefile") CONFIG_FILES="$CONFIG_FILES doc/gupnp-dlna-gst/Makefile" ;;
+    "vala/Makefile") CONFIG_FILES="$CONFIG_FILES vala/Makefile" ;;
+    "tests/test-discoverer.sh") CONFIG_FILES="$CONFIG_FILES tests/test-discoverer.sh" ;;
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
@@ -14905,6 +15881,7 @@ fi
   chmod +x "$ofile"
 
  ;;
+    "tests/test-discoverer.sh":F) chmod a+x tests/test-discoverer.sh ;;
 
   esac
 done # for ac_tag
@@ -14943,3 +15920,12 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
+echo
+echo 'Configuration status:'
+echo
+echo "Default metadata backend:                $with_default_metadata_backend"
+echo "Default metadata backend directory:      $with_default_metadata_backend_dir"
+echo "Build GStreamer metadata backend:        $enable_gstreamer_metadata_backend"
+echo "Build legacy GStreamer metadata backend: $enable_legacy_gstreamer_metadata_backend"
+echo
index f6b5c54..42725af 100644 (file)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.63])
 AC_INIT([gupnp-dlna],
-        [0.6.6],
+        [0.10.0],
         [https://bugzilla.gnome.org/enter_bug.cgi?product=gupnp&component=gupnp-dlna],
         [gupnp-dlna],
         [http://www.gupnp.org/])
@@ -11,12 +11,13 @@ AC_CONFIG_MACRO_DIR([m4])
 AC_CONFIG_AUX_DIR([build-aux])
 
 AM_INIT_AUTOMAKE([1.11 tar-ustar no-dist-gzip dist-xz])
+AM_MAINTAINER_MODE([enable])
 
 AM_SILENT_RULES([yes])
 
 dnl library versioning
 dnl Increase when changing the API
-GUPNP_DLNA_CURRENT=2
+GUPNP_DLNA_CURRENT=3
 
 dnl Update when changing implementation of current API,
 dnl reset to 0 when changing CURRENT.  This is the revision of
@@ -37,45 +38,228 @@ AC_HEADER_STDC
 LT_PREREQ([2.2])
 LT_INIT([win32-dll])
 
-PKG_CHECK_MODULES(LIBXML, libxml-2.0 >= 2.5.0)
+PKG_CHECK_MODULES([LIBXML], [libxml-2.0 >= 2.5.0])
 
-GST_MAJORMINOR=0.10
-GST_REQ=0.10.29.2
-GSTPBU_REQ=0.10.32
+AM_PROG_CC_C_O
 
-PKG_CHECK_MODULES(GST, gstreamer-$GST_MAJORMINOR >= $GST_REQ)
-PKG_CHECK_MODULES(GST_PBU, gstreamer-pbutils-$GST_MAJORMINOR >= $GSTPBU_REQ)
-AC_SUBST(GST_MAJORMINOR)
+AC_ARG_WITH([default-metadata-backend],
+            [AS_HELP_STRING([--with-default-metadata-backend=your_backend],
+                            [set a default metadata backend @<:@default=gstreamer@:>@])])
 
-GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
-AC_SUBST(GST_CFLAGS)
+if test "x$with_default_metadata_backend" = 'x'
+then
+        with_default_metadata_backend='gstreamer'
+fi
+
+if test "x$with_default_metadata_backend" = 'xyes' || test "x$with_default_metadata_backend" = 'xno'
+then
+        AC_MSG_WARN([Dubious default metadata backend name: $with_default_metadata_backend])
+fi
+
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS="$GUPNP_DLNA_METADATA_BACKEND_CFLAGS -DGUPNP_DLNA_DEFAULT_METADATA_BACKEND=\\\"$with_default_metadata_backend\\\""
+
+AC_ARG_ENABLE([gstreamer-metadata-backend],
+              [AS_HELP_STRING([--enable-gstreamer-metadata-backend],
+                              [build a GStreamer metadata backend @<:@default=auto@:>@])],
+                              ,
+                              [enable_gstreamer_metadata_backend=auto])
+
+if test "x$enable_gstreamer_metadata_backend" != 'xno'
+then
+        gstreamer_found='yes'
+        GST_MAJORMINOR=1.0
+        GST_REQ=1.0
+        GSTPBU_REQ=1.0
+
+        PKG_CHECK_MODULES([GST],
+                          [gstreamer-$GST_MAJORMINOR >= $GST_REQ],
+                          ,
+                          [gstreamer_found='no'])
+        PKG_CHECK_MODULES([GST_PBU],
+                          [gstreamer-pbutils-$GST_MAJORMINOR >= $GSTPBU_REQ],
+                          ,
+                          [gstreamer_found='no'])
+
+        if test "x$gstreamer_found" = 'xyes'
+        then
+                AC_SUBST(GST_MAJORMINOR)
+
+                GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
+                AC_SUBST(GST_CFLAGS)
+                enable_gstreamer_metadata_backend='yes'
+        elif test "x$enable_gstreamer_metadata_backend" = 'xyes'
+        then
+                AC_MSG_ERROR([GStreamer $GST_MAJORMINOR not found.])
+        else
+                enable_gstreamer_metadata_backend='no'
+        fi
+fi
+
+if test "x$enable_gstreamer_metadata_backend" = 'xyes'
+then
+        AM_CONDITIONAL(GSTREAMER_METADATA_BACKEND_ENABLED, true)
+else
+        AM_CONDITIONAL(GSTREAMER_METADATA_BACKEND_ENABLED, false)
+fi
+
+AC_ARG_ENABLE([legacy-gstreamer-metadata-backend],
+              [AS_HELP_STRING([--enable-legacy-gstreamer-metadata-backend],
+                              [build a GStreamer 0.10 metadata backend @<:@default=no@:>@])],
+                              ,
+                              [enable_legacy_gstreamer_metadata_backend=no])
+
+if test "x$enable_legacy_gstreamer_metadata_backend" != 'xno'
+then
+        gstreamer_found='yes'
+        GST_LEGACY_MAJORMINOR=0.10
+        GST_LEGACY_REQ=0.10.36
+        GSTPBU_LEGACY_REQ=0.10.36
+
+        PKG_CHECK_MODULES([GST_LEGACY],
+                          [gstreamer-$GST_LEGACY_MAJORMINOR >= $GST_LEGACY_REQ],
+                          ,
+                          [gstreamer_found='no'])
+        PKG_CHECK_MODULES([GST_PBU_LEGACY],
+                          [gstreamer-pbutils-$GST_LEGACY_MAJORMINOR >= $GSTPBU_LEGACY_REQ],
+                          ,
+                          [gstreamer_found='no'])
+
+        if test "x$gstreamer_found" = 'xyes'
+        then
+                AC_SUBST(GST_LEGACY_MAJORMINOR)
+                enable_legacy_gstreamer_metadata_backend='yes'
+        elif test "x$enable_legacy_gstreamer_metadata_backend" = 'xyes'
+        then
+                AC_MSG_ERROR([GStreamer $GST_LEGACY_MAJORMINOR not found.])
+        else
+                enable_legacy_gstreamer_metadata_backend='no'
+        fi
+fi
 
-# glib-genmarshal
-GLIB_GENMARSHAL=`pkg-config --variable=glib_genmarshal glib-2.0`
-AC_SUBST(GLIB_GENMARSHAL)
+if test "x$enable_legacy_gstreamer_metadata_backend" = 'xyes'
+then
+        AM_CONDITIONAL(GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED, true)
+else
+        AM_CONDITIONAL(GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED, false)
+fi
+
+AC_ARG_WITH([default-metadata-backend-dir],
+            [AS_HELP_STRING([--with-default-metadata-backend-dir=your_directory],
+                            [set a default metadata backend directory @<:@default=$libdir/$PACKAGE_NAME@:>@])])
+
+if test "x$with_default_metadata_backend_dir" = 'x'
+then
+        with_default_metadata_backend_dir="$libdir/$PACKAGE_NAME"
+fi
+
+if test "x$with_default_metadata_backend_dir" = 'xyes' || test "x$with_default_metadata_backend_dir" = 'xno'
+then
+        AC_MSG_WARN([Dubious default metadata backend directory: $with_default_metadata_backend_dir])
+fi
+
+AC_SUBST(METADATA_DIRECTORY, $with_default_metadata_backend_dir)
+
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS="$GUPNP_DLNA_METADATA_BACKEND_CFLAGS -DGUPNP_DLNA_DEFAULT_METADATA_BACKEND_DIR=\\\"$with_default_metadata_backend_dir\\\""
+
+AC_SUBST(GUPNP_DLNA_METADATA_BACKEND_CFLAGS)
+
+PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.32])
+PKG_CHECK_MODULES([GOBJECT], [gobject-2.0])
+PKG_CHECK_MODULES([GMODULE], [gmodule-2.0])
+
+AC_SUBST(GLIB_CFLAGS)
+AC_SUBST(GLIB_LIBS)
+AC_SUBST(GOBJECT_CFLAGS)
+AC_SUBST(GOBJECT_LIBS)
+AC_SUBST(GMODULE_CFLAGS)
+AC_SUBST(GMODULE_LIBS)
+
+# Check for g_clear_pointer
+have_g_clear_pointer='no'
+PKG_CHECK_EXISTS([glib-2.0 >= 2.34],
+                 [have_g_clear_pointer='yes'])
+AS_VAR_IF([have_g_clear_pointer], [no],
+          [AC_MSG_CHECKING([for g_clear_pointer])
+           GUPNP_DLNA_TEMP_CFLAGS="$CFLAGS"
+           CFLAGS="$CFLAGS $GLIB_CFLAGS"
+           GUPNP_DLNA_TEMP_LIBS="$LIBS"
+           LIBS="$LIBS $GLIB_LIBS"
+           AC_LANG([C])
+           AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+                                             #include <glib.h>
+                                           ]],
+                                           [[
+                                             gchar *test = g_malloc (2);
+                                             g_clear_pointer (&test, g_free);
+                                             return (test == NULL)
+                                           ]])],
+                          [have_g_clear_pointer='yes'])
+          LIBS="$GUPNP_DLNA_TEMP_LIBS"
+          CFLAGS="$GUPNP_DLNA_TEMP_CFLAGS"
+          AC_MSG_RESULT([$have_g_clear_pointer])])
+
+AS_VAR_IF([have_g_clear_pointer], [no],
+          [AC_DEFINE([g_clear_pointer(ptr, func)],
+                     [\
+                      G_STMT_START { \
+                        if (ptr != NULL && func != NULL) { \
+                          gpointer g_clear_pointer_tmp_var = *ptr; \
+                          *ptr = NULL; \
+                          func (g_clear_pointer_tmp_var); \
+                        } \
+                      } G_STMT_END],
+                     [Naive g_clear_pointer implementation.])])
 
 # Debugging
-AC_ARG_ENABLE(debug,
-       [  --enable-debug          enable debugging],,
-        enable_debug=no)
+AC_ARG_ENABLE([debug],
+              AS_HELP_STRING([--enable-debug], [enable debugging @<:@default=no@:>@]),
+              ,
+              [enable_debug=no])
 if test "x$enable_debug" = "xyes"; then
         CFLAGS="$CFLAGS -g -Wall"
 fi
 
 GOBJECT_INTROSPECTION_CHECK([0.6.4])
 
+# vapigen
+AS_IF([test "x$found_introspection" = "xyes"],
+      [
+       VALA_PROG_VAPIGEN([0.18])
+      ]
+)
+AM_CONDITIONAL([HAVE_VAPIGEN], [test "x$VAPIGEN" != "x"])
+
 GTK_DOC_CHECK([1.11],[--flavour no-tmpl])
+# for fixxref
+GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
+AC_SUBST(GLIB_PREFIX)
 
 AC_CONFIG_FILES([
 Makefile
 libgupnp-dlna/Makefile
 tools/Makefile
 tests/Makefile
-tests/test-discoverer.sh
+data/Makefile
+gupnp-dlna-2.0.pc
+gupnp-dlna-metadata-2.0.pc
+gupnp-dlna-gst-2.0.pc
+gupnp-dlna-gst-legacy-2.0.pc
 doc/Makefile
 doc/version.xml
-data/Makefile
-gupnp-dlna-1.0.pc
-gupnp-dlna-1.0-uninstalled.pc
+doc/gupnp-dlna/Makefile
+doc/gupnp-dlna-metadata/Makefile
+doc/gupnp-dlna-gst/Makefile
+vala/Makefile
 ])
+AC_CONFIG_FILES([tests/test-discoverer.sh],
+                [chmod a+x tests/test-discoverer.sh])
 AC_OUTPUT
+
+echo
+echo 'Configuration status:'
+echo
+echo "Default metadata backend:                $with_default_metadata_backend"
+echo "Default metadata backend directory:      $with_default_metadata_backend_dir"
+echo "Build GStreamer metadata backend:        $enable_gstreamer_metadata_backend"
+echo "Build legacy GStreamer metadata backend: $enable_legacy_gstreamer_metadata_backend"
+echo
index 550d094..0043f46 100644 (file)
@@ -1,4 +1,4 @@
-shareddir = $(datadir)/gupnp-dlna
+include $(top_srcdir)/common.am
 
 dlnaschemas = dlna-profiles.rng
 dlnaprofiles = mp3.xml \
index c9a018b..516f600 100644 (file)
@@ -51,14 +51,15 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(top_srcdir)/common.am
 subdir = data
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -134,18 +135,30 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
 GST_LIBS = @GST_LIBS@
 GST_MAJORMINOR = @GST_MAJORMINOR@
 GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
 GST_PBU_LIBS = @GST_PBU_LIBS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
 GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
 HTML_DIR = @HTML_DIR@
 INSTALL = @INSTALL@
@@ -171,8 +184,10 @@ LIBXML_LIBS = @LIBXML_LIBS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -196,6 +211,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -249,7 +265,7 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-shareddir = $(datadir)/gupnp-dlna
+shareddir = $(datadir)/gupnp-dlna-2.0
 dlnaschemas = dlna-profiles.rng
 dlnaprofiles = mp3.xml \
               ac3.xml \
@@ -271,7 +287,7 @@ EXTRA_DIST = $(dlnaschemas) $(dlnaprofiles)
 all: all-am
 
 .SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common.am $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
            *$$dep*) \
@@ -292,13 +308,14 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
+$(top_srcdir)/common.am:
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-$(top_srcdir)/configure:  $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 
index af0bb71..26589ef 100644 (file)
       <field name="profile" type="string">
         <value>lc</value>
       </field>
-      <!-- TODO: not exported in Gst yet
-      <field name="level" type="int">
-        <range min="1" max="2" />
+      <field name="level" type="string">
+        <value>1</value>
+        <value>2</value>
       </field>
-      -->
       <field name="channels" type="int">
         <range min="1" max="2" />
       </field>
index c4c98b5..501ab3e 100644 (file)
@@ -65,7 +65,7 @@
       <field name="width" type="int">
         <range min="1" max="4096" />
       </field>
-      <field name="depth" type="int">
+      <field name="depth" type="int" used="in-strict">
         <value>1</value>
         <value>2</value>
         <value>4</value>
index 5601294..192859d 100644 (file)
@@ -1,83 +1,10 @@
-## Process this file with automake to produce Makefile.in
+DIST_SUBDIRS = gupnp-dlna gupnp-dlna-metadata gupnp-dlna-gst .
+SUBDIRS = gupnp-dlna gupnp-dlna-metadata
 
-# We require automake 1.6 at least.
-AUTOMAKE_OPTIONS = 1.6
+if GSTREAMER_METADATA_BACKEND_ENABLED
+SUBDIRS += gupnp-dlna-gst
+endif
 
-# This is a blank Makefile.am for using gtk-doc.
-# Copy this to your project's API docs directory and modify the variables to
-# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
-# of using the various options.
+SUBDIRS += .
 
-# The name of the module, e.g. 'glib'.
-DOC_MODULE=gupnp-dlna
-
-# The top-level SGML file. You can change this if you want to.
-DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
-
-# The directory containing the source code. Relative to $(srcdir).
-# gtk-doc will search all .c & .h files beneath here for inline comments
-# documenting the functions and macros.
-# e.g. DOC_SOURCE_DIR=../../../gtk
-DOC_SOURCE_DIR=../libgupnp-dlna
-
-# Extra options to pass to gtkdoc-scangobj. Not normally needed.
-SCANGOBJ_OPTIONS=--type-init-func="gst_init(NULL,NULL)"
-
-# Extra options to supply to gtkdoc-scan.
-# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
-SCAN_OPTIONS=--deprecated-guards="GUPNP_DISABLE_DEPRECATED"
-
-# Extra options to supply to gtkdoc-mkdb.
-# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
-MKDB_OPTIONS=--sgml-mode --output-format=xml
-
-# Extra options to supply to gtkdoc-mktmpl
-# e.g. MKTMPL_OPTIONS=--only-section-tmpl
-MKTMPL_OPTIONS=
-
-# Extra options to supply to gtkdoc-fixref. Not normally needed.
-# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
-FIXXREF_OPTIONS=
-
-# Used for dependencies. The docs will be rebuilt if any of these change.
-# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
-# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
-HFILE_GLOB=$(top_srcdir)/libgupnp-dlna/*.h
-CFILE_GLOB=$(top_srcdir)/libgupnp-dlna/*.c
-
-# Header files to ignore when scanning.
-# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
-IGNORE_HFILES= xml-util.h              \
-              gvalue-util.h            \
-              profile-loading.h        \
-              gupnp-dlna-marshal.h
-
-# Images to copy into HTML directory.
-# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
-HTML_IMAGES=
-
-# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
-# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
-content_files=version.xml
-
-# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
-# These files must be listed here *and* in content_files
-# e.g. expand_content_files=running.sgml
-expand_content_files=
-
-# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
-# Only needed if you are using gtkdoc-scangobj to dynamically query widget
-# signals and properties.
-# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
-# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
-INCLUDES=-I$(top_srcdir) \
-        $(GST_CFLAGS)
-GTKDOC_LIBS=$(top_builddir)/libgupnp-dlna/libgupnp-dlna-1.0.la \
-           $(GST_LIBS)
-
-# This includes the standard gtk-doc make rules, copied by gtkdocize.
-include $(top_srcdir)/gtk-doc.make
-
-# Other files to distribute
-# e.g. EXTRA_DIST += version.xml.in
-EXTRA_DIST += version.xml.in
+EXTRA_DIST = version.xml.in
index 06a5602..520740c 100644 (file)
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-
-# -*- mode: makefile -*-
-
-####################################
-# Everything below here is generic #
-####################################
 VPATH = @srcdir@
 am__make_dryrun = \
   { \
@@ -56,15 +50,16 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-       $(srcdir)/version.xml.in $(top_srcdir)/gtk-doc.make
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am__append_1 = gupnp-dlna-gst
 subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(srcdir)/version.xml.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -79,12 +74,51 @@ am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
 SOURCES =
 DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-dvi-recursive install-exec-recursive \
+       install-html-recursive install-info-recursive \
+       install-pdf-recursive install-ps-recursive install-recursive \
+       installcheck-recursive installdirs-recursive pdf-recursive \
+       ps-recursive uninstall-recursive
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+       distdir
+ETAGS = etags
+CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -111,18 +145,30 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
 GST_LIBS = @GST_LIBS@
 GST_MAJORMINOR = @GST_MAJORMINOR@
 GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
 GST_PBU_LIBS = @GST_PBU_LIBS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
 GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
 HTML_DIR = @HTML_DIR@
 INSTALL = @INSTALL@
@@ -148,8 +194,10 @@ LIBXML_LIBS = @LIBXML_LIBS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -173,6 +221,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -226,135 +275,13 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-
-# We require automake 1.6 at least.
-AUTOMAKE_OPTIONS = 1.6
-
-# This is a blank Makefile.am for using gtk-doc.
-# Copy this to your project's API docs directory and modify the variables to
-# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
-# of using the various options.
-
-# The name of the module, e.g. 'glib'.
-DOC_MODULE = gupnp-dlna
-
-# The top-level SGML file. You can change this if you want to.
-DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml
-
-# The directory containing the source code. Relative to $(srcdir).
-# gtk-doc will search all .c & .h files beneath here for inline comments
-# documenting the functions and macros.
-# e.g. DOC_SOURCE_DIR=../../../gtk
-DOC_SOURCE_DIR = ../libgupnp-dlna
-
-# Extra options to pass to gtkdoc-scangobj. Not normally needed.
-SCANGOBJ_OPTIONS = --type-init-func="gst_init(NULL,NULL)"
-
-# Extra options to supply to gtkdoc-scan.
-# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
-SCAN_OPTIONS = --deprecated-guards="GUPNP_DISABLE_DEPRECATED"
-
-# Extra options to supply to gtkdoc-mkdb.
-# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
-MKDB_OPTIONS = --sgml-mode --output-format=xml
-
-# Extra options to supply to gtkdoc-mktmpl
-# e.g. MKTMPL_OPTIONS=--only-section-tmpl
-MKTMPL_OPTIONS = 
-
-# Extra options to supply to gtkdoc-fixref. Not normally needed.
-# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
-FIXXREF_OPTIONS = 
-
-# Used for dependencies. The docs will be rebuilt if any of these change.
-# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
-# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
-HFILE_GLOB = $(top_srcdir)/libgupnp-dlna/*.h
-CFILE_GLOB = $(top_srcdir)/libgupnp-dlna/*.c
-
-# Header files to ignore when scanning.
-# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
-IGNORE_HFILES = xml-util.h             \
-              gvalue-util.h            \
-              profile-loading.h        \
-              gupnp-dlna-marshal.h
-
-
-# Images to copy into HTML directory.
-# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
-HTML_IMAGES = 
-
-# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
-# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
-content_files = version.xml
-
-# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
-# These files must be listed here *and* in content_files
-# e.g. expand_content_files=running.sgml
-expand_content_files = 
-
-# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
-# Only needed if you are using gtkdoc-scangobj to dynamically query widget
-# signals and properties.
-# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
-# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
-INCLUDES = -I$(top_srcdir) \
-        $(GST_CFLAGS)
-
-GTKDOC_LIBS = $(top_builddir)/libgupnp-dlna/libgupnp-dlna-1.0.la \
-           $(GST_LIBS)
-
-@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
-@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
-@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = 
-@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute
-
-# We set GPATH here; this gives us semantics for GNU make
-# which are more like other make's VPATH, when it comes to
-# whether a source that is a target of one rule is then
-# searched for in VPATH/GPATH.
-#
-GPATH = $(srcdir)
-TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
-SETUP_FILES = \
-       $(content_files)                \
-       $(DOC_MAIN_SGML_FILE)           \
-       $(DOC_MODULE)-sections.txt      \
-       $(DOC_MODULE)-overrides.txt
-
-
-# This includes the standard gtk-doc make rules, copied by gtkdocize.
-
-# Other files to distribute
-# e.g. EXTRA_DIST += version.xml.in
-EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in
-DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
-       html-build.stamp pdf-build.stamp \
-       sgml.stamp html.stamp pdf.stamp
-
-SCANOBJ_FILES = \
-       $(DOC_MODULE).args       \
-       $(DOC_MODULE).hierarchy  \
-       $(DOC_MODULE).interfaces \
-       $(DOC_MODULE).prerequisites \
-       $(DOC_MODULE).signals
-
-REPORT_FILES = \
-       $(DOC_MODULE)-undocumented.txt \
-       $(DOC_MODULE)-undeclared.txt \
-       $(DOC_MODULE)-unused.txt
-
-CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
-@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = 
-@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp
-@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = 
-@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp
-all: all-am
+DIST_SUBDIRS = gupnp-dlna gupnp-dlna-metadata gupnp-dlna-gst .
+SUBDIRS = gupnp-dlna gupnp-dlna-metadata $(am__append_1) .
+EXTRA_DIST = version.xml.in
+all: all-recursive
 
 .SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
            *$$dep*) \
@@ -375,14 +302,13 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
-$(top_srcdir)/gtk-doc.make:
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-$(top_srcdir)/configure:  $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in
@@ -393,12 +319,141 @@ mostlyclean-libtool:
 
 clean-libtool:
        -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+       @fail= failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       mkid -fID $$unique
 tags: TAGS
-TAGS:
 
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
 ctags: CTAGS
-CTAGS:
-
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
 distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -430,22 +485,45 @@ distdir: $(DISTFILES)
            || exit 1; \
          fi; \
        done
-       $(MAKE) $(AM_MAKEFLAGS) \
-         top_distdir="$(top_distdir)" distdir="$(distdir)" \
-         dist-hook
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
 check-am: all-am
-check: check-am
-all-am: Makefile all-local
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
 
 install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
-installcheck: installcheck-am
+installcheck: installcheck-recursive
 install-strip:
        if test -z '$(STRIP)'; then \
          $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
@@ -459,7 +537,6 @@ install-strip:
 mostlyclean-generic:
 
 clean-generic:
-       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
 
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
@@ -468,276 +545,90 @@ distclean-generic:
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
+clean: clean-recursive
 
-clean-am: clean-generic clean-libtool clean-local mostlyclean-am
+clean-am: clean-generic clean-libtool mostlyclean-am
 
-distclean: distclean-am
+distclean: distclean-recursive
        -rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-local
+distclean-am: clean-am distclean-generic distclean-tags
 
-dvi: dvi-am
+dvi: dvi-recursive
 
 dvi-am:
 
-html: html-am
+html: html-recursive
 
 html-am:
 
-info: info-am
+info: info-recursive
 
 info-am:
 
-install-data-am: install-data-local
+install-data-am:
 
-install-dvi: install-dvi-am
+install-dvi: install-dvi-recursive
 
 install-dvi-am:
 
 install-exec-am:
 
-install-html: install-html-am
+install-html: install-html-recursive
 
 install-html-am:
 
-install-info: install-info-am
+install-info: install-info-recursive
 
 install-info-am:
 
 install-man:
 
-install-pdf: install-pdf-am
+install-pdf: install-pdf-recursive
 
 install-pdf-am:
 
-install-ps: install-ps-am
+install-ps: install-ps-recursive
 
 install-ps-am:
 
 installcheck-am:
 
-maintainer-clean: maintainer-clean-am
+maintainer-clean: maintainer-clean-recursive
        -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic \
-       maintainer-clean-local
+maintainer-clean-am: distclean-am maintainer-clean-generic
 
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
 
 mostlyclean-am: mostlyclean-generic mostlyclean-libtool
 
-pdf: pdf-am
+pdf: pdf-recursive
 
 pdf-am:
 
-ps: ps-am
+ps: ps-recursive
 
 ps-am:
 
-uninstall-am: uninstall-local
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am all-local check check-am clean clean-generic \
-       clean-libtool clean-local dist-hook distclean \
-       distclean-generic distclean-libtool distclean-local distdir \
-       dvi dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-data-local install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic \
-       maintainer-clean-local mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
-       uninstall-local
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+       install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+       all all-am check check-am clean clean-generic clean-libtool \
+       ctags ctags-recursive distclean distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs installdirs-am maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+       uninstall uninstall-am
 
 
-@ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
-@ENABLE_GTK_DOC_FALSE@all-local:
-
-docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
-
-$(REPORT_FILES): sgml-build.stamp
-
-#### setup ####
-
-setup-build.stamp:
-       -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
-           echo '  DOC   Preparing build'; \
-           files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
-           if test "x$$files" != "x" ; then \
-               for file in $$files ; do \
-                   test -f $(abs_srcdir)/$$file && \
-                       cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
-               done; \
-           fi; \
-       fi
-       @touch setup-build.stamp
-
-#### scan ####
-
-scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
-       @echo '  DOC   Scanning header files'
-       @_source_dir='' ; \
-       for i in $(DOC_SOURCE_DIR) ; do \
-           _source_dir="$${_source_dir} --source-dir=$$i" ; \
-       done ; \
-       gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
-       @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
-           echo "  DOC   Introspecting gobjects"; \
-           scanobj_options=""; \
-           gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-           if test "$(?)" = "0"; then \
-               if test "x$(V)" = "x1"; then \
-                   scanobj_options="--verbose"; \
-               fi; \
-           fi; \
-           CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
-           gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \
-       else \
-           for i in $(SCANOBJ_FILES) ; do \
-               test -f $$i || touch $$i ; \
-           done \
-       fi
-       @touch scan-build.stamp
-
-$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
-       @true
-
-#### xml ####
-
-sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
-       @echo '  DOC   Building XML'
-       @_source_dir='' ; \
-       for i in $(DOC_SOURCE_DIR) ; do \
-           _source_dir="$${_source_dir} --source-dir=$$i" ; \
-       done ; \
-       gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
-       @touch sgml-build.stamp
-
-sgml.stamp: sgml-build.stamp
-       @true
-
-#### html ####
-
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
-       @echo '  DOC   Building HTML'
-       @rm -rf html
-       @mkdir html
-       @mkhtml_options=""; \
-       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-       if test "$(?)" = "0"; then \
-         if test "x$(V)" = "x1"; then \
-           mkhtml_options="$$mkhtml_options --verbose"; \
-         fi; \
-       fi; \
-       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
-       if test "$(?)" = "0"; then \
-         mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
-       fi; \
-       cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
-       -@test "x$(HTML_IMAGES)" = "x" || \
-       for file in $(HTML_IMAGES) ; do \
-         if test -f $(abs_srcdir)/$$file ; then \
-           cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
-         fi; \
-         if test -f $(abs_builddir)/$$file ; then \
-           cp $(abs_builddir)/$$file $(abs_builddir)/html; \
-         fi; \
-       done;
-       @echo '  DOC   Fixing cross-references'
-       @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
-       @touch html-build.stamp
-
-#### pdf ####
-
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
-       @echo '  DOC   Building PDF'
-       @rm -f $(DOC_MODULE).pdf
-       @mkpdf_options=""; \
-       gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
-       if test "$(?)" = "0"; then \
-         if test "x$(V)" = "x1"; then \
-           mkpdf_options="$$mkpdf_options --verbose"; \
-         fi; \
-       fi; \
-       if test "x$(HTML_IMAGES)" != "x"; then \
-         for img in $(HTML_IMAGES); do \
-           part=`dirname $$img`; \
-           echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \
-           if test $$? != 0; then \
-             mkpdf_options="$$mkpdf_options --imgdir=$$part"; \
-           fi; \
-         done; \
-       fi; \
-       gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
-       @touch pdf-build.stamp
-
-##############
-
-clean-local:
-       @rm -f *~ *.bak
-       @rm -rf .libs
-
-distclean-local:
-       @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
-           $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-       @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
-           rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
-       fi
-
-maintainer-clean-local: clean
-       @rm -rf xml html
-
-install-data-local:
-       @installfiles=`echo $(builddir)/html/*`; \
-       if test "$$installfiles" = '$(builddir)/html/*'; \
-       then echo 1>&2 'Nothing to install' ; \
-       else \
-         if test -n "$(DOC_MODULE_VERSION)"; then \
-           installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
-         else \
-           installdir="$(DESTDIR)$(TARGET_DIR)"; \
-         fi; \
-         $(mkinstalldirs) $${installdir} ; \
-         for i in $$installfiles; do \
-           echo ' $(INSTALL_DATA) '$$i ; \
-           $(INSTALL_DATA) $$i $${installdir}; \
-         done; \
-         if test -n "$(DOC_MODULE_VERSION)"; then \
-           mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
-             $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
-         fi; \
-         $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
-       fi
-
-uninstall-local:
-       @if test -n "$(DOC_MODULE_VERSION)"; then \
-         installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
-       else \
-         installdir="$(DESTDIR)$(TARGET_DIR)"; \
-       fi; \
-       rm -rf $${installdir}
-
-#
-# Require gtk-doc when making dist
-#
-@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc:
-@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc:
-@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist"
-@ENABLE_GTK_DOC_FALSE@ @false
-
-dist-hook: dist-check-gtkdoc dist-hook-local
-       @mkdir $(distdir)/html
-       @cp ./html/* $(distdir)/html
-       @-cp ./$(DOC_MODULE).pdf $(distdir)/
-       @-cp ./$(DOC_MODULE).types $(distdir)/
-       @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/
-       @cd $(distdir) && rm -f $(DISTCLEANFILES)
-       @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
-
-.PHONY : dist-hook-local docs
-
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/doc/gupnp-dlna-gst/Makefile.am b/doc/gupnp-dlna-gst/Makefile.am
new file mode 100644 (file)
index 0000000..3509b34
--- /dev/null
@@ -0,0 +1,91 @@
+## Process this file with automake to produce Makefile.in
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE=gupnp-dlna-gst
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
+
+# The directory containing the source code. Relative to $(srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting the functions and macros.
+# e.g. DOC_SOURCE_DIR=../../../gtk
+DOC_SOURCE_DIR=$(srcdir)/../../libgupnp-dlna/metadata-backends/gstreamer
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS=
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS=--deprecated-guards="GUPNP_DISABLE_DEPRECATED"
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS = \
+       --sgml-mode \
+       --output-format=xml
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS=
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS = \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gst-plugins-base-libs-1.0 \
+       --extra-dir=../gupnp-dlna/html
+
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB=$(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.h
+CFILE_GLOB=$(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.c
+
+# Header files to ignore when scanning.
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES = \
+       gupnp-dlna-gst-information.h \
+       gupnp-dlna-gst-audio-information.h \
+       gupnp-dlna-gst-container-information.h \
+       gupnp-dlna-gst-image-information.h \
+       gupnp-dlna-gst-video-information.h \
+       gupnp-dlna-gst-info-utils.h \
+       gupnp-dlna-gst-metadata-extractor.h
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES=
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files=../version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files=
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES=-I$(top_srcdir)
+GTKDOC_LIBS= \
+       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la \
+       $(top_builddir)/libgupnp-dlna/metadata-backends/gstreamer/libgupnp-dlna-gst-2.0.la
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+DISTCLEANFILES = version.xml
diff --git a/doc/gupnp-dlna-gst/Makefile.in b/doc/gupnp-dlna-gst/Makefile.in
new file mode 100644 (file)
index 0000000..aeaf05d
--- /dev/null
@@ -0,0 +1,769 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -*- mode: makefile -*-
+
+####################################
+# Everything below here is generic #
+####################################
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(top_srcdir)/gtk-doc.make
+subdir = doc/gupnp-dlna-gst
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
+GST_LIBS = @GST_LIBS@
+GST_MAJORMINOR = @GST_MAJORMINOR@
+GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
+GST_PBU_LIBS = @GST_PBU_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
+GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBXML_CFLAGS = @LIBXML_CFLAGS@
+LIBXML_LIBS = @LIBXML_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE = gupnp-dlna-gst
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml
+
+# The directory containing the source code. Relative to $(srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting the functions and macros.
+# e.g. DOC_SOURCE_DIR=../../../gtk
+DOC_SOURCE_DIR = $(srcdir)/../../libgupnp-dlna/metadata-backends/gstreamer
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS = 
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS = --deprecated-guards="GUPNP_DISABLE_DEPRECATED"
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS = \
+       --sgml-mode \
+       --output-format=xml
+
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS = 
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS = \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gst-plugins-base-libs-1.0 \
+       --extra-dir=../gupnp-dlna/html
+
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB = $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.h
+CFILE_GLOB = $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.c
+
+# Header files to ignore when scanning.
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES = \
+       gupnp-dlna-gst-information.h \
+       gupnp-dlna-gst-audio-information.h \
+       gupnp-dlna-gst-container-information.h \
+       gupnp-dlna-gst-image-information.h \
+       gupnp-dlna-gst-video-information.h \
+       gupnp-dlna-gst-info-utils.h \
+       gupnp-dlna-gst-metadata-extractor.h
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES = 
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files = ../version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files = 
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES = -I$(top_srcdir)
+GTKDOC_LIBS = \
+       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la \
+       $(top_builddir)/libgupnp-dlna/metadata-backends/gstreamer/libgupnp-dlna-gst-2.0.la
+
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = 
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute
+
+# We set GPATH here; this gives us semantics for GNU make
+# which are more like other make's VPATH, when it comes to
+# whether a source that is a target of one rule is then
+# searched for in VPATH/GPATH.
+#
+GPATH = $(srcdir)
+TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
+SETUP_FILES = \
+       $(content_files)                \
+       $(DOC_MAIN_SGML_FILE)           \
+       $(DOC_MODULE)-sections.txt      \
+       $(DOC_MODULE)-overrides.txt
+
+EXTRA_DIST = \
+       $(HTML_IMAGES)                  \
+       $(SETUP_FILES)
+
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
+       html-build.stamp pdf-build.stamp \
+       sgml.stamp html.stamp pdf.stamp
+
+SCANOBJ_FILES = \
+       $(DOC_MODULE).args       \
+       $(DOC_MODULE).hierarchy  \
+       $(DOC_MODULE).interfaces \
+       $(DOC_MODULE).prerequisites \
+       $(DOC_MODULE).signals
+
+REPORT_FILES = \
+       $(DOC_MODULE)-undocumented.txt \
+       $(DOC_MODULE)-undeclared.txt \
+       $(DOC_MODULE)-unused.txt
+
+CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = 
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = 
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+DISTCLEANFILES = version.xml
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/gupnp-dlna-gst/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu doc/gupnp-dlna-gst/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+$(top_srcdir)/gtk-doc.make:
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile all-local
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-local mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-local
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+       maintainer-clean-local
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am all-local check check-am clean clean-generic \
+       clean-libtool clean-local dist-hook distclean \
+       distclean-generic distclean-libtool distclean-local distdir \
+       dvi dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-data-local install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic \
+       maintainer-clean-local mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+       uninstall-local
+
+
+@ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+@ENABLE_GTK_DOC_FALSE@all-local:
+
+docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+
+$(REPORT_FILES): sgml-build.stamp
+
+#### setup ####
+
+setup-build.stamp:
+       -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           echo '  DOC   Preparing build'; \
+           files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+           if test "x$$files" != "x" ; then \
+               for file in $$files ; do \
+                   test -f $(abs_srcdir)/$$file && \
+                       cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
+               done; \
+           fi; \
+       fi
+       @touch setup-build.stamp
+
+#### scan ####
+
+scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
+       @echo '  DOC   Scanning header files'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
+       @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
+           echo "  DOC   Introspecting gobjects"; \
+           scanobj_options=""; \
+           gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+           if test "$(?)" = "0"; then \
+               if test "x$(V)" = "x1"; then \
+                   scanobj_options="--verbose"; \
+               fi; \
+           fi; \
+           CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
+           gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \
+       else \
+           for i in $(SCANOBJ_FILES) ; do \
+               test -f $$i || touch $$i ; \
+           done \
+       fi
+       @touch scan-build.stamp
+
+$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
+       @true
+
+#### xml ####
+
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+       @echo '  DOC   Building XML'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
+       @touch sgml-build.stamp
+
+sgml.stamp: sgml-build.stamp
+       @true
+
+#### html ####
+
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building HTML'
+       @rm -rf html
+       @mkdir html
+       @mkhtml_options=""; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkhtml_options="$$mkhtml_options --verbose"; \
+         fi; \
+       fi; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
+       if test "$(?)" = "0"; then \
+         mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
+       fi; \
+       cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
+       -@test "x$(HTML_IMAGES)" = "x" || \
+       for file in $(HTML_IMAGES) ; do \
+         if test -f $(abs_srcdir)/$$file ; then \
+           cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
+         fi; \
+         if test -f $(abs_builddir)/$$file ; then \
+           cp $(abs_builddir)/$$file $(abs_builddir)/html; \
+         fi; \
+       done;
+       @echo '  DOC   Fixing cross-references'
+       @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
+       @touch html-build.stamp
+
+#### pdf ####
+
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building PDF'
+       @rm -f $(DOC_MODULE).pdf
+       @mkpdf_options=""; \
+       gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkpdf_options="$$mkpdf_options --verbose"; \
+         fi; \
+       fi; \
+       if test "x$(HTML_IMAGES)" != "x"; then \
+         for img in $(HTML_IMAGES); do \
+           part=`dirname $$img`; \
+           echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \
+           if test $$? != 0; then \
+             mkpdf_options="$$mkpdf_options --imgdir=$$part"; \
+           fi; \
+         done; \
+       fi; \
+       gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
+       @touch pdf-build.stamp
+
+##############
+
+clean-local:
+       @rm -f *~ *.bak
+       @rm -rf .libs
+
+distclean-local:
+       @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
+           $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+       @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
+       fi
+
+maintainer-clean-local: clean
+       @rm -rf xml html
+
+install-data-local:
+       @installfiles=`echo $(builddir)/html/*`; \
+       if test "$$installfiles" = '$(builddir)/html/*'; \
+       then echo 1>&2 'Nothing to install' ; \
+       else \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+         else \
+           installdir="$(DESTDIR)$(TARGET_DIR)"; \
+         fi; \
+         $(mkinstalldirs) $${installdir} ; \
+         for i in $$installfiles; do \
+           echo ' $(INSTALL_DATA) '$$i ; \
+           $(INSTALL_DATA) $$i $${installdir}; \
+         done; \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
+             $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
+         fi; \
+         $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
+       fi
+
+uninstall-local:
+       @if test -n "$(DOC_MODULE_VERSION)"; then \
+         installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+       else \
+         installdir="$(DESTDIR)$(TARGET_DIR)"; \
+       fi; \
+       rm -rf $${installdir}
+
+#
+# Require gtk-doc when making dist
+#
+@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc:
+@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc:
+@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist"
+@ENABLE_GTK_DOC_FALSE@ @false
+
+dist-hook: dist-check-gtkdoc dist-hook-local
+       @mkdir $(distdir)/html
+       @cp ./html/* $(distdir)/html
+       @-cp ./$(DOC_MODULE).pdf $(distdir)/
+       @-cp ./$(DOC_MODULE).types $(distdir)/
+       @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/
+       @cd $(distdir) && rm -f $(DISTCLEANFILES)
+       @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
+
+.PHONY : dist-hook-local docs
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/gupnp-dlna-gst/gupnp-dlna-gst-docs.sgml b/doc/gupnp-dlna-gst/gupnp-dlna-gst-docs.sgml
new file mode 100644 (file)
index 0000000..605c39d
--- /dev/null
@@ -0,0 +1,53 @@
+<?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 SYSTEM "../version.xml">
+]>
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+  <bookinfo>
+    <title>GUPnP DLNA Gstreamer Reference Manual</title>
+
+    <releaseinfo>Version &version;</releaseinfo>
+
+    <copyright>
+      <year>2013</year>
+      <holder>Intel Corporation</holder>
+    </copyright>
+
+    <legalnotice>
+      <para>
+        Permission is granted to copy, distribute and/or modify this
+        document under the terms of the <citetitle>GNU Free
+        Documentation License</citetitle>, Version 1.1 or any later
+        version published by the Free Software Foundation with no
+        Invariant Sections, no Front-Cover Texts, and no Back-Cover
+        Texts. You may obtain a copy of the <citetitle>GNU Free
+        Documentation License</citetitle> from the Free Software
+        Foundation by visiting <ulink type="http"
+        url="http://www.fsf.org">their Web site</ulink> or by writing
+        to:
+
+        <address>
+          The Free Software Foundation, Inc.,
+          <street>59 Temple Place</street> - Suite 330,
+          <city>Boston</city>, <state>MA</state> <postcode>02111-1307</postcode>,
+          <country>USA</country>
+        </address>
+      </para>
+    </legalnotice>
+  </bookinfo>
+
+  <chapter>
+    <title>GUPnP DLNA Gstreamer</title>
+
+    <para>
+      GUPnP DLNA GStreamer is a set of utility function targeted for GStreamer.
+    </para>
+
+    <xi:include href="xml/gupnp-dlna-gst-utils.xml"/>
+    <xi:include href="xml/api-index-full.xml"/>
+
+  </chapter>
+
+  <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
+</book>
diff --git a/doc/gupnp-dlna-gst/gupnp-dlna-gst-sections.txt b/doc/gupnp-dlna-gst/gupnp-dlna-gst-sections.txt
new file mode 100644 (file)
index 0000000..6390dc0
--- /dev/null
@@ -0,0 +1,5 @@
+<SECTION>
+<FILE>gupnp-dlna-gst-utils</FILE>
+gupnp_dlna_gst_utils_information_from_discoverer_info
+</SECTION>
+
diff --git a/doc/gupnp-dlna-gst/gupnp-dlna-gst.types b/doc/gupnp-dlna-gst/gupnp-dlna-gst.types
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/gupnp-dlna-gst/html/annotation-glossary.html b/doc/gupnp-dlna-gst/html/annotation-glossary.html
new file mode 100644 (file)
index 0000000..a3b0f91
--- /dev/null
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Annotation Glossary</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Gstreamer Reference Manual">
+<link rel="up" href="index.html" title="GUPnP DLNA Gstreamer Reference Manual">
+<link rel="prev" href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html" title="gupnp-dlna-gst-utils">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Gstreamer Reference Manual</th>
+<td> </td>
+</tr>
+<tr><td colspan="5" class="shortcuts"><a class="shortcut" href="#glsT">T</a></td></tr>
+</table>
+<div class="glossary">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
+<a name="glsT"></a><h3 class="title">T</h3>
+<dt>
+<a name="annotation-glossterm-transfer%20full"></a>transfer full</dt>
+<dd><p>Free data after the code is done.</p></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna-gst/html/ch01.html b/doc/gupnp-dlna-gst/html/ch01.html
new file mode 100644 (file)
index 0000000..8ee29a2
--- /dev/null
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnP DLNA Gstreamer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Gstreamer Reference Manual">
+<link rel="up" href="index.html" title="GUPnP DLNA Gstreamer Reference Manual">
+<link rel="prev" href="index.html" title="GUPnP DLNA Gstreamer Reference Manual">
+<link rel="next" href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html" title="gupnp-dlna-gst-utils">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Gstreamer Reference Manual</th>
+<td><a accesskey="n" href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts"><a class="shortcut" href="#idxD">D</a></td></tr>
+</table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="idp4203888"></a>GUPnP DLNA Gstreamer</h2></div></div></div>
+<div class="toc"><dl><dt>
+<span class="refentrytitle"><a href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html">gupnp-dlna-gst-utils</a></span><span class="refpurpose"></span>
+</dt></dl></div>
+<p>
+      GUPnP DLNA GStreamer is a set of utility function targeted for GStreamer.
+    </p>
+<a name="idx"></a><a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html#gupnp-dlna-gst-utils-information-from-discoverer-info" title="gupnp_dlna_gst_utils_information_from_discoverer_info ()">gupnp_dlna_gst_utils_information_from_discoverer_info</a>, function in <a class="link" href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html" title="gupnp-dlna-gst-utils">gupnp-dlna-gst-utils</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna-gst/html/gupnp-dlna-gst-gupnp-dlna-gst-utils.html b/doc/gupnp-dlna-gst/html/gupnp-dlna-gst-gupnp-dlna-gst-utils.html
new file mode 100644 (file)
index 0000000..15ec9d2
--- /dev/null
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gupnp-dlna-gst-utils</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Gstreamer Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA Gstreamer">
+<link rel="prev" href="ch01.html" title="GUPnP DLNA Gstreamer">
+<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="ch01.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Gstreamer Reference Manual</th>
+<td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gupnp-dlna-gst-gupnp-dlna-gst-utils.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#gupnp-dlna-gst-gupnp-dlna-gst-utils.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gupnp-dlna-gst-gupnp-dlna-gst-utils"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gupnp-dlna-gst-gupnp-dlna-gst-utils.top_of_page"></a>gupnp-dlna-gst-utils</span></h2>
+<p>gupnp-dlna-gst-utils</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gupnp-dlna-gst-gupnp-dlna-gst-utils.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis"><a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="returnvalue">GUPnPDLNAInformation</span></a> * <a class="link" href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html#gupnp-dlna-gst-utils-information-from-discoverer-info" title="gupnp_dlna_gst_utils_information_from_discoverer_info ()">gupnp_dlna_gst_utils_information_from_discoverer_info</a>
+                                                        (<em class="parameter"><code><span class="type">GstDiscovererInfo</span> *info</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gst-gupnp-dlna-gst-utils.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gst-gupnp-dlna-gst-utils.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gupnp-dlna-gst-utils-information-from-discoverer-info"></a><h3>gupnp_dlna_gst_utils_information_from_discoverer_info ()</h3>
+<pre class="programlisting"><a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="returnvalue">GUPnPDLNAInformation</span></a> * gupnp_dlna_gst_utils_information_from_discoverer_info
+                                                        (<em class="parameter"><code><span class="type">GstDiscovererInfo</span> *info</code></em>);</pre>
+<p>
+This utility function creates a <a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a> from
+<span class="type">GstDiscovererInfo</span>. Its purpose is mainly to pass its result to
+<a href="../gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-from-info"><code class="function">gupnp_dlna_profile_guesser_guess_profile_from_info()</code></a> to avoid
+rediscovering of a URI. Created <a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a> takes a
+reference on <em class="parameter"><code>info</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <span class="type">GstDiscovererInfo</span> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a>. Unref it when
+done with it. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna-gst/html/gupnp-dlna-gst.devhelp2 b/doc/gupnp-dlna-gst/html/gupnp-dlna-gst.devhelp2
new file mode 100644 (file)
index 0000000..63a28c6
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
+<book xmlns="http://www.devhelp.net/book" title="GUPnP DLNA Gstreamer Reference Manual" link="index.html" author="" name="gupnp-dlna-gst" version="2" language="c">
+  <chapters>
+    <sub name="GUPnP DLNA Gstreamer" link="ch01.html">
+      <sub name="gupnp-dlna-gst-utils" link="gupnp-dlna-gst-gupnp-dlna-gst-utils.html"/>
+    </sub>
+    <sub name="Annotation Glossary" link="annotation-glossary.html"/>
+  </chapters>
+  <functions>
+    <keyword type="function" name="gupnp_dlna_gst_utils_information_from_discoverer_info ()" link="gupnp-dlna-gst-gupnp-dlna-gst-utils.html#gupnp-dlna-gst-utils-information-from-discoverer-info"/>
+  </functions>
+</book>
diff --git a/doc/gupnp-dlna-gst/html/index.html b/doc/gupnp-dlna-gst/html/index.html
new file mode 100644 (file)
index 0000000..cc740ee
--- /dev/null
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnP DLNA Gstreamer Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Gstreamer Reference Manual">
+<link rel="next" href="ch01.html" title="GUPnP DLNA Gstreamer">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="book">
+<div class="titlepage">
+<div>
+<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GUPnP DLNA Gstreamer Reference Manual</p></th></tr></table></div>
+<div><p class="releaseinfo">Version 0.10.0
+</p></div>
+<div><p class="copyright">Copyright Â© 2013 Intel Corporation</p></div>
+<div><div class="legalnotice">
+<a name="idp202352"></a><p>
+        Permission is granted to copy, distribute and/or modify this
+        document under the terms of the <em class="citetitle">GNU Free
+        Documentation License</em>, Version 1.1 or any later
+        version published by the Free Software Foundation with no
+        Invariant Sections, no Front-Cover Texts, and no Back-Cover
+        Texts. You may obtain a copy of the <em class="citetitle">GNU Free
+        Documentation License</em> from the Free Software
+        Foundation by visiting <a class="ulink" href="http://www.fsf.org" target="_top">their Web site</a> or by writing
+        to:
+
+        </p>
+<div class="address"><p><br>
+          The Free Software Foundation, Inc.,<br>
+          <span class="street">59 Temple Place</span> - Suite 330,<br>
+          <span class="city">Boston</span>, <span class="state">MA</span> <span class="postcode">02111-1307</span>,<br>
+          <span class="country">USA</span><br>
+        </p></div>
+<p>
+      </p>
+</div></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl>
+<dt><span class="chapter"><a href="ch01.html">GUPnP DLNA Gstreamer</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gupnp-dlna-gst-gupnp-dlna-gst-utils.html">gupnp-dlna-gst-utils</a></span><span class="refpurpose"></span>
+</dt></dl></dd>
+<dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna-gst/html/index.sgml b/doc/gupnp-dlna-gst/html/index.sgml
new file mode 100644 (file)
index 0000000..97c5c73
--- /dev/null
@@ -0,0 +1,6 @@
+<ANCHOR id="gupnp-dlna-gst-gupnp-dlna-gst-utils" href="gupnp-dlna-gst/gupnp-dlna-gst-gupnp-dlna-gst-utils.html">
+<ANCHOR id="gupnp-dlna-gst-gupnp-dlna-gst-utils.synopsis" href="gupnp-dlna-gst/gupnp-dlna-gst-gupnp-dlna-gst-utils.html#gupnp-dlna-gst-gupnp-dlna-gst-utils.synopsis">
+<ANCHOR id="gupnp-dlna-gst-gupnp-dlna-gst-utils.description" href="gupnp-dlna-gst/gupnp-dlna-gst-gupnp-dlna-gst-utils.html#gupnp-dlna-gst-gupnp-dlna-gst-utils.description">
+<ANCHOR id="gupnp-dlna-gst-gupnp-dlna-gst-utils.details" href="gupnp-dlna-gst/gupnp-dlna-gst-gupnp-dlna-gst-utils.html#gupnp-dlna-gst-gupnp-dlna-gst-utils.details">
+<ANCHOR id="gupnp-dlna-gst-utils-information-from-discoverer-info" href="gupnp-dlna-gst/gupnp-dlna-gst-gupnp-dlna-gst-utils.html#gupnp-dlna-gst-utils-information-from-discoverer-info">
+<ANCHOR id="annotation-glossterm-transfer full" href="gupnp-dlna-gst/annotation-glossary.html#annotation-glossterm-transfer full">
diff --git a/doc/gupnp-dlna-metadata/Makefile.am b/doc/gupnp-dlna-metadata/Makefile.am
new file mode 100644 (file)
index 0000000..edfce0b
--- /dev/null
@@ -0,0 +1,89 @@
+## Process this file with automake to produce Makefile.in
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE=gupnp-dlna-metadata
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
+
+# The directory containing the source code. Relative to $(srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting the functions and macros.
+# e.g. DOC_SOURCE_DIR=../../../gtk
+DOC_SOURCE_DIR=$(srcdir)/../../libgupnp-dlna/metadata
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS=
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS=--deprecated-guards="GUPNP_DISABLE_DEPRECATED"
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS = \
+       --sgml-mode \
+       --output-format=xml
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS=
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS = \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gobject \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/glib \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gmodule \
+       --extra-dir=../gupnp-dlna/html
+
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB = \
+       $(top_srcdir)/libgupnp-dlna/*.h \
+       $(top_srcdir)/libgupnp-dlna/metadata/*.h
+CFILE_GLOB = \
+       $(top_srcdir)/libgupnp-dlna/*.c \
+       $(top_srcdir)/libgupnp-dlna/metadata/*.c
+
+# Header files to ignore when scanning.
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES =
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES=
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files=../version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files=
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES=-I$(top_srcdir)
+GTKDOC_LIBS=$(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+DISTCLEANFILES = version.xml
diff --git a/doc/gupnp-dlna-metadata/Makefile.in b/doc/gupnp-dlna-metadata/Makefile.in
new file mode 100644 (file)
index 0000000..6051dd4
--- /dev/null
@@ -0,0 +1,767 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -*- mode: makefile -*-
+
+####################################
+# Everything below here is generic #
+####################################
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(top_srcdir)/gtk-doc.make
+subdir = doc/gupnp-dlna-metadata
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
+GST_LIBS = @GST_LIBS@
+GST_MAJORMINOR = @GST_MAJORMINOR@
+GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
+GST_PBU_LIBS = @GST_PBU_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
+GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBXML_CFLAGS = @LIBXML_CFLAGS@
+LIBXML_LIBS = @LIBXML_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE = gupnp-dlna-metadata
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml
+
+# The directory containing the source code. Relative to $(srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting the functions and macros.
+# e.g. DOC_SOURCE_DIR=../../../gtk
+DOC_SOURCE_DIR = $(srcdir)/../../libgupnp-dlna/metadata
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS = 
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS = --deprecated-guards="GUPNP_DISABLE_DEPRECATED"
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS = \
+       --sgml-mode \
+       --output-format=xml
+
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS = 
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS = \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gobject \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/glib \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gmodule \
+       --extra-dir=../gupnp-dlna/html
+
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB = \
+       $(top_srcdir)/libgupnp-dlna/*.h \
+       $(top_srcdir)/libgupnp-dlna/metadata/*.h
+
+CFILE_GLOB = \
+       $(top_srcdir)/libgupnp-dlna/*.c \
+       $(top_srcdir)/libgupnp-dlna/metadata/*.c
+
+
+# Header files to ignore when scanning.
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES = 
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES = 
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files = ../version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files = 
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES = -I$(top_srcdir)
+GTKDOC_LIBS = $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = 
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute
+
+# We set GPATH here; this gives us semantics for GNU make
+# which are more like other make's VPATH, when it comes to
+# whether a source that is a target of one rule is then
+# searched for in VPATH/GPATH.
+#
+GPATH = $(srcdir)
+TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
+SETUP_FILES = \
+       $(content_files)                \
+       $(DOC_MAIN_SGML_FILE)           \
+       $(DOC_MODULE)-sections.txt      \
+       $(DOC_MODULE)-overrides.txt
+
+EXTRA_DIST = \
+       $(HTML_IMAGES)                  \
+       $(SETUP_FILES)
+
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
+       html-build.stamp pdf-build.stamp \
+       sgml.stamp html.stamp pdf.stamp
+
+SCANOBJ_FILES = \
+       $(DOC_MODULE).args       \
+       $(DOC_MODULE).hierarchy  \
+       $(DOC_MODULE).interfaces \
+       $(DOC_MODULE).prerequisites \
+       $(DOC_MODULE).signals
+
+REPORT_FILES = \
+       $(DOC_MODULE)-undocumented.txt \
+       $(DOC_MODULE)-undeclared.txt \
+       $(DOC_MODULE)-unused.txt
+
+CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = 
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = 
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+DISTCLEANFILES = version.xml
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/gupnp-dlna-metadata/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu doc/gupnp-dlna-metadata/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+$(top_srcdir)/gtk-doc.make:
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile all-local
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-local mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-local
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+       maintainer-clean-local
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am all-local check check-am clean clean-generic \
+       clean-libtool clean-local dist-hook distclean \
+       distclean-generic distclean-libtool distclean-local distdir \
+       dvi dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-data-local install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic \
+       maintainer-clean-local mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+       uninstall-local
+
+
+@ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+@ENABLE_GTK_DOC_FALSE@all-local:
+
+docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+
+$(REPORT_FILES): sgml-build.stamp
+
+#### setup ####
+
+setup-build.stamp:
+       -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           echo '  DOC   Preparing build'; \
+           files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+           if test "x$$files" != "x" ; then \
+               for file in $$files ; do \
+                   test -f $(abs_srcdir)/$$file && \
+                       cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
+               done; \
+           fi; \
+       fi
+       @touch setup-build.stamp
+
+#### scan ####
+
+scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
+       @echo '  DOC   Scanning header files'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
+       @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
+           echo "  DOC   Introspecting gobjects"; \
+           scanobj_options=""; \
+           gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+           if test "$(?)" = "0"; then \
+               if test "x$(V)" = "x1"; then \
+                   scanobj_options="--verbose"; \
+               fi; \
+           fi; \
+           CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
+           gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \
+       else \
+           for i in $(SCANOBJ_FILES) ; do \
+               test -f $$i || touch $$i ; \
+           done \
+       fi
+       @touch scan-build.stamp
+
+$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
+       @true
+
+#### xml ####
+
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+       @echo '  DOC   Building XML'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
+       @touch sgml-build.stamp
+
+sgml.stamp: sgml-build.stamp
+       @true
+
+#### html ####
+
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building HTML'
+       @rm -rf html
+       @mkdir html
+       @mkhtml_options=""; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkhtml_options="$$mkhtml_options --verbose"; \
+         fi; \
+       fi; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
+       if test "$(?)" = "0"; then \
+         mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
+       fi; \
+       cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
+       -@test "x$(HTML_IMAGES)" = "x" || \
+       for file in $(HTML_IMAGES) ; do \
+         if test -f $(abs_srcdir)/$$file ; then \
+           cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
+         fi; \
+         if test -f $(abs_builddir)/$$file ; then \
+           cp $(abs_builddir)/$$file $(abs_builddir)/html; \
+         fi; \
+       done;
+       @echo '  DOC   Fixing cross-references'
+       @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
+       @touch html-build.stamp
+
+#### pdf ####
+
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building PDF'
+       @rm -f $(DOC_MODULE).pdf
+       @mkpdf_options=""; \
+       gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkpdf_options="$$mkpdf_options --verbose"; \
+         fi; \
+       fi; \
+       if test "x$(HTML_IMAGES)" != "x"; then \
+         for img in $(HTML_IMAGES); do \
+           part=`dirname $$img`; \
+           echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \
+           if test $$? != 0; then \
+             mkpdf_options="$$mkpdf_options --imgdir=$$part"; \
+           fi; \
+         done; \
+       fi; \
+       gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
+       @touch pdf-build.stamp
+
+##############
+
+clean-local:
+       @rm -f *~ *.bak
+       @rm -rf .libs
+
+distclean-local:
+       @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
+           $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+       @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
+       fi
+
+maintainer-clean-local: clean
+       @rm -rf xml html
+
+install-data-local:
+       @installfiles=`echo $(builddir)/html/*`; \
+       if test "$$installfiles" = '$(builddir)/html/*'; \
+       then echo 1>&2 'Nothing to install' ; \
+       else \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+         else \
+           installdir="$(DESTDIR)$(TARGET_DIR)"; \
+         fi; \
+         $(mkinstalldirs) $${installdir} ; \
+         for i in $$installfiles; do \
+           echo ' $(INSTALL_DATA) '$$i ; \
+           $(INSTALL_DATA) $$i $${installdir}; \
+         done; \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
+             $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
+         fi; \
+         $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
+       fi
+
+uninstall-local:
+       @if test -n "$(DOC_MODULE_VERSION)"; then \
+         installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+       else \
+         installdir="$(DESTDIR)$(TARGET_DIR)"; \
+       fi; \
+       rm -rf $${installdir}
+
+#
+# Require gtk-doc when making dist
+#
+@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc:
+@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc:
+@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist"
+@ENABLE_GTK_DOC_FALSE@ @false
+
+dist-hook: dist-check-gtkdoc dist-hook-local
+       @mkdir $(distdir)/html
+       @cp ./html/* $(distdir)/html
+       @-cp ./$(DOC_MODULE).pdf $(distdir)/
+       @-cp ./$(DOC_MODULE).types $(distdir)/
+       @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/
+       @cd $(distdir) && rm -f $(DISTCLEANFILES)
+       @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
+
+.PHONY : dist-hook-local docs
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/gupnp-dlna-metadata/gupnp-dlna-metadata-docs.sgml b/doc/gupnp-dlna-metadata/gupnp-dlna-metadata-docs.sgml
new file mode 100644 (file)
index 0000000..f8c23c6
--- /dev/null
@@ -0,0 +1,55 @@
+<?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 SYSTEM "../version.xml">
+]>
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+  <bookinfo>
+    <title>GUPnP DLNA Reference Manual</title>
+
+    <releaseinfo>Version &version;</releaseinfo>
+
+    <copyright>
+      <year>2012</year>
+      <holder>Intel Corporation</holder>
+    </copyright>
+
+    <legalnotice>
+      <para>
+        Permission is granted to copy, distribute and/or modify this
+        document under the terms of the <citetitle>GNU Free
+        Documentation License</citetitle>, Version 1.1 or any later
+        version published by the Free Software Foundation with no
+        Invariant Sections, no Front-Cover Texts, and no Back-Cover
+        Texts. You may obtain a copy of the <citetitle>GNU Free
+        Documentation License</citetitle> from the Free Software
+        Foundation by visiting <ulink type="http"
+        url="http://www.fsf.org">their Web site</ulink> or by writing
+        to:
+
+        <address>
+          The Free Software Foundation, Inc.,
+          <street>59 Temple Place</street> - Suite 330,
+          <city>Boston</city>, <state>MA</state> <postcode>02111-1307</postcode>,
+          <country>USA</country>
+        </address>
+      </para>
+    </legalnotice>
+  </bookinfo>
+
+  <chapter>
+    <title>GUPnP DLNA Metadata</title>
+
+    <para>
+      GUPnP DLNA Metadata is a set of APIs to create a metadata
+      extractor plugins used by GUPnP DLNA Profile Guesser to guess
+      the profile.
+    </para>
+
+    <xi:include href="xml/gupnp-dlna-metadata-extractor.xml"/>
+    <xi:include href="xml/api-index-full.xml"/>
+
+  </chapter>
+
+  <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
+</book>
diff --git a/doc/gupnp-dlna-metadata/gupnp-dlna-metadata-overrides.txt b/doc/gupnp-dlna-metadata/gupnp-dlna-metadata-overrides.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/gupnp-dlna-metadata/gupnp-dlna-metadata-sections.txt b/doc/gupnp-dlna-metadata/gupnp-dlna-metadata-sections.txt
new file mode 100644 (file)
index 0000000..6cfbeab
--- /dev/null
@@ -0,0 +1,18 @@
+<SECTION>
+<FILE>gupnp-dlna-metadata-extractor</FILE>
+<TITLE>GUPnPDLNAMetadataExtractor</TITLE>
+GUPnPDLNAMetadataExtractor
+GUPnPDLNAMetadataExtractorClass
+gupnp_dlna_metadata_extractor_emit_done
+gupnp_dlna_metadata_extractor_extract_async
+gupnp_dlna_metadata_extractor_extract_sync
+<SUBSECTION Standard>
+GUPNP_DLNA_METADATA_EXTRACTOR
+GUPNP_DLNA_METADATA_EXTRACTOR_CLASS
+GUPNP_DLNA_METADATA_EXTRACTOR_GET_CLASS
+GUPNP_IS_DLNA_METADATA_EXTRACTOR
+GUPNP_IS_DLNA_METADATA_EXTRACTOR_CLASS
+GUPNP_TYPE_DLNA_METADATA_EXTRACTOR
+gupnp_dlna_metadata_extractor_get_type
+</SECTION>
+
diff --git a/doc/gupnp-dlna-metadata/gupnp-dlna-metadata.types b/doc/gupnp-dlna-metadata/gupnp-dlna-metadata.types
new file mode 100644 (file)
index 0000000..55e82ef
--- /dev/null
@@ -0,0 +1 @@
+gupnp_dlna_metadata_extractor_get_type
diff --git a/doc/gupnp-dlna-metadata/html/GUPnPDLNAMetadataExtractor.html b/doc/gupnp-dlna-metadata/html/GUPnPDLNAMetadataExtractor.html
new file mode 100644 (file)
index 0000000..85775d2
--- /dev/null
@@ -0,0 +1,324 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPDLNAMetadataExtractor</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA Metadata">
+<link rel="prev" href="ch01.html" title="GUPnP DLNA Metadata">
+<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="ch01.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPDLNAMetadataExtractor.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPDLNAMetadataExtractor.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPDLNAMetadataExtractor.object-hierarchy" class="shortcut">Object Hierarchy</a>
+                  Â | 
+                  <a href="#GUPnPDLNAMetadataExtractor.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPDLNAMetadataExtractor"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPDLNAMetadataExtractor.top_of_page"></a>GUPnPDLNAMetadataExtractor</span></h2>
+<p>GUPnPDLNAMetadataExtractor â€” Base class for extracting metadata for given
+media.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPDLNAMetadataExtractor.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor-struct" title="GUPnPDLNAMetadataExtractor">GUPnPDLNAMetadataExtractor</a>;
+                    <a class="link" href="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractorClass" title="GUPnPDLNAMetadataExtractorClass">GUPnPDLNAMetadataExtractorClass</a>;
+<span class="returnvalue">void</span>                <a class="link" href="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-emit-done" title="gupnp_dlna_metadata_extractor_emit_done ()">gupnp_dlna_metadata_extractor_emit_done</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> *extractor</code></em>,
+                                                         <em class="parameter"><code><a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> *error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-extract-async" title="gupnp_dlna_metadata_extractor_extract_async ()">gupnp_dlna_metadata_extractor_extract_async</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> *extractor</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> timeout_in_ms</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="returnvalue">GUPnPDLNAInformation</span></a> * <a class="link" href="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-extract-sync" title="gupnp_dlna_metadata_extractor_extract_sync ()">gupnp_dlna_metadata_extractor_extract_sync</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> *extractor</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> timeout_in_ms</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAMetadataExtractor.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----GUPnPDLNAMetadataExtractor
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAMetadataExtractor.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+  "<a class="link" href="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor-done" title='The "done" signal'>done</a>"                                           : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAMetadataExtractor.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> is used by <a href="../gupnp-dlna/GUPnPDLNAProfileGuesser.html"><span class="type">GUPnPDLNAProfileGuesser</span></a> to
+get needed metadata for profile matching. This class itself does
+not implement any metadata extraction features. For that it is
+expected to provide a plugin which:
+1. Provides a <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> subclass implementation.
+2. Exports a <code class="function">gupnp_dlna_get_default_extractor()</code> which takes no
+parameters and returns a <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a>.
+</p>
+<p>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Dynamic-Loading-of-Modules.html#GModule"><span class="type">GModule</span></a> is used for loading the plugin, so <a href="http://library.gnome.org/devel/glib/unstable/glib-Dynamic-Loading-of-Modules.html#GModule"><span class="type">GModule</span></a>'s features can
+be used also (like exporting <code class="function">g_module_check_init()</code> to initialize
+multimedia framework used for extracting metadata).
+</p>
+<p>
+Default plugin directory and default plugin file is set during
+configuration stage, but it can be overriden during runtime by
+setting respectively <code class="literal">GUPNP_DLNA_METADATA_BACKEND</code> and
+<code class="literal">GUPNP_DLNA_METADATA_BACKEND_DIR</code> environment variables before the
+plugin is loaded (i.e. before <a href="../gupnp-dlna/GUPnPDLNAProfileGuesser.html"><span class="type">GUPnPDLNAProfileGuesser</span></a> is used for
+guessing profile).
+</p>
+<p>
+The <code class="literal">GUPNP_DLNA_METADATA_BACKEND</code> environment variable should hold a
+name like "gstreamer", so libgstreamer.so will be loaded. For
+determining a plugin filename <a href="http://library.gnome.org/devel/glib/unstable/glib-Dynamic-Loading-of-Modules.html#g-module-build-path"><code class="function">g_module_build_path()</code></a> is used.
+</p>
+<p>
+If subclassing <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> then also
+<a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a>, <a href="../gupnp-dlna/GUPnPDLNAAudioInformation.html"><span class="type">GUPnPDLNAAudioInformation</span></a>,
+<a href="../gupnp-dlna/GUPnPDLNAContainerInformation.html"><span class="type">GUPnPDLNAContainerInformation</span></a>, <a href="../gupnp-dlna/GUPnPDLNAImageInformation.html"><span class="type">GUPnPDLNAImageInformation</span></a> and
+<a href="../gupnp-dlna/GUPnPDLNAVideoInformation.html"><span class="type">GUPnPDLNAVideoInformation</span></a> have to be subclassed as well.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAMetadataExtractor.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAMetadataExtractor-struct"></a><h3>GUPnPDLNAMetadataExtractor</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAMetadataExtractor GUPnPDLNAMetadataExtractor;</pre>
+<p>
+The top-level object used to for metadata extraction.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAMetadataExtractorClass"></a><h3>GUPnPDLNAMetadataExtractorClass</h3>
+<pre class="programlisting">typedef struct {
+        GObjectClass parent_class;
+
+        /* virtuals */
+        gboolean
+        (* extract_async) (GUPnPDLNAMetadataExtractor  *extractor,
+                           const gchar                 *uri,
+                           guint                        timeout_in_ms,
+                           GError                     **error);
+
+        GUPnPDLNAInformation *
+        (* extract_sync) (GUPnPDLNAMetadataExtractor  *extractor,
+                          const gchar                 *uri,
+                          guint                        timeout_in_ms,
+                          GError                     **error);
+
+        gpointer _reserved[12];
+} GUPnPDLNAMetadataExtractorClass;
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GUPnPDLNAMetadataExtractorClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAMetadataExtractorClass.extract-async"></a>extract_async</code></em> ()</span></p></td>
+<td>This is called by <a href="../gupnp-dlna/GUPnPDLNAProfileGuesser.html"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+information about media file asynchronously.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAMetadataExtractorClass.extract-sync"></a>extract_sync</code></em> ()</span></p></td>
+<td>This is called by <a href="../gupnp-dlna/GUPnPDLNAProfileGuesser.html"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+information about media file synchronously.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GUPnPDLNAMetadataExtractorClass.-reserved"></a>_reserved</code></em>[12];</span></p></td>
+<td>Padding. Ignore it.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-metadata-extractor-emit-done"></a><h3>gupnp_dlna_metadata_extractor_emit_done ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                gupnp_dlna_metadata_extractor_emit_done
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> *extractor</code></em>,
+                                                         <em class="parameter"><code><a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> *error</code></em>);</pre>
+<p>
+Emits ::done signal. This function is intended to be used by
+subclasses of <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a>. It is required to always
+pass a meaningful <em class="parameter"><code>info</code></em>, even in case of error. That way a receiver
+of this signal can know which URI discovery failed by using
+<a href="../gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-uri"><code class="function">gupnp_dlna_information_get_uri()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>extractor</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a> about discovered URI. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-metadata-extractor-extract-async"></a><h3>gupnp_dlna_metadata_extractor_extract_async ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            gupnp_dlna_metadata_extractor_extract_async
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> *extractor</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> timeout_in_ms</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Queues <em class="parameter"><code>uri</code></em> for metadata discovery. When discovery is completed,
+the ::done signal is emitted on <em class="parameter"><code>extractor</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>extractor</code></em> :</span></p></td>
+<td>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> object to use for discovery</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>URI to gather metadata for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout_in_ms</code></em> :</span></p></td>
+<td>Timeout in miliseconds.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>uri</code></em> was successfully queued, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-metadata-extractor-extract-sync"></a><h3>gupnp_dlna_metadata_extractor_extract_sync ()</h3>
+<pre class="programlisting"><a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="returnvalue">GUPnPDLNAInformation</span></a> * gupnp_dlna_metadata_extractor_extract_sync
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> *extractor</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> timeout_in_ms</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Discovers synchronously metadata of given <em class="parameter"><code>uri</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>extractor</code></em> :</span></p></td>
+<td>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> object to use for discovery</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>URI to gather metadata for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout_in_ms</code></em> :</span></p></td>
+<td>Timeout in miliseconds.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a> object if discovery succeeded,
+otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAMetadataExtractor.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAMetadataExtractor-done"></a><h3>The <code class="literal">"done"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a> *extractor,
+                                                        <a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a>       *info,
+                                                        <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>                     *error,
+                                                        <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>                    user_data)      : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Will be emitted when all information on a URI could be
+discovered.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>extractor</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor"><span class="type">GUPnPDLNAMetadataExtractor</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>The results as <a href="../gupnp-dlna/GUPnPDLNAInformation.html"><span class="type">GUPnPDLNAInformation</span></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>Contains details of
+the error if discovery fails, otherwise is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
similarity index 73%
rename from doc/html/annotation-glossary.html
rename to doc/gupnp-dlna-metadata/html/annotation-glossary.html
index b007c66..07143f5 100644 (file)
@@ -6,21 +6,21 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
 <link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
 <link rel="up" href="index.html" title="GUPnP DLNA Reference Manual">
-<link rel="prev" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">
+<link rel="prev" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor">
 <meta name="generator" content="GTK-Doc V1.18 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
 <tr valign="middle">
-<td><a accesskey="p" href="GUPnPDLNAProfile.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="GUPnPDLNAMetadataExtractor.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
 <td> </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
 <th width="100%" align="center">GUPnP DLNA Reference Manual</th>
 <td> </td>
 </tr>
 <tr><td colspan="5" class="shortcuts">
-<a class="shortcut" href="#glsE">E</a>
+<a class="shortcut" href="#glsA">A</a>
                      Â | 
                    <a class="shortcut" href="#glsT">T</a>
 </td></tr>
 <div class="glossary">
 <div class="titlepage"><div><div><h2 class="title">
 <a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
-<a name="glsE"></a><h3 class="title">E</h3>
+<a name="glsA"></a><h3 class="title">A</h3>
 <dt>
-<a name="annotation-glossterm-element-type"></a>element-type</dt>
-<dd><p>Generics and defining elements of containers and arrays.</p></dd>
+<a name="annotation-glossterm-allow-none"></a>allow-none</dt>
+<dd><p>NULL is ok, both for passing and for returning.</p></dd>
 <a name="glsT"></a><h3 class="title">T</h3>
 <dt>
-<a name="annotation-glossterm-transfer%20full"></a>transfer full</dt>
-<dd><p>Free data after the code is done.</p></dd>
-<dt>
 <a name="annotation-glossterm-transfer%20none"></a>transfer none</dt>
 <dd><p>Don't free data after the code is done.</p></dd>
 </div>
diff --git a/doc/gupnp-dlna-metadata/html/ch01.html b/doc/gupnp-dlna-metadata/html/ch01.html
new file mode 100644 (file)
index 0000000..2b73b2b
--- /dev/null
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnP DLNA Metadata</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="prev" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="next" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="GUPnPDLNAMetadataExtractor.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts"><a class="shortcut" href="#idxD">D</a></td></tr>
+</table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="idp3269872"></a>GUPnP DLNA Metadata</h2></div></div></div>
+<div class="toc"><dl><dt>
+<span class="refentrytitle"><a href="GUPnPDLNAMetadataExtractor.html">GUPnPDLNAMetadataExtractor</a></span><span class="refpurpose"> â€” Base class for extracting metadata for given
+media.</span>
+</dt></dl></div>
+<p>
+      GUPnP DLNA Metadata is a set of APIs to create a metadata
+      extractor plugins used by GUPnP DLNA Profile Guesser to guess
+      the profile.
+    </p>
+<a name="idx"></a><a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor-struct" title="GUPnPDLNAMetadataExtractor">GUPnPDLNAMetadataExtractor</a>, struct in <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor">GUPnPDLNAMetadataExtractor</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor-done" title='The "done" signal'>GUPnPDLNAMetadataExtractor::done</a>, object signal in <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor">GUPnPDLNAMetadataExtractor</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractorClass" title="GUPnPDLNAMetadataExtractorClass">GUPnPDLNAMetadataExtractorClass</a>, struct in <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor">GUPnPDLNAMetadataExtractor</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-emit-done" title="gupnp_dlna_metadata_extractor_emit_done ()">gupnp_dlna_metadata_extractor_emit_done</a>, function in <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor">GUPnPDLNAMetadataExtractor</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-extract-async" title="gupnp_dlna_metadata_extractor_extract_async ()">gupnp_dlna_metadata_extractor_extract_async</a>, function in <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor">GUPnPDLNAMetadataExtractor</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-extract-sync" title="gupnp_dlna_metadata_extractor_extract_sync ()">gupnp_dlna_metadata_extractor_extract_sync</a>, function in <a class="link" href="GUPnPDLNAMetadataExtractor.html" title="GUPnPDLNAMetadataExtractor">GUPnPDLNAMetadataExtractor</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna-metadata/html/gupnp-dlna-metadata.devhelp2 b/doc/gupnp-dlna-metadata/html/gupnp-dlna-metadata.devhelp2
new file mode 100644 (file)
index 0000000..d031ad5
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
+<book xmlns="http://www.devhelp.net/book" title="GUPnP DLNA Reference Manual" link="index.html" author="" name="gupnp-dlna-metadata" version="2" language="c">
+  <chapters>
+    <sub name="GUPnP DLNA Metadata" link="ch01.html">
+      <sub name="GUPnPDLNAMetadataExtractor" link="GUPnPDLNAMetadataExtractor.html"/>
+    </sub>
+    <sub name="Annotation Glossary" link="annotation-glossary.html"/>
+  </chapters>
+  <functions>
+    <keyword type="struct" name="GUPnPDLNAMetadataExtractor" link="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor-struct"/>
+    <keyword type="struct" name="GUPnPDLNAMetadataExtractorClass" link="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractorClass"/>
+    <keyword type="function" name="gupnp_dlna_metadata_extractor_emit_done ()" link="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-emit-done"/>
+    <keyword type="function" name="gupnp_dlna_metadata_extractor_extract_async ()" link="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-extract-async"/>
+    <keyword type="function" name="gupnp_dlna_metadata_extractor_extract_sync ()" link="GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-extract-sync"/>
+    <keyword type="signal" name="The &quot;done&quot; signal" link="GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor-done"/>
+  </functions>
+</book>
diff --git a/doc/gupnp-dlna-metadata/html/home.png b/doc/gupnp-dlna-metadata/html/home.png
new file mode 100644 (file)
index 0000000..fb60b55
Binary files /dev/null and b/doc/gupnp-dlna-metadata/html/home.png differ
similarity index 63%
rename from doc/html/index.html
rename to doc/gupnp-dlna-metadata/html/index.html
index 0ccfadc..2781ab9 100644 (file)
@@ -5,7 +5,7 @@
 <title>GUPnP DLNA Reference Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
 <link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
-<link rel="next" href="ch01.html" title="GUPnP DLNA">
+<link rel="next" href="ch01.html" title="GUPnP DLNA Metadata">
 <meta name="generator" content="GTK-Doc V1.18 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
 <div class="titlepage">
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GUPnP DLNA Reference Manual</p></th></tr></table></div>
-<div><p class="releaseinfo">Version 0.6.6
+<div><p class="releaseinfo">Version 0.10.0
 </p></div>
-<div><p class="copyright">Copyright Â© 2010 Arun Raghavan &lt;arun.raghavan@collabora.co.uk&gt;</p></div>
-<div><p class="copyright">Copyright Â© 2010 Collabora Multimedia</p></div>
-<div><p class="copyright">Copyright Â© 2010 Nokia Corporation</p></div>
+<div><p class="copyright">Copyright Â© 2012 Intel Corporation</p></div>
 <div><div class="legalnotice">
-<a name="idp208704"></a><p>
+<a name="idp4034896"></a><p>
         Permission is granted to copy, distribute and/or modify this
         document under the terms of the <em class="citetitle">GNU Free
         Documentation License</em>, Version 1.1 or any later
 <hr>
 </div>
 <div class="toc"><dl>
-<dt><span class="chapter"><a href="ch01.html">GUPnP DLNA</a></span></dt>
-<dd><dl>
-<dt>
-<span class="refentrytitle"><a href="GUPnPDLNADiscoverer.html">GUPnPDLNADiscoverer</a></span><span class="refpurpose"> â€” Utility API for discovering DLNA profile/mime type and
-other metadata for given media.</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="GUPnPDLNAInformation.html">GUPnPDLNAInformation</a></span><span class="refpurpose"> â€” Object containing metadata information returned by the
-<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> API</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="GUPnPDLNAProfile.html">GUPnPDLNAProfile</a></span><span class="refpurpose"> â€” Object representing a DLNA profile</span>
-</dt>
-</dl></dd>
+<dt><span class="chapter"><a href="ch01.html">GUPnP DLNA Metadata</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="GUPnPDLNAMetadataExtractor.html">GUPnPDLNAMetadataExtractor</a></span><span class="refpurpose"> â€” Base class for extracting metadata for given
+media.</span>
+</dt></dl></dd>
 <dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
 </dl></div>
 </div>
diff --git a/doc/gupnp-dlna-metadata/html/index.sgml b/doc/gupnp-dlna-metadata/html/index.sgml
new file mode 100644 (file)
index 0000000..58d4cf8
--- /dev/null
@@ -0,0 +1,15 @@
+<ANCHOR id="GUPnPDLNAMetadataExtractor" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html">
+<ANCHOR id="GUPnPDLNAMetadataExtractor.synopsis" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor.synopsis">
+<ANCHOR id="GUPnPDLNAMetadataExtractor.object-hierarchy" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor.object-hierarchy">
+<ANCHOR id="GUPnPDLNAMetadataExtractor.signals" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor.signals">
+<ANCHOR id="GUPnPDLNAMetadataExtractor.description" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor.description">
+<ANCHOR id="GUPnPDLNAMetadataExtractor.details" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor.details">
+<ANCHOR id="GUPnPDLNAMetadataExtractor-struct" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor-struct">
+<ANCHOR id="GUPnPDLNAMetadataExtractorClass" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractorClass">
+<ANCHOR id="gupnp-dlna-metadata-extractor-emit-done" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-emit-done">
+<ANCHOR id="gupnp-dlna-metadata-extractor-extract-async" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-extract-async">
+<ANCHOR id="gupnp-dlna-metadata-extractor-extract-sync" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#gupnp-dlna-metadata-extractor-extract-sync">
+<ANCHOR id="GUPnPDLNAMetadataExtractor.signal-details" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor.signal-details">
+<ANCHOR id="GUPnPDLNAMetadataExtractor-done" href="gupnp-dlna-metadata/GUPnPDLNAMetadataExtractor.html#GUPnPDLNAMetadataExtractor-done">
+<ANCHOR id="annotation-glossterm-allow-none" href="gupnp-dlna-metadata/annotation-glossary.html#annotation-glossterm-allow-none">
+<ANCHOR id="annotation-glossterm-transfer none" href="gupnp-dlna-metadata/annotation-glossary.html#annotation-glossterm-transfer none">
diff --git a/doc/gupnp-dlna-metadata/html/left.png b/doc/gupnp-dlna-metadata/html/left.png
new file mode 100644 (file)
index 0000000..48cab27
Binary files /dev/null and b/doc/gupnp-dlna-metadata/html/left.png differ
diff --git a/doc/gupnp-dlna-metadata/html/right.png b/doc/gupnp-dlna-metadata/html/right.png
new file mode 100644 (file)
index 0000000..ed55207
Binary files /dev/null and b/doc/gupnp-dlna-metadata/html/right.png differ
diff --git a/doc/gupnp-dlna-metadata/html/style.css b/doc/gupnp-dlna-metadata/html/style.css
new file mode 100644 (file)
index 0000000..d6f6c26
--- /dev/null
@@ -0,0 +1,266 @@
+.synopsis, .classsynopsis
+{
+  /* tango:aluminium 1/2 */
+  background: #eeeeec;
+  border: solid 1px #d3d7cf;
+  padding: 0.5em;
+}
+.programlisting
+{
+  /* tango:sky blue 0/1 */
+  background: #e6f3ff;
+  border: solid 1px #729fcf;
+  padding: 0.5em;
+}
+.variablelist
+{
+  padding: 4px;
+  margin-left: 3em;
+}
+.variablelist td:first-child
+{
+  vertical-align: top;
+}
+
+@media screen {
+  sup a.footnote
+  {
+    position: relative;
+    top: 0em ! important;
+    
+  }
+  /* this is needed so that the local anchors are displayed below the naviagtion */
+  div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name]
+  {
+    display: inline-block;
+    position: relative;
+    top:-5em;
+  }
+  /* this seems to be a bug in the xsl style sheets when generating indexes */
+  div.index div.index
+  {
+    top: 0em;
+  }
+  /* make space for the fixed navigation bar and add space at the bottom so that
+   * link targets appear somewhat close to top
+   */
+  body
+  {
+    padding-top: 3.2em;
+    padding-bottom: 20em;
+  }
+  /* style and size the navigation bar */
+  table.navigation#top
+  {
+    position: fixed;
+    /* tango:scarlet red 0/1 */
+    background: #ffe6e6;
+    border: solid 1px #ef2929;
+    margin-top: 0;
+    margin-bottom: 0;
+    top: 0;
+    left: 0;
+    height: 3em;
+    z-index: 10;
+  }
+  .navigation a, .navigation a:visited
+  {
+    /* tango:scarlet red 3 */
+    color: #a40000;
+  }
+  .navigation a:hover
+  {
+    /* tango:scarlet red 1 */
+    color: #ef2929;
+  }
+  td.shortcuts
+  {
+    /* tango:scarlet red 1 */
+    color: #ef2929;
+    font-size: 80%;
+    white-space: nowrap;
+  }
+}
+@media print {
+  table.navigation {
+    visibility: collapse;
+    display: none;
+  }
+  div.titlepage table.navigation {
+    visibility: visible;
+    display: table;
+    /* tango:scarlet red 0/1 */
+    background: #ffe6e6;
+    border: solid 1px #ef2929;
+    margin-top: 0;
+    margin-bottom: 0;
+    top: 0;
+    left: 0;
+    height: 3em;
+  }
+}
+
+.navigation .title
+{
+  font-size: 200%;
+}
+
+div.gallery-float
+{
+  float: left;
+  padding: 10px;
+}
+div.gallery-float img
+{
+  border-style: none;
+}
+div.gallery-spacer
+{
+  clear: both;
+}
+
+a, a:visited
+{
+  text-decoration: none;
+  /* tango:sky blue 2 */
+  color: #3465a4;
+}
+a:hover
+{
+  text-decoration: underline;
+  /* tango:sky blue 1 */
+  color: #729fcf;
+}
+
+div.table table
+{
+  border-collapse: collapse;
+  border-spacing: 0px;
+  /* tango:aluminium 3 */
+  border: solid 1px #babdb6;
+}
+
+div.table table td, div.table table th
+{
+  /* tango:aluminium 3 */
+  border: solid 1px #babdb6;
+  padding: 3px;
+  vertical-align: top;
+}
+
+div.table table th
+{
+  /* tango:aluminium 2 */
+  background-color: #d3d7cf;
+}
+
+hr
+{
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  background: #babdb6;
+  border: none 0px;
+  height: 1px;
+  clear: both;
+}
+
+.footer
+{
+  padding-top: 3.5em;
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  text-align: center;
+  font-size: 80%;
+}
+
+.warning
+{
+  /* tango:orange 0/1 */
+  background: #ffeed9;
+  border-color: #ffb04f;
+}
+.note
+{
+  /* tango:chameleon 0/0.5 */
+  background: #d8ffb2;
+  border-color: #abf562;
+}
+.note, .warning
+{
+  padding: 0.5em;
+  border-width: 1px;
+  border-style: solid;
+}
+.note h3, .warning h3
+{
+  margin-top: 0.0em
+}
+.note p, .warning p
+{
+  margin-bottom: 0.0em
+}
+
+/* blob links */
+h2 .extralinks, h3 .extralinks
+{
+  float: right;
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  font-size: 80%;
+  font-weight: normal;
+}
+
+.annotation
+{
+  /* tango:aluminium 5 */
+  color: #555753;
+  font-size: 80%;
+  font-weight: normal;
+}
+
+/* code listings */
+
+.listing_code .programlisting .cbracket   { color: #a40000; } /* tango: scarlet red 3 */
+.listing_code .programlisting .comment    { color: #a1a39d; } /* tango: aluminium 4 */
+.listing_code .programlisting .function   { color: #000000; font-weight: bold; }
+.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */
+.listing_code .programlisting .keyword    { color: #4e9a06; } /* tango: chameleon 3  */
+.listing_code .programlisting .linenum    { color: #babdb6; } /* tango: aluminium 3 */
+.listing_code .programlisting .normal     { color: #000000; }
+.listing_code .programlisting .number     { color: #75507b; } /* tango: plum 2 */
+.listing_code .programlisting .preproc    { color: #204a87; } /* tango: sky blue 3  */
+.listing_code .programlisting .string     { color: #c17d11; } /* tango: chocolate 2 */
+.listing_code .programlisting .type       { color: #000000; }
+.listing_code .programlisting .type a     { color: #11326b; } /* tango: sky blue 4 */
+.listing_code .programlisting .symbol     { color: #ce5c00; } /* tango: orange 3 */
+
+.listing_frame {
+  /* tango:sky blue 1 */
+  border: solid 1px #729fcf;
+  padding: 0px;
+}
+
+.listing_lines, .listing_code {
+  margin-top: 0px;
+  margin-bottom: 0px;
+  padding: 0.5em;
+}
+.listing_lines {
+  /* tango:sky blue 0.5 */
+  background: #a6c5e3;
+  /* tango:aluminium 6 */
+  color: #2e3436;
+}
+.listing_code {
+  /* tango:sky blue 0 */
+  background: #e6f3ff;
+}
+.listing_code .programlisting {
+  /* override from previous */
+  border: none 0px;
+  padding: 0px;
+}
+.listing_lines pre, .listing_code pre {
+  margin: 0px;
+}
+
diff --git a/doc/gupnp-dlna-metadata/html/up.png b/doc/gupnp-dlna-metadata/html/up.png
new file mode 100644 (file)
index 0000000..8eb591f
Binary files /dev/null and b/doc/gupnp-dlna-metadata/html/up.png differ
diff --git a/doc/gupnp-dlna-sections.txt b/doc/gupnp-dlna-sections.txt
deleted file mode 100644 (file)
index 6a4594b..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-<SECTION>
-<FILE>gupnp-dlna-profile</FILE>
-<TITLE>GUPnPDLNAProfile</TITLE>
-GUPnPDLNAProfile
-GUPnPDLNAProfileClass
-gupnp_dlna_profile_new
-gupnp_dlna_profile_get_name
-gupnp_dlna_profile_get_mime
-gupnp_dlna_profile_get_encoding_profile
-<SUBSECTION Standard>
-GUPNP_DLNA_PROFILE
-GUPNP_IS_DLNA_PROFILE
-GUPNP_TYPE_DLNA_PROFILE
-gupnp_dlna_profile_get_type
-GUPNP_DLNA_PROFILE_CLASS
-GUPNP_IS_DLNA_PROFILE_CLASS
-GUPNP_DLNA_PROFILE_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>gupnp-dlna-discoverer</FILE>
-<TITLE>GUPnPDLNADiscoverer</TITLE>
-GUPnPDLNADiscoverer
-gupnp_dlna_discoverer_new
-gupnp_dlna_discoverer_start
-gupnp_dlna_discoverer_stop
-gupnp_dlna_discoverer_discover_uri
-gupnp_dlna_discoverer_discover_uri_sync
-gupnp_dlna_discoverer_get_profile
-gupnp_dlna_discoverer_list_profiles
-gupnp_dlna_discoverer_get_relaxed_mode
-gupnp_dlna_discoverer_get_extended_mode
-<SUBSECTION Standard>
-GUPnPDLNADiscovererClass
-GUPNP_DLNA_DISCOVERER
-GUPNP_IS_DLNA_DISCOVERER
-GUPNP_TYPE_DLNA_DISCOVERER
-gupnp_dlna_discoverer_get_type
-GUPNP_DLNA_DISCOVERER_CLASS
-GUPNP_IS_DLNA_DISCOVERER_CLASS
-GUPNP_DLNA_DISCOVERER_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>gupnp-dlna-information</FILE>
-<TITLE>GUPnPDLNAInformation</TITLE>
-GUPnPDLNAInformation
-gupnp_dlna_information_new
-gupnp_dlna_information_get_name
-gupnp_dlna_information_get_mime
-gupnp_dlna_information_get_info
-<SUBSECTION Standard>
-GUPnPDLNAInformationClass
-GUPNP_DLNA_INFORMATION
-GUPNP_IS_DLNA_INFORMATION
-GUPNP_TYPE_DLNA_INFORMATION
-gupnp_dlna_information_get_type
-GUPNP_DLNA_INFORMATION_CLASS
-GUPNP_IS_DLNA_INFORMATION_CLASS
-GUPNP_DLNA_INFORMATION_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>gupnp-dlna-load</FILE>
-gupnp_dlna_load_profiles_from_file
-gupnp_dlna_load_profiles_from_dir
-gupnp_dlna_load_profiles_from_disk
-</SECTION>
-
-<SECTION>
-<FILE>gupnp-dlna-marshal</FILE>
-gupnp_dlna_marshal_BOOLEAN__STRING_UINT_STRING_POINTER
-gupnp_dlna_marshal_VOID__OBJECT_BOXED
-</SECTION>
-
diff --git a/doc/gupnp-dlna.types b/doc/gupnp-dlna.types
deleted file mode 100644 (file)
index af9469a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-gupnp_dlna_discoverer_get_type
-gupnp_dlna_information_get_type
-gupnp_dlna_profile_get_type
diff --git a/doc/gupnp-dlna/Makefile.am b/doc/gupnp-dlna/Makefile.am
new file mode 100644 (file)
index 0000000..6f94ab7
--- /dev/null
@@ -0,0 +1,101 @@
+## Process this file with automake to produce Makefile.in
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE=gupnp-dlna
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
+
+# The directory containing the source code. Relative to $(srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting the functions and macros.
+# e.g. DOC_SOURCE_DIR=../../../gtk
+DOC_SOURCE_DIR=$(srcdir)/../../libgupnp-dlna
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS=
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS=--deprecated-guards="GUPNP_DISABLE_DEPRECATED"
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS = \
+       --sgml-mode \
+       --output-format=xml \
+       --ignore-files="metadata metadata-backends"
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS=
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS = \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gobject \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/glib \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gmodule
+
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB=$(top_srcdir)/libgupnp-dlna/*.h
+CFILE_GLOB=$(top_srcdir)/libgupnp-dlna/*.c
+
+# Header files to ignore when scanning.
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES = \
+       metadata \
+       metadata-backends \
+       gupnp-dlna-field-value.h \
+       gupnp-dlna-metadata-backend.h \
+       gupnp-dlna-profile-guesser-impl.h \
+       gupnp-dlna-profile-loader.h \
+       gupnp-dlna-g-values-private.h \
+       gupnp-dlna-info-set.h \
+       gupnp-dlna-info-value.h \
+       gupnp-dlna-profile-private.h \
+       gupnp-dlna-restriction-private.h \
+       gupnp-dlna-utils.h \
+       gupnp-dlna-value.h \
+       gupnp-dlna-value-list-private.h \
+       gupnp-dlna-value-type.h \
+       gupnp-dlna-value-union.h
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES=
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files=../version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files=
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES=-I$(top_srcdir)
+GTKDOC_LIBS=$(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+include $(top_srcdir)/gtk-doc.make
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+DISTCLEANFILES = version.xml
diff --git a/doc/gupnp-dlna/Makefile.in b/doc/gupnp-dlna/Makefile.in
new file mode 100644 (file)
index 0000000..80a02fa
--- /dev/null
@@ -0,0 +1,778 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# -*- mode: makefile -*-
+
+####################################
+# Everything below here is generic #
+####################################
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(top_srcdir)/gtk-doc.make
+subdir = doc/gupnp-dlna
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
+GST_LIBS = @GST_LIBS@
+GST_MAJORMINOR = @GST_MAJORMINOR@
+GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
+GST_PBU_LIBS = @GST_PBU_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
+GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBXML_CFLAGS = @LIBXML_CFLAGS@
+LIBXML_LIBS = @LIBXML_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# We require automake 1.6 at least.
+AUTOMAKE_OPTIONS = 1.6
+
+# This is a blank Makefile.am for using gtk-doc.
+# Copy this to your project's API docs directory and modify the variables to
+# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
+# of using the various options.
+
+# The name of the module, e.g. 'glib'.
+DOC_MODULE = gupnp-dlna
+
+# The top-level SGML file. You can change this if you want to.
+DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml
+
+# The directory containing the source code. Relative to $(srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting the functions and macros.
+# e.g. DOC_SOURCE_DIR=../../../gtk
+DOC_SOURCE_DIR = $(srcdir)/../../libgupnp-dlna
+
+# Extra options to pass to gtkdoc-scangobj. Not normally needed.
+SCANGOBJ_OPTIONS = 
+
+# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
+SCAN_OPTIONS = --deprecated-guards="GUPNP_DISABLE_DEPRECATED"
+
+# Extra options to supply to gtkdoc-mkdb.
+# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
+MKDB_OPTIONS = \
+       --sgml-mode \
+       --output-format=xml \
+       --ignore-files="metadata metadata-backends"
+
+
+# Extra options to supply to gtkdoc-mktmpl
+# e.g. MKTMPL_OPTIONS=--only-section-tmpl
+MKTMPL_OPTIONS = 
+
+# Extra options to supply to gtkdoc-fixref. Not normally needed.
+# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
+FIXXREF_OPTIONS = \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gobject \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/glib \
+       --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/gmodule
+
+
+# Used for dependencies. The docs will be rebuilt if any of these change.
+# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
+# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
+HFILE_GLOB = $(top_srcdir)/libgupnp-dlna/*.h
+CFILE_GLOB = $(top_srcdir)/libgupnp-dlna/*.c
+
+# Header files to ignore when scanning.
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+IGNORE_HFILES = \
+       metadata \
+       metadata-backends \
+       gupnp-dlna-field-value.h \
+       gupnp-dlna-metadata-backend.h \
+       gupnp-dlna-profile-guesser-impl.h \
+       gupnp-dlna-profile-loader.h \
+       gupnp-dlna-g-values-private.h \
+       gupnp-dlna-info-set.h \
+       gupnp-dlna-info-value.h \
+       gupnp-dlna-profile-private.h \
+       gupnp-dlna-restriction-private.h \
+       gupnp-dlna-utils.h \
+       gupnp-dlna-value.h \
+       gupnp-dlna-value-list-private.h \
+       gupnp-dlna-value-type.h \
+       gupnp-dlna-value-union.h
+
+
+# Images to copy into HTML directory.
+# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
+HTML_IMAGES = 
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
+content_files = ../version.xml
+
+# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
+# These files must be listed here *and* in content_files
+# e.g. expand_content_files=running.sgml
+expand_content_files = 
+
+# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
+# Only needed if you are using gtkdoc-scangobj to dynamically query widget
+# signals and properties.
+# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES = -I$(top_srcdir)
+GTKDOC_LIBS = $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
+@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = 
+@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute
+
+# We set GPATH here; this gives us semantics for GNU make
+# which are more like other make's VPATH, when it comes to
+# whether a source that is a target of one rule is then
+# searched for in VPATH/GPATH.
+#
+GPATH = $(srcdir)
+TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
+SETUP_FILES = \
+       $(content_files)                \
+       $(DOC_MAIN_SGML_FILE)           \
+       $(DOC_MODULE)-sections.txt      \
+       $(DOC_MODULE)-overrides.txt
+
+EXTRA_DIST = \
+       $(HTML_IMAGES)                  \
+       $(SETUP_FILES)
+
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
+       html-build.stamp pdf-build.stamp \
+       sgml.stamp html.stamp pdf.stamp
+
+SCANOBJ_FILES = \
+       $(DOC_MODULE).args       \
+       $(DOC_MODULE).hierarchy  \
+       $(DOC_MODULE).interfaces \
+       $(DOC_MODULE).prerequisites \
+       $(DOC_MODULE).signals
+
+REPORT_FILES = \
+       $(DOC_MODULE)-undocumented.txt \
+       $(DOC_MODULE)-undeclared.txt \
+       $(DOC_MODULE)-unused.txt
+
+CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = 
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = 
+@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp
+
+# This includes the standard gtk-doc make rules, copied by gtkdocize.
+
+# Other files to distribute
+# e.g. EXTRA_DIST += version.xml.in
+DISTCLEANFILES = version.xml
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/gupnp-dlna/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu doc/gupnp-dlna/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+$(top_srcdir)/gtk-doc.make:
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile all-local
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-local mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-local
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+       maintainer-clean-local
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am all-local check check-am clean clean-generic \
+       clean-libtool clean-local dist-hook distclean \
+       distclean-generic distclean-libtool distclean-local distdir \
+       dvi dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-data-local install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic \
+       maintainer-clean-local mostlyclean mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+       uninstall-local
+
+
+@ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+@ENABLE_GTK_DOC_FALSE@all-local:
+
+docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
+
+$(REPORT_FILES): sgml-build.stamp
+
+#### setup ####
+
+setup-build.stamp:
+       -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           echo '  DOC   Preparing build'; \
+           files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+           if test "x$$files" != "x" ; then \
+               for file in $$files ; do \
+                   test -f $(abs_srcdir)/$$file && \
+                       cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
+               done; \
+           fi; \
+       fi
+       @touch setup-build.stamp
+
+#### scan ####
+
+scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
+       @echo '  DOC   Scanning header files'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
+       @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
+           echo "  DOC   Introspecting gobjects"; \
+           scanobj_options=""; \
+           gtkdoc-scangobj 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+           if test "$(?)" = "0"; then \
+               if test "x$(V)" = "x1"; then \
+                   scanobj_options="--verbose"; \
+               fi; \
+           fi; \
+           CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \
+           gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \
+       else \
+           for i in $(SCANOBJ_FILES) ; do \
+               test -f $$i || touch $$i ; \
+           done \
+       fi
+       @touch scan-build.stamp
+
+$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
+       @true
+
+#### xml ####
+
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+       @echo '  DOC   Building XML'
+       @_source_dir='' ; \
+       for i in $(DOC_SOURCE_DIR) ; do \
+           _source_dir="$${_source_dir} --source-dir=$$i" ; \
+       done ; \
+       gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
+       @touch sgml-build.stamp
+
+sgml.stamp: sgml-build.stamp
+       @true
+
+#### html ####
+
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building HTML'
+       @rm -rf html
+       @mkdir html
+       @mkhtml_options=""; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkhtml_options="$$mkhtml_options --verbose"; \
+         fi; \
+       fi; \
+       gtkdoc-mkhtml 2>&1 --help | grep  >/dev/null "\-\-path"; \
+       if test "$(?)" = "0"; then \
+         mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
+       fi; \
+       cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
+       -@test "x$(HTML_IMAGES)" = "x" || \
+       for file in $(HTML_IMAGES) ; do \
+         if test -f $(abs_srcdir)/$$file ; then \
+           cp $(abs_srcdir)/$$file $(abs_builddir)/html; \
+         fi; \
+         if test -f $(abs_builddir)/$$file ; then \
+           cp $(abs_builddir)/$$file $(abs_builddir)/html; \
+         fi; \
+       done;
+       @echo '  DOC   Fixing cross-references'
+       @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
+       @touch html-build.stamp
+
+#### pdf ####
+
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+       @echo '  DOC   Building PDF'
+       @rm -f $(DOC_MODULE).pdf
+       @mkpdf_options=""; \
+       gtkdoc-mkpdf 2>&1 --help | grep  >/dev/null "\-\-verbose"; \
+       if test "$(?)" = "0"; then \
+         if test "x$(V)" = "x1"; then \
+           mkpdf_options="$$mkpdf_options --verbose"; \
+         fi; \
+       fi; \
+       if test "x$(HTML_IMAGES)" != "x"; then \
+         for img in $(HTML_IMAGES); do \
+           part=`dirname $$img`; \
+           echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \
+           if test $$? != 0; then \
+             mkpdf_options="$$mkpdf_options --imgdir=$$part"; \
+           fi; \
+         done; \
+       fi; \
+       gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
+       @touch pdf-build.stamp
+
+##############
+
+clean-local:
+       @rm -f *~ *.bak
+       @rm -rf .libs
+
+distclean-local:
+       @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
+           $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
+       @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
+           rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
+       fi
+
+maintainer-clean-local: clean
+       @rm -rf xml html
+
+install-data-local:
+       @installfiles=`echo $(builddir)/html/*`; \
+       if test "$$installfiles" = '$(builddir)/html/*'; \
+       then echo 1>&2 'Nothing to install' ; \
+       else \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+         else \
+           installdir="$(DESTDIR)$(TARGET_DIR)"; \
+         fi; \
+         $(mkinstalldirs) $${installdir} ; \
+         for i in $$installfiles; do \
+           echo ' $(INSTALL_DATA) '$$i ; \
+           $(INSTALL_DATA) $$i $${installdir}; \
+         done; \
+         if test -n "$(DOC_MODULE_VERSION)"; then \
+           mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
+             $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
+         fi; \
+         $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
+       fi
+
+uninstall-local:
+       @if test -n "$(DOC_MODULE_VERSION)"; then \
+         installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
+       else \
+         installdir="$(DESTDIR)$(TARGET_DIR)"; \
+       fi; \
+       rm -rf $${installdir}
+
+#
+# Require gtk-doc when making dist
+#
+@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc:
+@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc:
+@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist"
+@ENABLE_GTK_DOC_FALSE@ @false
+
+dist-hook: dist-check-gtkdoc dist-hook-local
+       @mkdir $(distdir)/html
+       @cp ./html/* $(distdir)/html
+       @-cp ./$(DOC_MODULE).pdf $(distdir)/
+       @-cp ./$(DOC_MODULE).types $(distdir)/
+       @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/
+       @cd $(distdir) && rm -f $(DISTCLEANFILES)
+       @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
+
+.PHONY : dist-hook-local docs
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
similarity index 73%
rename from doc/gupnp-dlna-docs.sgml
rename to doc/gupnp-dlna/gupnp-dlna-docs.sgml
index 8465da4..1afa00b 100644 (file)
@@ -1,7 +1,7 @@
 <?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 SYSTEM "version.xml">
+<!ENTITY version SYSTEM "../version.xml">
 ]>
 <book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
   <bookinfo>
       <year>2010</year>
       <holder>Nokia Corporation</holder>
     </copyright>
+    <copyright>
+      <year>2012</year>
+      <holder>Intel Corporation</holder>
+    </copyright>
 
     <legalnotice>
       <para>
       MediaServer implementations, such as DLNA media profile guessing.
     </para>
 
-    <para>
-      Before using the GUPnP DLNA API, you must initialise GStreamer by calling
-      gst_init() or gst_init_check().
-    </para>
-
-    <xi:include href="xml/gupnp-dlna-discoverer.xml"/>
-    <xi:include href="xml/gupnp-dlna-information.xml"/>
+    <xi:include href="xml/gupnp-dlna-profile-guesser.xml"/>
     <xi:include href="xml/gupnp-dlna-profile.xml"/>
+    <xi:include href="xml/gupnp-dlna-information.xml"/>
+    <xi:include href="xml/gupnp-dlna-values.xml"/>
+    <xi:include href="xml/gupnp-dlna-audio-information.xml"/>
+    <xi:include href="xml/gupnp-dlna-container-information.xml"/>
+    <xi:include href="xml/gupnp-dlna-image-information.xml"/>
+    <xi:include href="xml/gupnp-dlna-video-information.xml"/>
+    <xi:include href="xml/gupnp-dlna-restriction.xml"/>
+    <xi:include href="xml/gupnp-dlna-value-list.xml"/>
+    <xi:include href="xml/gupnp-dlna-g-values.xml"/>
+    <xi:include href="xml/api-index-full.xml"/>
 
   </chapter>
 
diff --git a/doc/gupnp-dlna/gupnp-dlna-overrides.txt b/doc/gupnp-dlna/gupnp-dlna-overrides.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/gupnp-dlna/gupnp-dlna-sections.txt b/doc/gupnp-dlna/gupnp-dlna-sections.txt
new file mode 100644 (file)
index 0000000..a9c3a4a
--- /dev/null
@@ -0,0 +1,242 @@
+<SECTION>
+<FILE>gupnp-dlna</FILE>
+
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-audio-information</FILE>
+<TITLE>GUPnPDLNAAudioInformation</TITLE>
+GUPnPDLNAAudioInformation
+GUPnPDLNAAudioInformationClass
+gupnp_dlna_audio_information_get_bitrate
+gupnp_dlna_audio_information_get_channels
+gupnp_dlna_audio_information_get_depth
+gupnp_dlna_audio_information_get_layer
+gupnp_dlna_audio_information_get_level
+gupnp_dlna_audio_information_get_mime
+gupnp_dlna_audio_information_get_mpeg_audio_version
+gupnp_dlna_audio_information_get_mpeg_version
+gupnp_dlna_audio_information_get_profile
+gupnp_dlna_audio_information_get_rate
+gupnp_dlna_audio_information_get_stream_format
+gupnp_dlna_audio_information_get_wma_version
+<SUBSECTION Standard>
+GUPNP_DLNA_AUDIO_INFORMATION
+GUPNP_DLNA_AUDIO_INFORMATION_CLASS
+GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS
+GUPNP_IS_DLNA_AUDIO_INFORMATION
+GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS
+GUPNP_TYPE_DLNA_AUDIO_INFORMATION
+gupnp_dlna_audio_information_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-container-information</FILE>
+<TITLE>GUPnPDLNAContainerInformation</TITLE>
+GUPnPDLNAContainerInformation
+GUPnPDLNAContainerInformationClass
+gupnp_dlna_container_information_get_mime
+gupnp_dlna_container_information_get_mpeg_version
+gupnp_dlna_container_information_get_packet_size
+gupnp_dlna_container_information_get_profile
+gupnp_dlna_container_information_get_variant
+gupnp_dlna_container_information_is_system_stream
+<SUBSECTION Standard>
+GUPNP_DLNA_CONTAINER_INFORMATION
+GUPNP_DLNA_CONTAINER_INFORMATION_CLASS
+GUPNP_DLNA_CONTAINER_INFORMATION_GET_CLASS
+GUPNP_IS_DLNA_CONTAINER_INFORMATION
+GUPNP_IS_DLNA_CONTAINER_INFORMATION_CLASS
+GUPNP_TYPE_DLNA_CONTAINER_INFORMATION
+gupnp_dlna_container_information_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-g-values</FILE>
+GUPnPDLNAFraction
+GUPnPDLNAFractionRange
+GUPnPDLNAIntRange
+gupnp_dlna_fraction_copy
+gupnp_dlna_fraction_free
+gupnp_dlna_fraction_get_denominator
+gupnp_dlna_fraction_get_numerator
+gupnp_dlna_fraction_range_copy
+gupnp_dlna_fraction_range_free
+gupnp_dlna_fraction_range_get_max
+gupnp_dlna_fraction_range_get_min
+gupnp_dlna_int_range_copy
+gupnp_dlna_int_range_free
+gupnp_dlna_int_range_get_max
+gupnp_dlna_int_range_get_min
+<SUBSECTION Standard>
+GUPNP_DLNA_FRACTION
+GUPNP_DLNA_FRACTION_RANGE
+GUPNP_DLNA_INT_RANGE
+GUPNP_TYPE_DLNA_FRACTION
+GUPNP_TYPE_DLNA_FRACTION_RANGE
+GUPNP_TYPE_DLNA_INT_RANGE
+gupnp_dlna_fraction_get_type
+gupnp_dlna_fraction_range_get_type
+gupnp_dlna_int_range_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-image-information</FILE>
+<TITLE>GUPnPDLNAImageInformation</TITLE>
+GUPnPDLNAImageInformation
+GUPnPDLNAImageInformationClass
+gupnp_dlna_image_information_get_depth
+gupnp_dlna_image_information_get_height
+gupnp_dlna_image_information_get_mime
+gupnp_dlna_image_information_get_width
+<SUBSECTION Standard>
+GUPNP_DLNA_IMAGE_INFORMATION
+GUPNP_DLNA_IMAGE_INFORMATION_CLASS
+GUPNP_DLNA_IMAGE_INFORMATION_GET_CLASS
+GUPNP_IS_DLNA_IMAGE_INFORMATION
+GUPNP_IS_DLNA_IMAGE_INFORMATION_CLASS
+GUPNP_TYPE_DLNA_IMAGE_INFORMATION
+gupnp_dlna_image_information_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-information</FILE>
+<TITLE>GUPnPDLNAInformation</TITLE>
+GUPnPDLNAInformation
+GUPnPDLNAInformationClass
+gupnp_dlna_information_get_audio_information
+gupnp_dlna_information_get_container_information
+gupnp_dlna_information_get_image_information
+gupnp_dlna_information_get_uri
+gupnp_dlna_information_get_video_information
+<SUBSECTION Standard>
+GUPNP_DLNA_INFORMATION
+GUPNP_DLNA_INFORMATION_CLASS
+GUPNP_DLNA_INFORMATION_GET_CLASS
+GUPNP_IS_DLNA_INFORMATION
+GUPNP_IS_DLNA_INFORMATION_CLASS
+GUPNP_TYPE_DLNA_INFORMATION
+GUPnPDLNAInformationPrivate
+gupnp_dlna_information_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-profile</FILE>
+<TITLE>GUPnPDLNAProfile</TITLE>
+GUPnPDLNAProfile
+GUPnPDLNAProfileClass
+gupnp_dlna_profile_get_audio_restrictions
+gupnp_dlna_profile_get_container_restrictions
+gupnp_dlna_profile_get_extended
+gupnp_dlna_profile_get_image_restrictions
+gupnp_dlna_profile_get_mime
+gupnp_dlna_profile_get_name
+gupnp_dlna_profile_get_video_restrictions
+<SUBSECTION Standard>
+GUPNP_DLNA_PROFILE
+GUPNP_DLNA_PROFILE_CLASS
+GUPNP_DLNA_PROFILE_GET_CLASS
+GUPNP_IS_DLNA_PROFILE
+GUPNP_IS_DLNA_PROFILE_CLASS
+GUPNP_TYPE_DLNA_PROFILE
+GUPnPDLNAProfilePrivate
+gupnp_dlna_profile_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-profile-guesser</FILE>
+<TITLE>GUPnPDLNAProfileGuesser</TITLE>
+GUPnPDLNAProfileGuesser
+GUPnPDLNAProfileGuesserClass
+gupnp_dlna_profile_guesser_cleanup
+gupnp_dlna_profile_guesser_get_extended_mode
+gupnp_dlna_profile_guesser_get_profile
+gupnp_dlna_profile_guesser_get_relaxed_mode
+gupnp_dlna_profile_guesser_guess_profile_async
+gupnp_dlna_profile_guesser_guess_profile_from_info
+gupnp_dlna_profile_guesser_guess_profile_sync
+gupnp_dlna_profile_guesser_list_profiles
+gupnp_dlna_profile_guesser_new
+<SUBSECTION Standard>
+GUPNP_DLNA_PROFILE_GUESSER
+GUPNP_DLNA_PROFILE_GUESSER_CLASS
+GUPNP_DLNA_PROFILE_GUESSER_GET_CLASS
+GUPNP_IS_DLNA_PROFILE_GUESSER
+GUPNP_IS_DLNA_PROFILE_GUESSER_CLASS
+GUPNP_TYPE_DLNA_PROFILE_GUESSER
+GUPnPDLNAProfileGuesserPrivate
+gupnp_dlna_profile_guesser_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-restriction</FILE>
+GUPnPDLNARestriction
+gupnp_dlna_restriction_copy
+gupnp_dlna_restriction_free
+gupnp_dlna_restriction_get_entries
+gupnp_dlna_restriction_get_mime
+gupnp_dlna_restriction_is_empty
+gupnp_dlna_restriction_to_string
+<SUBSECTION Standard>
+GUPNP_DLNA_RESTRICTION
+GUPNP_TYPE_DLNA_RESTRICTION
+gupnp_dlna_restriction_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-value-list</FILE>
+GUPnPDLNAValueList
+gupnp_dlna_value_list_copy
+gupnp_dlna_value_list_free
+gupnp_dlna_value_list_get_g_values
+gupnp_dlna_value_list_is_empty
+gupnp_dlna_value_list_to_string
+<SUBSECTION Standard>
+GUPNP_DLNA_VALUE_LIST
+GUPNP_TYPE_DLNA_VALUE_LIST
+gupnp_dlna_value_list_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-values</FILE>
+GUPNP_DLNA_BOOL_VALUE_UNSET
+GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED
+GUPNP_DLNA_FRACTION_VALUE_UNSET
+GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED
+GUPNP_DLNA_INT_VALUE_UNSET
+GUPNP_DLNA_INT_VALUE_UNSUPPORTED
+GUPNP_DLNA_STRING_VALUE_UNSET
+GUPNP_DLNA_STRING_VALUE_UNSUPPORTED
+GUPnPDLNABoolValue
+GUPnPDLNAFractionValue
+GUPnPDLNAIntValue
+GUPnPDLNAStringValue
+GUPnPDLNAValueState
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-dlna-video-information</FILE>
+<TITLE>GUPnPDLNAVideoInformation</TITLE>
+GUPnPDLNAVideoInformation
+GUPnPDLNAVideoInformationClass
+gupnp_dlna_video_information_get_bitrate
+gupnp_dlna_video_information_get_framerate
+gupnp_dlna_video_information_get_height
+gupnp_dlna_video_information_get_level
+gupnp_dlna_video_information_get_mime
+gupnp_dlna_video_information_get_mpeg_version
+gupnp_dlna_video_information_get_pixel_aspect_ratio
+gupnp_dlna_video_information_get_profile
+gupnp_dlna_video_information_get_width
+gupnp_dlna_video_information_is_interlaced
+gupnp_dlna_video_information_is_system_stream
+<SUBSECTION Standard>
+GUPNP_DLNA_VIDEO_INFORMATION
+GUPNP_DLNA_VIDEO_INFORMATION_CLASS
+GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS
+GUPNP_IS_DLNA_VIDEO_INFORMATION
+GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS
+GUPNP_TYPE_DLNA_VIDEO_INFORMATION
+gupnp_dlna_video_information_get_type
+</SECTION>
+
diff --git a/doc/gupnp-dlna/gupnp-dlna.types b/doc/gupnp-dlna/gupnp-dlna.types
new file mode 100644 (file)
index 0000000..56ee10f
--- /dev/null
@@ -0,0 +1,12 @@
+gupnp_dlna_audio_information_get_type
+gupnp_dlna_container_information_get_type
+gupnp_dlna_fraction_get_type
+gupnp_dlna_fraction_range_get_type
+gupnp_dlna_image_information_get_type
+gupnp_dlna_information_get_type
+gupnp_dlna_int_range_get_type
+gupnp_dlna_profile_get_type
+gupnp_dlna_profile_guesser_get_type
+gupnp_dlna_restriction_get_type
+gupnp_dlna_value_list_get_type
+gupnp_dlna_video_information_get_type
diff --git a/doc/gupnp-dlna/html/GUPnPDLNAAudioInformation.html b/doc/gupnp-dlna/html/GUPnPDLNAAudioInformation.html
new file mode 100644 (file)
index 0000000..fe227d7
--- /dev/null
@@ -0,0 +1,466 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPDLNAAudioInformation</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">
+<link rel="next" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gupnp-dlna-GUPnP-DLNA-Values.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="GUPnPDLNAContainerInformation.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPDLNAAudioInformation.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPDLNAAudioInformation.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPDLNAAudioInformation.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPDLNAAudioInformation"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPDLNAAudioInformation.top_of_page"></a>GUPnPDLNAAudioInformation</span></h2>
+<p>GUPnPDLNAAudioInformation â€” Base class representing audio metadata needed
+for DLNA profiles matching.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPDLNAAudioInformation.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation-struct" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>;
+                    <a class="link" href="GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformationClass" title="GUPnPDLNAAudioInformationClass">GUPnPDLNAAudioInformationClass</a>;
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-bitrate" title="gupnp_dlna_audio_information_get_bitrate ()">gupnp_dlna_audio_information_get_bitrate</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-channels" title="gupnp_dlna_audio_information_get_channels ()">gupnp_dlna_audio_information_get_channels</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-depth" title="gupnp_dlna_audio_information_get_depth ()">gupnp_dlna_audio_information_get_depth</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-layer" title="gupnp_dlna_audio_information_get_layer ()">gupnp_dlna_audio_information_get_layer</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-level" title="gupnp_dlna_audio_information_get_level ()">gupnp_dlna_audio_information_get_level</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mime" title="gupnp_dlna_audio_information_get_mime ()">gupnp_dlna_audio_information_get_mime</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mpeg-audio-version" title="gupnp_dlna_audio_information_get_mpeg_audio_version ()">gupnp_dlna_audio_information_get_mpeg_audio_version</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mpeg-version" title="gupnp_dlna_audio_information_get_mpeg_version ()">gupnp_dlna_audio_information_get_mpeg_version</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-profile" title="gupnp_dlna_audio_information_get_profile ()">gupnp_dlna_audio_information_get_profile</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-rate" title="gupnp_dlna_audio_information_get_rate ()">gupnp_dlna_audio_information_get_rate</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-stream-format" title="gupnp_dlna_audio_information_get_stream_format ()">gupnp_dlna_audio_information_get_stream_format</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-wma-version" title="gupnp_dlna_audio_information_get_wma_version ()">gupnp_dlna_audio_information_get_wma_version</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAAudioInformation.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----GUPnPDLNAAudioInformation
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAAudioInformation.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> holds all audio metadatas important for
+matching profiles. Note that it does not mean all data should be
+provided for every audio file as in some cases it does not make
+sense (e.g. WMA version does not make sense for MPEG audio files).
+</p>
+<p>
+For metadata attributes that do not exist in current audio file an
+unset value should be returned. For metadata attributes that do
+exist a set value with proper underlying value should be
+returned. In case metadata extractor has completely no clue how to
+extract some metadata attribute at all, an unsupported value should
+be returned. Note that unsupported values should be a temporary
+mean before fixing the multimedia framework to be able to extract
+such attribute.
+</p>
+<p>
+Note that <a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mime" title="gupnp_dlna_audio_information_get_mime ()"><code class="function">gupnp_dlna_audio_information_get_mime()</code></a> should always
+return a set value. Otherwise it is highly probably that the file
+will not match against any DLNA profile.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAAudioInformation.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAAudioInformation-struct"></a><h3>GUPnPDLNAAudioInformation</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAAudioInformation GUPnPDLNAAudioInformation;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAAudioInformationClass"></a><h3>GUPnPDLNAAudioInformationClass</h3>
+<pre class="programlisting">typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAIntValue
+        (* get_bitrate) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_channels) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_depth) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_layer) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_level) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_mpeg_audio_version) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_mpeg_version) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_profile) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_rate) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_stream_format) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_wma_version) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_mime) (GUPnPDLNAAudioInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAAudioInformationClass;
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-bitrate"></a>get_bitrate</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+bitrate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-channels"></a>get_channels</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+channels count.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-depth"></a>get_depth</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+depth.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-layer"></a>get_layer</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+layer.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-level"></a>get_level</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+level.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-mpeg-audio-version"></a>get_mpeg_audio_version</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a>
+to get an MPEG audio version.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-mpeg-version"></a>get_mpeg_version</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to
+get an MPEG version.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-profile"></a>get_profile</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+profile.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-rate"></a>get_rate</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+sample rate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-stream-format"></a>get_stream_format</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to
+get a stream format.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-wma-version"></a>get_wma_version</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get
+a WMA version.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.get-mime"></a>get_mime</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a MIME
+type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GUPnPDLNAAudioInformationClass.-reserved"></a>_reserved</code></em>[12];</span></p></td>
+<td>Padding. Ignore it.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-bitrate"></a><h3>gupnp_dlna_audio_information_get_bitrate ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_audio_information_get_bitrate
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A bitrate.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-channels"></a><h3>gupnp_dlna_audio_information_get_channels ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_audio_information_get_channels
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A number of channels.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-depth"></a><h3>gupnp_dlna_audio_information_get_depth ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_audio_information_get_depth
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A depth.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-layer"></a><h3>gupnp_dlna_audio_information_get_layer ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_audio_information_get_layer
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A layer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-level"></a><h3>gupnp_dlna_audio_information_get_level ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_audio_information_get_level
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A level.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-mime"></a><h3>gupnp_dlna_audio_information_get_mime ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_audio_information_get_mime
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A MIME type.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-mpeg-audio-version"></a><h3>gupnp_dlna_audio_information_get_mpeg_audio_version ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_audio_information_get_mpeg_audio_version
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>An MPEG audio version.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-mpeg-version"></a><h3>gupnp_dlna_audio_information_get_mpeg_version ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_audio_information_get_mpeg_version
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>An MPEG version.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-profile"></a><h3>gupnp_dlna_audio_information_get_profile ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_audio_information_get_profile
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A profile.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-rate"></a><h3>gupnp_dlna_audio_information_get_rate ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_audio_information_get_rate
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A sample rate.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-stream-format"></a><h3>gupnp_dlna_audio_information_get_stream_format ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_audio_information_get_stream_format
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A stream format.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-audio-information-get-wma-version"></a><h3>gupnp_dlna_audio_information_get_wma_version ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_audio_information_get_wma_version
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A WMA version.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAAudioInformation.see-also"></a><h2>See Also</h2>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="type">GUPnPDLNABoolValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="type">GUPnPDLNAFractionValue</span></a>,
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="type">GUPnPDLNAIntValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/GUPnPDLNAContainerInformation.html b/doc/gupnp-dlna/html/GUPnPDLNAContainerInformation.html
new file mode 100644 (file)
index 0000000..e91723d
--- /dev/null
@@ -0,0 +1,293 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPDLNAContainerInformation</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">
+<link rel="next" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="GUPnPDLNAAudioInformation.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="GUPnPDLNAImageInformation.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPDLNAContainerInformation.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPDLNAContainerInformation.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPDLNAContainerInformation.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPDLNAContainerInformation"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPDLNAContainerInformation.top_of_page"></a>GUPnPDLNAContainerInformation</span></h2>
+<p>GUPnPDLNAContainerInformation â€” Base class representing container metadata
+needed for DLNA profiles matching.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPDLNAContainerInformation.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation-struct" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>;
+                    <a class="link" href="GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformationClass" title="GUPnPDLNAContainerInformationClass">GUPnPDLNAContainerInformationClass</a>;
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mime" title="gupnp_dlna_container_information_get_mime ()">gupnp_dlna_container_information_get_mime</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mpeg-version" title="gupnp_dlna_container_information_get_mpeg_version ()">gupnp_dlna_container_information_get_mpeg_version</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-packet-size" title="gupnp_dlna_container_information_get_packet_size ()">gupnp_dlna_container_information_get_packet_size</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-profile" title="gupnp_dlna_container_information_get_profile ()">gupnp_dlna_container_information_get_profile</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-variant" title="gupnp_dlna_container_information_get_variant ()">gupnp_dlna_container_information_get_variant</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="returnvalue">GUPnPDLNABoolValue</span></a>  <a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-is-system-stream" title="gupnp_dlna_container_information_is_system_stream ()">gupnp_dlna_container_information_is_system_stream</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAContainerInformation.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----GUPnPDLNAContainerInformation
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAContainerInformation.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> holds all container metadatas
+important for matching profiles. Note that it does not mean all
+data should be provided for every media file as in some cases it
+does not make sense (e.g. MPEG version does not make sense for WMA
+media files).
+</p>
+<p>
+For metadata attributes that do not exist in current media file an
+unset value should be returned. For metadata attributes that do
+exist a set value with proper underlying value should be
+returned. In case metadata extractor has completely no clue how to
+extract some metadata attribute at all, an unsupported value should
+be returned. Note that unsupported values should be a temporary
+mean before fixing the multimedia framework to be able to extract
+such attribute.
+</p>
+<p>
+Note that <a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mime" title="gupnp_dlna_container_information_get_mime ()"><code class="function">gupnp_dlna_container_information_get_mime()</code></a> should always
+return a set value. Otherwise it is highly probably that the file
+will not match against any DLNA profile.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAContainerInformation.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAContainerInformation-struct"></a><h3>GUPnPDLNAContainerInformation</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAContainerInformation GUPnPDLNAContainerInformation;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAContainerInformationClass"></a><h3>GUPnPDLNAContainerInformationClass</h3>
+<pre class="programlisting">typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAIntValue
+        (* get_mpeg_version) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_packet_size) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_profile) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNABoolValue
+        (* is_system_stream) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_variant) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_mime) (GUPnPDLNAContainerInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAContainerInformationClass;
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GUPnPDLNAContainerInformationClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAContainerInformationClass.get-mpeg-version"></a>get_mpeg_version</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to
+get an MPEG version.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAContainerInformationClass.get-packet-size"></a>get_packet_size</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get
+a packet size.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAContainerInformationClass.get-profile"></a>get_profile</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+profile.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAContainerInformationClass.is-system-stream"></a>is_system_stream</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to
+get whether it is a system stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAContainerInformationClass.get-variant"></a>get_variant</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+variant.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAContainerInformationClass.get-mime"></a>get_mime</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a MIME
+type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GUPnPDLNAContainerInformationClass.-reserved"></a>_reserved</code></em>[12];</span></p></td>
+<td>Padding. Ignore it.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-container-information-get-mime"></a><h3>gupnp_dlna_container_information_get_mime ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_container_information_get_mime
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A MIME type.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-container-information-get-mpeg-version"></a><h3>gupnp_dlna_container_information_get_mpeg_version ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_container_information_get_mpeg_version
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>An MPEG version.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-container-information-get-packet-size"></a><h3>gupnp_dlna_container_information_get_packet_size ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_container_information_get_packet_size
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A packet size.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-container-information-get-profile"></a><h3>gupnp_dlna_container_information_get_profile ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_container_information_get_profile
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A profile.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-container-information-get-variant"></a><h3>gupnp_dlna_container_information_get_variant ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_container_information_get_variant
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A variant.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-container-information-is-system-stream"></a><h3>gupnp_dlna_container_information_is_system_stream ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="returnvalue">GUPnPDLNABoolValue</span></a>  gupnp_dlna_container_information_is_system_stream
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Whether it is system stream.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAContainerInformation.see-also"></a><h2>See Also</h2>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="type">GUPnPDLNABoolValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="type">GUPnPDLNAFractionValue</span></a>,
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="type">GUPnPDLNAIntValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/GUPnPDLNAImageInformation.html b/doc/gupnp-dlna/html/GUPnPDLNAImageInformation.html
new file mode 100644 (file)
index 0000000..c366b0a
--- /dev/null
@@ -0,0 +1,234 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPDLNAImageInformation</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">
+<link rel="next" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="GUPnPDLNAContainerInformation.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="GUPnPDLNAVideoInformation.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPDLNAImageInformation.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPDLNAImageInformation.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPDLNAImageInformation.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPDLNAImageInformation"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPDLNAImageInformation.top_of_page"></a>GUPnPDLNAImageInformation</span></h2>
+<p>GUPnPDLNAImageInformation â€” Base class representing image metadata needed
+for DLNA profiles matching.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPDLNAImageInformation.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation-struct" title="GUPnPDLNAImageInformation">GUPnPDLNAImageInformation</a>;
+                    <a class="link" href="GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformationClass" title="GUPnPDLNAImageInformationClass">GUPnPDLNAImageInformationClass</a>;
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-depth" title="gupnp_dlna_image_information_get_depth ()">gupnp_dlna_image_information_get_depth</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-height" title="gupnp_dlna_image_information_get_height ()">gupnp_dlna_image_information_get_height</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-mime" title="gupnp_dlna_image_information_get_mime ()">gupnp_dlna_image_information_get_mime</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-width" title="gupnp_dlna_image_information_get_width ()">gupnp_dlna_image_information_get_width</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> *info</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAImageInformation.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----GUPnPDLNAImageInformation
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAImageInformation.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> holds all image metadatas important for
+matching profiles. Note that it does not mean all data should be
+provided for every image file as in some cases it does not make
+sense.
+</p>
+<p>
+For metadata attributes that do not exist in current image file an
+unset value should be returned. For metadata attributes that do
+exist a set value with proper underlying value should be
+returned. In case metadata extractor has completely no clue how to
+extract some metadata attribute at all, an unsupported value should
+be returned. Note that unsupported values should be a temporary
+mean before fixing the multimedia framework to be able to extract
+such attribute.
+</p>
+<p>
+Note that <a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-mime" title="gupnp_dlna_image_information_get_mime ()"><code class="function">gupnp_dlna_image_information_get_mime()</code></a> should always
+return a set value. Otherwise it is highly probably that the file
+will not match against any DLNA profile.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAImageInformation.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAImageInformation-struct"></a><h3>GUPnPDLNAImageInformation</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAImageInformation GUPnPDLNAImageInformation;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAImageInformationClass"></a><h3>GUPnPDLNAImageInformationClass</h3>
+<pre class="programlisting">typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAIntValue
+        (* get_depth) (GUPnPDLNAImageInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_height) (GUPnPDLNAImageInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_width) (GUPnPDLNAImageInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_mime) (GUPnPDLNAImageInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAImageInformationClass;
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GUPnPDLNAImageInformationClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAImageInformationClass.get-depth"></a>get_depth</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+depth.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAImageInformationClass.get-height"></a>get_height</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+height.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAImageInformationClass.get-width"></a>get_width</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+width.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAImageInformationClass.get-mime"></a>get_mime</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a MIME
+type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GUPnPDLNAImageInformationClass.-reserved"></a>_reserved</code></em>[12];</span></p></td>
+<td>Padding. Ignore it.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-image-information-get-depth"></a><h3>gupnp_dlna_image_information_get_depth ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_image_information_get_depth
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A depth of an image.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-image-information-get-height"></a><h3>gupnp_dlna_image_information_get_height ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_image_information_get_height
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A height of an image.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-image-information-get-mime"></a><h3>gupnp_dlna_image_information_get_mime ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_image_information_get_mime
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A MIME type of an image.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-image-information-get-width"></a><h3>gupnp_dlna_image_information_get_width ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_image_information_get_width
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A width of an image.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAImageInformation.see-also"></a><h2>See Also</h2>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="type">GUPnPDLNABoolValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="type">GUPnPDLNAFractionValue</span></a>,
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="type">GUPnPDLNAIntValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/GUPnPDLNAInformation.html b/doc/gupnp-dlna/html/GUPnPDLNAInformation.html
new file mode 100644 (file)
index 0000000..4aff246
--- /dev/null
@@ -0,0 +1,312 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPDLNAInformation</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">
+<link rel="next" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="GUPnPDLNAProfile.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="gupnp-dlna-GUPnP-DLNA-Values.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPDLNAInformation.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPDLNAInformation.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPDLNAInformation.object-hierarchy" class="shortcut">Object Hierarchy</a>
+                  Â | 
+                  <a href="#GUPnPDLNAInformation.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPDLNAInformation"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPDLNAInformation.top_of_page"></a>GUPnPDLNAInformation</span></h2>
+<p>GUPnPDLNAInformation â€” Base class for storing various types of
+metadata informations.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPDLNAInformation.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation-struct" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>;
+                    <a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformationClass" title="GUPnPDLNAInformationClass">GUPnPDLNAInformationClass</a>;
+<a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="returnvalue">GUPnPDLNAAudioInformation</span></a> * <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-audio-information" title="gupnp_dlna_information_get_audio_information ()">gupnp_dlna_information_get_audio_information</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);
+<a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="returnvalue">GUPnPDLNAContainerInformation</span></a> * <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-container-information" title="gupnp_dlna_information_get_container_information ()">gupnp_dlna_information_get_container_information</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);
+<a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="returnvalue">GUPnPDLNAImageInformation</span></a> * <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-image-information" title="gupnp_dlna_information_get_image_information ()">gupnp_dlna_information_get_image_information</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-uri" title="gupnp_dlna_information_get_uri ()">gupnp_dlna_information_get_uri</a>      (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);
+<a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="returnvalue">GUPnPDLNAVideoInformation</span></a> * <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-video-information" title="gupnp_dlna_information_get_video_information ()">gupnp_dlna_information_get_video_information</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAInformation.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----GUPnPDLNAInformation
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAInformation.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+  "<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--audio-information" title='The "audio-information" property'>audio-information</a>"        <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a>*  : Read
+  "<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--container-information" title='The "container-information" property'>container-information</a>"    <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a>*  : Read
+  "<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--image-information" title='The "image-information" property'>image-information</a>"        <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a>*  : Read
+  "<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--uri" title='The "uri" property'>uri</a>"                      <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--video-information" title='The "video-information" property'>video-information</a>"        <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a>*  : Read
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAInformation.description"></a><h2>Description</h2>
+<p>
+Subclasses of <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> should override all virtual
+functions provided by this class. The overrides should return a
+subclasses of specific information base classes.
+</p>
+<p>
+When instantiating a subclass of <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> make sure
+that "uri" with a URI to media file is passed to <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-new"><code class="function">g_object_new()</code></a>.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAInformation.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAInformation-struct"></a><h3>GUPnPDLNAInformation</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAInformation GUPnPDLNAInformation;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAInformationClass"></a><h3>GUPnPDLNAInformationClass</h3>
+<pre class="programlisting">typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAAudioInformation *
+        (* get_audio_information) (GUPnPDLNAInformation *info);
+
+        GUPnPDLNAContainerInformation *
+        (* get_container_information) (GUPnPDLNAInformation *info);
+
+        GUPnPDLNAImageInformation *
+        (* get_image_information) (GUPnPDLNAInformation *info);
+
+        GUPnPDLNAVideoInformation *
+        (* get_video_information) (GUPnPDLNAInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAInformationClass;
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GUPnPDLNAInformationClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAInformationClass.get-audio-information"></a>get_audio_information</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a>
+to get an audio information.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAInformationClass.get-container-information"></a>get_container_information</code></em> ()</span></p></td>
+<td>This is called by
+<a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a container information.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAInformationClass.get-image-information"></a>get_image_information</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a>
+to get an image information.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAInformationClass.get-video-information"></a>get_video_information</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a>
+to get a video information.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GUPnPDLNAInformationClass.-reserved"></a>_reserved</code></em>[12];</span></p></td>
+<td>Padding. Ignore it.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-information-get-audio-information"></a><h3>gupnp_dlna_information_get_audio_information ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="returnvalue">GUPnPDLNAAudioInformation</span></a> * gupnp_dlna_information_get_audio_information
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);</pre>
+<p>
+Get an audio information of media file if applicable (e.g. for
+video and audio files).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a> object or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-information-get-container-information"></a><h3>gupnp_dlna_information_get_container_information ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="returnvalue">GUPnPDLNAContainerInformation</span></a> * gupnp_dlna_information_get_container_information
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);</pre>
+<p>
+Get an container information of media file if applicable (e.g. for
+video and audio files).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a> object or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-information-get-image-information"></a><h3>gupnp_dlna_information_get_image_information ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="returnvalue">GUPnPDLNAImageInformation</span></a> * gupnp_dlna_information_get_image_information
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);</pre>
+<p>
+Get an container information of media file if applicable (e.g. for
+image files).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a> object or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-information-get-uri"></a><h3>gupnp_dlna_information_get_uri ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       gupnp_dlna_information_get_uri      (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>An URI of a file. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-information-get-video-information"></a><h3>gupnp_dlna_information_get_video_information ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="returnvalue">GUPnPDLNAVideoInformation</span></a> * gupnp_dlna_information_get_video_information
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);</pre>
+<p>
+Get an container information of media file if applicable (e.g. for
+video files).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAInformation.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAInformation--audio-information"></a><h3>The <code class="literal">"audio-information"</code> property</h3>
+<pre class="programlisting">  "audio-information"        <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation"><span class="type">GUPnPDLNAAudioInformation</span></a>*  : Read</pre>
+<p>
+Audio information of a file.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAInformation--container-information"></a><h3>The <code class="literal">"container-information"</code> property</h3>
+<pre class="programlisting">  "container-information"    <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation"><span class="type">GUPnPDLNAContainerInformation</span></a>*  : Read</pre>
+<p>
+Container information of a file.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAInformation--image-information"></a><h3>The <code class="literal">"image-information"</code> property</h3>
+<pre class="programlisting">  "image-information"        <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation"><span class="type">GUPnPDLNAImageInformation</span></a>*  : Read</pre>
+<p>
+Image information of a file.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAInformation--uri"></a><h3>The <code class="literal">"uri"</code> property</h3>
+<pre class="programlisting">  "uri"                      <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write / Construct Only</pre>
+<p>
+URI of file which metadata this object stores.
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAInformation--video-information"></a><h3>The <code class="literal">"video-information"</code> property</h3>
+<pre class="programlisting">  "video-information"        <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a>*  : Read</pre>
+<p>
+Video information of a file.
+</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/GUPnPDLNAProfile.html b/doc/gupnp-dlna/html/GUPnPDLNAProfile.html
new file mode 100644 (file)
index 0000000..51d8fe7
--- /dev/null
@@ -0,0 +1,329 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPDLNAProfile</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">
+<link rel="next" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="GUPnPDLNAProfileGuesser.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="GUPnPDLNAInformation.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPDLNAProfile.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPDLNAProfile.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPDLNAProfile.object-hierarchy" class="shortcut">Object Hierarchy</a>
+                  Â | 
+                  <a href="#GUPnPDLNAProfile.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPDLNAProfile"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPDLNAProfile.top_of_page"></a>GUPnPDLNAProfile</span></h2>
+<p>GUPnPDLNAProfile â€” Object representing a DLNA profile</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPDLNAProfile.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile-struct" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>;
+                    <a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfileClass" title="GUPnPDLNAProfileClass">GUPnPDLNAProfileClass</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-audio-restrictions" title="gupnp_dlna_profile_get_audio_restrictions ()">gupnp_dlna_profile_get_audio_restrictions</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-container-restrictions" title="gupnp_dlna_profile_get_container_restrictions ()">gupnp_dlna_profile_get_container_restrictions</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-extended" title="gupnp_dlna_profile_get_extended ()">gupnp_dlna_profile_get_extended</a>     (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-image-restrictions" title="gupnp_dlna_profile_get_image_restrictions ()">gupnp_dlna_profile_get_image_restrictions</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-mime" title="gupnp_dlna_profile_get_mime ()">gupnp_dlna_profile_get_mime</a>         (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-name" title="gupnp_dlna_profile_get_name ()">gupnp_dlna_profile_get_name</a>         (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-video-restrictions" title="gupnp_dlna_profile_get_video_restrictions ()">gupnp_dlna_profile_get_video_restrictions</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfile.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----GUPnPDLNAProfile
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfile.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--audio-restrictions" title='The "audio-restrictions" property'>audio-restrictions</a>"       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--container-restrictions" title='The "container-restrictions" property'>container-restrictions</a>"   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--extended" title='The "extended" property'>extended</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--image-restrictions" title='The "image-restrictions" property'>image-restrictions</a>"       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--mime" title='The "mime" property'>mime</a>"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--name" title='The "name" property'>name</a>"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--video-restrictions" title='The "video-restrictions" property'>video-restrictions</a>"       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfile.description"></a><h2>Description</h2>
+<p>
+The <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> object provides a few APIs that return
+<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> objects. These represent a single DLNA
+profile. Each <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> has a name (the name of the DLNA
+profile) and the corresponding MIME type.
+</p>
+<p>
+Public representation of the various audio/container/image/video
+restrictions specified for that DLNA profile is to be added.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfile.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAProfile-struct"></a><h3>GUPnPDLNAProfile</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAProfile GUPnPDLNAProfile;</pre>
+<p>
+The top-level object used for the in-memory representation of the
+DLNA Profiles.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfileClass"></a><h3>GUPnPDLNAProfileClass</h3>
+<pre class="programlisting">typedef struct {
+        GObjectClass parent_class;
+} GUPnPDLNAProfileClass;
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GUPnPDLNAProfileClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> - parent of this class.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-get-audio-restrictions"></a><h3>gupnp_dlna_profile_get_audio_restrictions ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             gupnp_dlna_profile_get_audio_restrictions
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);</pre>
+<p>
+Gets a list of audio restrictions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>A profile. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Audio
+restrictions. Do not modify. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDLNARestriction]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-get-container-restrictions"></a><h3>gupnp_dlna_profile_get_container_restrictions ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             gupnp_dlna_profile_get_container_restrictions
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);</pre>
+<p>
+Gets a list of container restrictions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>A profile. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Container restrictions. Do not modify. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDLNARestriction]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-get-extended"></a><h3>gupnp_dlna_profile_get_extended ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            gupnp_dlna_profile_get_extended     (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>profile</code></em> is extended one and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-get-image-restrictions"></a><h3>gupnp_dlna_profile_get_image_restrictions ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             gupnp_dlna_profile_get_image_restrictions
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);</pre>
+<p>
+Gets a list of image restrictions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>A profile. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Image
+restrictions. Do not modify. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDLNARestriction]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-get-mime"></a><h3>gupnp_dlna_profile_get_mime ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       gupnp_dlna_profile_get_mime         (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The DLNA MIME type of the DLNA profile represented by <em class="parameter"><code>profile</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-get-name"></a><h3>gupnp_dlna_profile_get_name ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       gupnp_dlna_profile_get_name         (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The name of the DLNA profile represented by <em class="parameter"><code>profile</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-get-video-restrictions"></a><h3>gupnp_dlna_profile_get_video_restrictions ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             gupnp_dlna_profile_get_video_restrictions
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *profile</code></em>);</pre>
+<p>
+Gets a list of video restrictions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile</code></em> :</span></p></td>
+<td>A profile. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Video
+restrictions. Do not modify. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDLNARestriction]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfile.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAProfile--audio-restrictions"></a><h3>The <code class="literal">"audio-restrictions"</code> property</h3>
+<pre class="programlisting">  "audio-restrictions"       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<p>Audio restrictions for the DLNA Profile.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfile--container-restrictions"></a><h3>The <code class="literal">"container-restrictions"</code> property</h3>
+<pre class="programlisting">  "container-restrictions"   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<p>Container restrictions for the DLNA Profile.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfile--extended"></a><h3>The <code class="literal">"extended"</code> property</h3>
+<pre class="programlisting">  "extended"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write / Construct Only</pre>
+<p>
+Whether the DLNA profile is not a part of DLNA specification.
+</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfile--image-restrictions"></a><h3>The <code class="literal">"image-restrictions"</code> property</h3>
+<pre class="programlisting">  "image-restrictions"       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<p>Image restrictions for the DLNA Profile.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfile--mime"></a><h3>The <code class="literal">"mime"</code> property</h3>
+<pre class="programlisting">  "mime"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write / Construct Only</pre>
+<p>
+MIME type of the DLNA profile.
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfile--name"></a><h3>The <code class="literal">"name"</code> property</h3>
+<pre class="programlisting">  "name"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write / Construct Only</pre>
+<p>
+Name of the DLNA profile.
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfile--video-restrictions"></a><h3>The <code class="literal">"video-restrictions"</code> property</h3>
+<pre class="programlisting">  "video-restrictions"       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<p>Video restrictions for the DLNA Profile.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/GUPnPDLNAProfileGuesser.html b/doc/gupnp-dlna/html/GUPnPDLNAProfileGuesser.html
new file mode 100644 (file)
index 0000000..c9068c5
--- /dev/null
@@ -0,0 +1,454 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPDLNAProfileGuesser</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="ch01.html" title="GUPnP DLNA">
+<link rel="next" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="ch01.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="GUPnPDLNAProfile.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPDLNAProfileGuesser.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPDLNAProfileGuesser.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPDLNAProfileGuesser.object-hierarchy" class="shortcut">Object Hierarchy</a>
+                  Â | 
+                  <a href="#GUPnPDLNAProfileGuesser.properties" class="shortcut">Properties</a>
+                  Â | 
+                  <a href="#GUPnPDLNAProfileGuesser.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPDLNAProfileGuesser"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPDLNAProfileGuesser.top_of_page"></a>GUPnPDLNAProfileGuesser</span></h2>
+<p>GUPnPDLNAProfileGuesser â€” Utility API for discovering DLNA profile for
+given media.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPDLNAProfileGuesser.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser-struct" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>;
+                    <a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesserClass" title="GUPnPDLNAProfileGuesserClass">GUPnPDLNAProfileGuesserClass</a>;
+<span class="returnvalue">void</span>                <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-cleanup" title="gupnp_dlna_profile_guesser_cleanup ()">gupnp_dlna_profile_guesser_cleanup</a>  (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-extended-mode" title="gupnp_dlna_profile_guesser_get_extended_mode ()">gupnp_dlna_profile_guesser_get_extended_mode</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>);
+<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-profile" title="gupnp_dlna_profile_guesser_get_profile ()">gupnp_dlna_profile_guesser_get_profile</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-relaxed-mode" title="gupnp_dlna_profile_guesser_get_relaxed_mode ()">gupnp_dlna_profile_guesser_get_relaxed_mode</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-async" title="gupnp_dlna_profile_guesser_guess_profile_async ()">gupnp_dlna_profile_guesser_guess_profile_async</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> timeout_in_ms</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-from-info" title="gupnp_dlna_profile_guesser_guess_profile_from_info ()">gupnp_dlna_profile_guesser_guess_profile_from_info</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);
+<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-sync" title="gupnp_dlna_profile_guesser_guess_profile_sync ()">gupnp_dlna_profile_guesser_guess_profile_sync</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> timeout_in_ms</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> **dlna_info</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-list-profiles" title="gupnp_dlna_profile_guesser_list_profiles ()">gupnp_dlna_profile_guesser_list_profiles</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>);
+<a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="returnvalue">GUPnPDLNAProfileGuesser</span></a> * <a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-new" title="gupnp_dlna_profile_guesser_new ()">gupnp_dlna_profile_guesser_new</a>
+                                                        (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> relaxed_mode</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> extended_mode</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfileGuesser.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----GUPnPDLNAProfileGuesser
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfileGuesser.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+  "<a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser--extended-mode" title='The "extended-mode" property'>extended-mode</a>"            <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser--relaxed-mode" title='The "relaxed-mode" property'>relaxed-mode</a>"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write / Construct Only
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfileGuesser.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+  "<a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser-done" title='The "done" signal'>done</a>"                                           : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfileGuesser.description"></a><h2>Description</h2>
+<p>
+The API provides synchronous and asynchronous guessing of DLNA
+profile. The asynchronous mode requires a running <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GMainLoop"><span class="type">GMainLoop</span></a> in the
+default <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GMainContext"><span class="type">GMainContext</span></a>.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfileGuesser.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAProfileGuesser-struct"></a><h3>GUPnPDLNAProfileGuesser</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAProfileGuesser GUPnPDLNAProfileGuesser;</pre>
+<p>
+The top-level object used to for DLNA profile guessing.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfileGuesserClass"></a><h3>GUPnPDLNAProfileGuesserClass</h3>
+<pre class="programlisting">typedef struct {
+        GObjectClass parent_class;
+} GUPnPDLNAProfileGuesserClass;
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GUPnPDLNAProfileGuesserClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> - parent of this class.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-cleanup"></a><h3>gupnp_dlna_profile_guesser_cleanup ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                gupnp_dlna_profile_guesser_cleanup  (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Cleans up the DLNA profiles. Provided to remove Valgrind noise. Not
+thread-safe. Do not call it if there is even a slightest chance
+that profile guessing will be performed during process
+lifetime. The profiles are not reloaded after cleanup.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-get-extended-mode"></a><h3>gupnp_dlna_profile_guesser_get_extended_mode ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            gupnp_dlna_profile_guesser_get_extended_mode
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>guesser</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>guesser</code></em> is in extended mode, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-get-profile"></a><h3>gupnp_dlna_profile_guesser_get_profile ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  gupnp_dlna_profile_guesser_get_profile
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<p>
+Lookups for <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> with given <em class="parameter"><code>name</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>guesser</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>The name of the DLNA profile to be retrieved.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> object on success,
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> otherwise. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-get-relaxed-mode"></a><h3>gupnp_dlna_profile_guesser_get_relaxed_mode ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            gupnp_dlna_profile_guesser_get_relaxed_mode
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>guesser</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>guesser</code></em> is in relaxed mode, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-guess-profile-async"></a><h3>gupnp_dlna_profile_guesser_guess_profile_async ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            gupnp_dlna_profile_guesser_guess_profile_async
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> timeout_in_ms</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Asynchronously guesses DLNA profile for given <em class="parameter"><code>uri</code></em>. When guessing
+is done, ::done signal is emitted on <em class="parameter"><code>guesser</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>guesser</code></em> :</span></p></td>
+<td>
+<a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> object to use for guessing.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>URI of media.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout_in_ms</code></em> :</span></p></td>
+<td>Timeout of guessing in miliseconds.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> object or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>uri</code></em> was successfully queued, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-guess-profile-from-info"></a><h3>gupnp_dlna_profile_guesser_guess_profile_from_info ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  gupnp_dlna_profile_guesser_guess_profile_from_info
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *info</code></em>);</pre>
+<p>
+Guesses the profile which fits to passed <em class="parameter"><code>info</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>guesser</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> object on success,
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> otherwise. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-guess-profile-sync"></a><h3>gupnp_dlna_profile_guesser_guess_profile_sync ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  gupnp_dlna_profile_guesser_guess_profile_sync
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>,
+                                                         <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> timeout_in_ms</code></em>,
+                                                         <em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> **dlna_info</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Synchronously guesses DLNA profile for given <em class="parameter"><code>uri</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>guesser</code></em> :</span></p></td>
+<td>
+<a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> object to use for guessing.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>URI of media.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout_in_ms</code></em> :</span></p></td>
+<td>Timeout of guessing in miliseconds.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dlna_info</code></em> :</span></p></td>
+<td>A place where to
+store DLNA information or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> object or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>DLNA profile if any had matched, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> otherwise. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-list-profiles"></a><h3>gupnp_dlna_profile_guesser_list_profiles ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             gupnp_dlna_profile_guesser_list_profiles
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *guesser</code></em>);</pre>
+<p>
+Gets a list of the all DLNA profiles supported by <em class="parameter"><code>guesser</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>guesser</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> whose profile list is required.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a>
+of <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> on success, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> otherwise. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDLNAProfile]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-profile-guesser-new"></a><h3>gupnp_dlna_profile_guesser_new ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="returnvalue">GUPnPDLNAProfileGuesser</span></a> * gupnp_dlna_profile_guesser_new
+                                                        (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> relaxed_mode</code></em>,
+                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> extended_mode</code></em>);</pre>
+<p>
+Creates a new guesser that will use specific DLNA profiles for
+matching - i.e. which profiles will be used depends on
+<em class="parameter"><code>relaxed_mode</code></em> and <em class="parameter"><code>extended_mode</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>relaxed_mode</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to enable relaxed mode support. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>extended_mode</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to enable extended mode support. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> object.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfileGuesser.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAProfileGuesser--extended-mode"></a><h3>The <code class="literal">"extended-mode"</code> property</h3>
+<pre class="programlisting">  "extended-mode"            <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write / Construct Only</pre>
+<p>
+Whether profile matching should be done also against DLNA
+profiles not being a part of DLNA specification.
+</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAProfileGuesser--relaxed-mode"></a><h3>The <code class="literal">"relaxed-mode"</code> property</h3>
+<pre class="programlisting">  "relaxed-mode"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write / Construct Only</pre>
+<p>
+Whether profile matching should not be strictly compliant
+with the DLNA specification.
+</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAProfileGuesser.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAProfileGuesser-done"></a><h3>The <code class="literal">"done"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> *profile_guesser,
+                                                        <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a>    *info,
+                                                        <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a>        *dlna,
+                                                        <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>                  *error,
+                                                        <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>                 user_data)            : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+<p>
+Will be emitted when guessing DLNA profile for a URI has finished.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>profile_guesser</code></em> :</span></p></td>
+<td>The <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>URI metadata as <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dlna</code></em> :</span></p></td>
+<td>The results as <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>Contains details of the error if discovery failed,
+else is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data set when the signal handler was connected.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/GUPnPDLNAVideoInformation.html b/doc/gupnp-dlna/html/GUPnPDLNAVideoInformation.html
new file mode 100644 (file)
index 0000000..cf2c283
--- /dev/null
@@ -0,0 +1,438 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPDLNAVideoInformation</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation">
+<link rel="next" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="GUPnPDLNAImageInformation.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="gupnp-dlna-gupnp-dlna-restriction.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPDLNAVideoInformation.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPDLNAVideoInformation.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPDLNAVideoInformation.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPDLNAVideoInformation"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPDLNAVideoInformation.top_of_page"></a>GUPnPDLNAVideoInformation</span></h2>
+<p>GUPnPDLNAVideoInformation â€” Base class representing video metadata needed
+for DLNA profiles matching.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPDLNAVideoInformation.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation-struct" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>;
+                    <a class="link" href="GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformationClass" title="GUPnPDLNAVideoInformationClass">GUPnPDLNAVideoInformationClass</a>;
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-bitrate" title="gupnp_dlna_video_information_get_bitrate ()">gupnp_dlna_video_information_get_bitrate</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="returnvalue">GUPnPDLNAFractionValue</span></a> <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-framerate" title="gupnp_dlna_video_information_get_framerate ()">gupnp_dlna_video_information_get_framerate</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-height" title="gupnp_dlna_video_information_get_height ()">gupnp_dlna_video_information_get_height</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-level" title="gupnp_dlna_video_information_get_level ()">gupnp_dlna_video_information_get_level</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mime" title="gupnp_dlna_video_information_get_mime ()">gupnp_dlna_video_information_get_mime</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mpeg-version" title="gupnp_dlna_video_information_get_mpeg_version ()">gupnp_dlna_video_information_get_mpeg_version</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="returnvalue">GUPnPDLNAFractionValue</span></a> <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-pixel-aspect-ratio" title="gupnp_dlna_video_information_get_pixel_aspect_ratio ()">gupnp_dlna_video_information_get_pixel_aspect_ratio</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-profile" title="gupnp_dlna_video_information_get_profile ()">gupnp_dlna_video_information_get_profile</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-width" title="gupnp_dlna_video_information_get_width ()">gupnp_dlna_video_information_get_width</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="returnvalue">GUPnPDLNABoolValue</span></a>  <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-is-interlaced" title="gupnp_dlna_video_information_is_interlaced ()">gupnp_dlna_video_information_is_interlaced</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="returnvalue">GUPnPDLNABoolValue</span></a>  <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-is-system-stream" title="gupnp_dlna_video_information_is_system_stream ()">gupnp_dlna_video_information_is_system_stream</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAVideoInformation.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+   +----GUPnPDLNAVideoInformation
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAVideoInformation.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> holds all video metadatas important for
+matching profiles. Note that it does not mean all data should be
+provided for every video file as in some cases it does not make
+sense (e.g. MPEG version does not make sense for Quicktime video
+files).
+</p>
+<p>
+For metadata attributes that do not exist in current video file an
+unset value should be returned. For metadata attributes that do
+exist a set value with proper underlying value should be
+returned. In case metadata extractor has completely no clue how to
+extract some metadata attribute at all, an unsupported value should
+be returned. Note that unsupported values should be a temporary
+mean before fixing the multimedia framework to be able to extract
+such attribute.
+</p>
+<p>
+Note that <a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mime" title="gupnp_dlna_video_information_get_mime ()"><code class="function">gupnp_dlna_video_information_get_mime()</code></a> should always
+return a set value. Otherwise it is highly probably that the file
+will not match against any DLNA profile.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAVideoInformation.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAVideoInformation-struct"></a><h3>GUPnPDLNAVideoInformation</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAVideoInformation GUPnPDLNAVideoInformation;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAVideoInformationClass"></a><h3>GUPnPDLNAVideoInformationClass</h3>
+<pre class="programlisting">typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAIntValue
+        (* get_bitrate) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAFractionValue
+        (* get_framerate) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_height) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNABoolValue
+        (* is_interlaced) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_level) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_mpeg_version) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAFractionValue
+        (* get_pixel_aspect_ratio) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_profile) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNABoolValue
+        (* is_system_stream) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_width) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_mime) (GUPnPDLNAVideoInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAVideoInformationClass;
+</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObjectClass"><span class="type">GObjectClass</span></a> <em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Parent class.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-bitrate"></a>get_bitrate</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+bitrate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-framerate"></a>get_framerate</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+framerate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-height"></a>get_height</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+height.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.is-interlaced"></a>is_interlaced</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get
+whether it is interlaced.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-level"></a>get_level</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+level.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-mpeg-version"></a>get_mpeg_version</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to
+get an MPEG version.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-pixel-aspect-ratio"></a>get_pixel_aspect_ratio</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a>
+to get a pixel-aspect-ratio.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-profile"></a>get_profile</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+profile.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.is-system-stream"></a>is_system_stream</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to
+get whether it is a system stream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-width"></a>get_width</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a
+width.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.get-mime"></a>get_mime</code></em> ()</span></p></td>
+<td>This is called by <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser"><span class="type">GUPnPDLNAProfileGuesser</span></a> to get a MIME
+type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GUPnPDLNAVideoInformationClass.-reserved"></a>_reserved</code></em>[12];</span></p></td>
+<td>Padding. Ignore it.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-bitrate"></a><h3>gupnp_dlna_video_information_get_bitrate ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_video_information_get_bitrate
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A bitrate.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-framerate"></a><h3>gupnp_dlna_video_information_get_framerate ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="returnvalue">GUPnPDLNAFractionValue</span></a> gupnp_dlna_video_information_get_framerate
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A framerate.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-height"></a><h3>gupnp_dlna_video_information_get_height ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_video_information_get_height
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A height.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-level"></a><h3>gupnp_dlna_video_information_get_level ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_video_information_get_level
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A level.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-mime"></a><h3>gupnp_dlna_video_information_get_mime ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_video_information_get_mime
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A MIME type.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-mpeg-version"></a><h3>gupnp_dlna_video_information_get_mpeg_version ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_video_information_get_mpeg_version
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>An MPEG version.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-pixel-aspect-ratio"></a><h3>gupnp_dlna_video_information_get_pixel_aspect_ratio ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="returnvalue">GUPnPDLNAFractionValue</span></a> gupnp_dlna_video_information_get_pixel_aspect_ratio
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A pixel-aspect-ratio.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-profile"></a><h3>gupnp_dlna_video_information_get_profile ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="returnvalue">GUPnPDLNAStringValue</span></a> gupnp_dlna_video_information_get_profile
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A profile.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-get-width"></a><h3>gupnp_dlna_video_information_get_width ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="returnvalue">GUPnPDLNAIntValue</span></a>   gupnp_dlna_video_information_get_width
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A width.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-is-interlaced"></a><h3>gupnp_dlna_video_information_is_interlaced ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="returnvalue">GUPnPDLNABoolValue</span></a>  gupnp_dlna_video_information_is_interlaced
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Whether video is interlaced.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-video-information-is-system-stream"></a><h3>gupnp_dlna_video_information_is_system_stream ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="returnvalue">GUPnPDLNABoolValue</span></a>  gupnp_dlna_video_information_is_system_stream
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> *info</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation"><span class="type">GUPnPDLNAVideoInformation</span></a> object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Whether it is a system stream.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPDLNAVideoInformation.see-also"></a><h2>See Also</h2>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="type">GUPnPDLNABoolValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="type">GUPnPDLNAFractionValue</span></a>,
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="type">GUPnPDLNAIntValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/annotation-glossary.html b/doc/gupnp-dlna/html/annotation-glossary.html
new file mode 100644 (file)
index 0000000..7d41402
--- /dev/null
@@ -0,0 +1,59 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Annotation Glossary</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="prev" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gupnp-dlna-gupnp-dlna-g-values.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td> </td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#glsO">O</a>
+                     Â | 
+                   <a class="shortcut" href="#glsA">A</a>
+                     Â | 
+                   <a class="shortcut" href="#glsE">E</a>
+                     Â | 
+                   <a class="shortcut" href="#glsT">T</a>
+</td></tr>
+</table>
+<div class="glossary">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
+<a name="glsO"></a><h3 class="title">O</h3>
+<dt>
+<a name="annotation-glossterm-out"></a>out</dt>
+<dd><p>Parameter for returning results. Default is <acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>.</p></dd>
+<a name="glsA"></a><h3 class="title">A</h3>
+<dt>
+<a name="annotation-glossterm-allow-none"></a>allow-none</dt>
+<dd><p>NULL is ok, both for passing and for returning.</p></dd>
+<a name="glsE"></a><h3 class="title">E</h3>
+<dt>
+<a name="annotation-glossterm-element-type"></a>element-type</dt>
+<dd><p>Generics and defining elements of containers and arrays.</p></dd>
+<a name="glsT"></a><h3 class="title">T</h3>
+<dt>
+<a name="annotation-glossterm-transfer%20full"></a>transfer full</dt>
+<dd><p>Free data after the code is done.</p></dd>
+<dt>
+<a name="annotation-glossterm-transfer%20none"></a>transfer none</dt>
+<dd><p>Don't free data after the code is done.</p></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/ch01.html b/doc/gupnp-dlna/html/ch01.html
new file mode 100644 (file)
index 0000000..f4cf684
--- /dev/null
@@ -0,0 +1,575 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnP DLNA</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="prev" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="next" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td> </td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="GUPnPDLNAProfileGuesser.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts"><a class="shortcut" href="#idxD">D</a></td></tr>
+</table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="idp4453056"></a>GUPnP DLNA</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAProfileGuesser.html">GUPnPDLNAProfileGuesser</a></span><span class="refpurpose"> â€” Utility API for discovering DLNA profile for
+given media.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAProfile.html">GUPnPDLNAProfile</a></span><span class="refpurpose"> â€” Object representing a DLNA profile</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAInformation.html">GUPnPDLNAInformation</a></span><span class="refpurpose"> â€” Base class for storing various types of
+metadata informations.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gupnp-dlna-GUPnP-DLNA-Values.html">GUPnP DLNA Values</a></span><span class="refpurpose"> â€” State values for metadata attributes.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAAudioInformation.html">GUPnPDLNAAudioInformation</a></span><span class="refpurpose"> â€” Base class representing audio metadata needed
+for DLNA profiles matching.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAContainerInformation.html">GUPnPDLNAContainerInformation</a></span><span class="refpurpose"> â€” Base class representing container metadata
+needed for DLNA profiles matching.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAImageInformation.html">GUPnPDLNAImageInformation</a></span><span class="refpurpose"> â€” Base class representing image metadata needed
+for DLNA profiles matching.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAVideoInformation.html">GUPnPDLNAVideoInformation</a></span><span class="refpurpose"> â€” Base class representing video metadata needed
+for DLNA profiles matching.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gupnp-dlna-gupnp-dlna-restriction.html">gupnp-dlna-restriction</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gupnp-dlna-gupnp-dlna-value-list.html">gupnp-dlna-value-list</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gupnp-dlna-gupnp-dlna-g-values.html">gupnp-dlna-g-values</a></span><span class="refpurpose"></span>
+</dt>
+</dl></div>
+<p>
+      GUPnP DLNA is a set of utility APIs to simplify DLNA-specific bits of
+      MediaServer implementations, such as DLNA media profile guessing.
+    </p>
+<a name="idx"></a><a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation-struct" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>, struct in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformationClass" title="GUPnPDLNAAudioInformationClass">GUPnPDLNAAudioInformationClass</a>, struct in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue">GUPnPDLNABoolValue</a>, struct in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation-struct" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>, struct in <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformationClass" title="GUPnPDLNAContainerInformationClass">GUPnPDLNAContainerInformationClass</a>, struct in <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction-struct" title="GUPnPDLNAFraction">GUPnPDLNAFraction</a>, struct in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange-struct" title="GUPnPDLNAFractionRange">GUPnPDLNAFractionRange</a>, struct in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue">GUPnPDLNAFractionValue</a>, struct in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation-struct" title="GUPnPDLNAImageInformation">GUPnPDLNAImageInformation</a>, struct in <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation">GUPnPDLNAImageInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformationClass" title="GUPnPDLNAImageInformationClass">GUPnPDLNAImageInformationClass</a>, struct in <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation">GUPnPDLNAImageInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation-struct" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>, struct in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--audio-information" title='The "audio-information" property'>GUPnPDLNAInformation:audio-information</a>, object property in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--container-information" title='The "container-information" property'>GUPnPDLNAInformation:container-information</a>, object property in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--image-information" title='The "image-information" property'>GUPnPDLNAInformation:image-information</a>, object property in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--uri" title='The "uri" property'>GUPnPDLNAInformation:uri</a>, object property in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--video-information" title='The "video-information" property'>GUPnPDLNAInformation:video-information</a>, object property in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformationClass" title="GUPnPDLNAInformationClass">GUPnPDLNAInformationClass</a>, struct in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange-struct" title="GUPnPDLNAIntRange">GUPnPDLNAIntRange</a>, struct in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue">GUPnPDLNAIntValue</a>, struct in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile-struct" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>, struct in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--audio-restrictions" title='The "audio-restrictions" property'>GUPnPDLNAProfile:audio-restrictions</a>, object property in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--container-restrictions" title='The "container-restrictions" property'>GUPnPDLNAProfile:container-restrictions</a>, object property in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--extended" title='The "extended" property'>GUPnPDLNAProfile:extended</a>, object property in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--image-restrictions" title='The "image-restrictions" property'>GUPnPDLNAProfile:image-restrictions</a>, object property in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--mime" title='The "mime" property'>GUPnPDLNAProfile:mime</a>, object property in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--name" title='The "name" property'>GUPnPDLNAProfile:name</a>, object property in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--video-restrictions" title='The "video-restrictions" property'>GUPnPDLNAProfile:video-restrictions</a>, object property in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfileClass" title="GUPnPDLNAProfileClass">GUPnPDLNAProfileClass</a>, struct in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser-struct" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>, struct in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser-done" title='The "done" signal'>GUPnPDLNAProfileGuesser::done</a>, object signal in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser--extended-mode" title='The "extended-mode" property'>GUPnPDLNAProfileGuesser:extended-mode</a>, object property in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser--relaxed-mode" title='The "relaxed-mode" property'>GUPnPDLNAProfileGuesser:relaxed-mode</a>, object property in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesserClass" title="GUPnPDLNAProfileGuesserClass">GUPnPDLNAProfileGuesserClass</a>, struct in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction-struct" title="GUPnPDLNARestriction">GUPnPDLNARestriction</a>, struct in <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">gupnp-dlna-restriction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue">GUPnPDLNAStringValue</a>, struct in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList-struct" title="GUPnPDLNAValueList">GUPnPDLNAValueList</a>, struct in <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html" title="gupnp-dlna-value-list">gupnp-dlna-value-list</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAValueState" title="enum GUPnPDLNAValueState">GUPnPDLNAValueState</a>, enum in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation-struct" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>, struct in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformationClass" title="GUPnPDLNAVideoInformationClass">GUPnPDLNAVideoInformationClass</a>, struct in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-bitrate" title="gupnp_dlna_audio_information_get_bitrate ()">gupnp_dlna_audio_information_get_bitrate</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-channels" title="gupnp_dlna_audio_information_get_channels ()">gupnp_dlna_audio_information_get_channels</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-depth" title="gupnp_dlna_audio_information_get_depth ()">gupnp_dlna_audio_information_get_depth</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-layer" title="gupnp_dlna_audio_information_get_layer ()">gupnp_dlna_audio_information_get_layer</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-level" title="gupnp_dlna_audio_information_get_level ()">gupnp_dlna_audio_information_get_level</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mime" title="gupnp_dlna_audio_information_get_mime ()">gupnp_dlna_audio_information_get_mime</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mpeg-audio-version" title="gupnp_dlna_audio_information_get_mpeg_audio_version ()">gupnp_dlna_audio_information_get_mpeg_audio_version</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mpeg-version" title="gupnp_dlna_audio_information_get_mpeg_version ()">gupnp_dlna_audio_information_get_mpeg_version</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-profile" title="gupnp_dlna_audio_information_get_profile ()">gupnp_dlna_audio_information_get_profile</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-rate" title="gupnp_dlna_audio_information_get_rate ()">gupnp_dlna_audio_information_get_rate</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-stream-format" title="gupnp_dlna_audio_information_get_stream_format ()">gupnp_dlna_audio_information_get_stream_format</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-wma-version" title="gupnp_dlna_audio_information_get_wma_version ()">gupnp_dlna_audio_information_get_wma_version</a>, function in <a class="link" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">GUPnPDLNAAudioInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-BOOL-VALUE-UNSET:CAPS" title="GUPNP_DLNA_BOOL_VALUE_UNSET">GUPNP_DLNA_BOOL_VALUE_UNSET</a>, macro in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-BOOL-VALUE-UNSUPPORTED:CAPS" title="GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED">GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED</a>, macro in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mime" title="gupnp_dlna_container_information_get_mime ()">gupnp_dlna_container_information_get_mime</a>, function in <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mpeg-version" title="gupnp_dlna_container_information_get_mpeg_version ()">gupnp_dlna_container_information_get_mpeg_version</a>, function in <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-packet-size" title="gupnp_dlna_container_information_get_packet_size ()">gupnp_dlna_container_information_get_packet_size</a>, function in <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-profile" title="gupnp_dlna_container_information_get_profile ()">gupnp_dlna_container_information_get_profile</a>, function in <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-variant" title="gupnp_dlna_container_information_get_variant ()">gupnp_dlna_container_information_get_variant</a>, function in <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-is-system-stream" title="gupnp_dlna_container_information_is_system_stream ()">gupnp_dlna_container_information_is_system_stream</a>, function in <a class="link" href="GUPnPDLNAContainerInformation.html" title="GUPnPDLNAContainerInformation">GUPnPDLNAContainerInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-copy" title="gupnp_dlna_fraction_copy ()">gupnp_dlna_fraction_copy</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-free" title="gupnp_dlna_fraction_free ()">gupnp_dlna_fraction_free</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-get-denominator" title="gupnp_dlna_fraction_get_denominator ()">gupnp_dlna_fraction_get_denominator</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-get-numerator" title="gupnp_dlna_fraction_get_numerator ()">gupnp_dlna_fraction_get_numerator</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-copy" title="gupnp_dlna_fraction_range_copy ()">gupnp_dlna_fraction_range_copy</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-free" title="gupnp_dlna_fraction_range_free ()">gupnp_dlna_fraction_range_free</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-get-max" title="gupnp_dlna_fraction_range_get_max ()">gupnp_dlna_fraction_range_get_max</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-get-min" title="gupnp_dlna_fraction_range_get_min ()">gupnp_dlna_fraction_range_get_min</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-FRACTION-VALUE-UNSET:CAPS" title="GUPNP_DLNA_FRACTION_VALUE_UNSET">GUPNP_DLNA_FRACTION_VALUE_UNSET</a>, macro in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-FRACTION-VALUE-UNSUPPORTED:CAPS" title="GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED">GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED</a>, macro in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-depth" title="gupnp_dlna_image_information_get_depth ()">gupnp_dlna_image_information_get_depth</a>, function in <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation">GUPnPDLNAImageInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-height" title="gupnp_dlna_image_information_get_height ()">gupnp_dlna_image_information_get_height</a>, function in <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation">GUPnPDLNAImageInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-mime" title="gupnp_dlna_image_information_get_mime ()">gupnp_dlna_image_information_get_mime</a>, function in <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation">GUPnPDLNAImageInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-width" title="gupnp_dlna_image_information_get_width ()">gupnp_dlna_image_information_get_width</a>, function in <a class="link" href="GUPnPDLNAImageInformation.html" title="GUPnPDLNAImageInformation">GUPnPDLNAImageInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-audio-information" title="gupnp_dlna_information_get_audio_information ()">gupnp_dlna_information_get_audio_information</a>, function in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-container-information" title="gupnp_dlna_information_get_container_information ()">gupnp_dlna_information_get_container_information</a>, function in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-image-information" title="gupnp_dlna_information_get_image_information ()">gupnp_dlna_information_get_image_information</a>, function in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-uri" title="gupnp_dlna_information_get_uri ()">gupnp_dlna_information_get_uri</a>, function in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-video-information" title="gupnp_dlna_information_get_video_information ()">gupnp_dlna_information_get_video_information</a>, function in <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-copy" title="gupnp_dlna_int_range_copy ()">gupnp_dlna_int_range_copy</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-free" title="gupnp_dlna_int_range_free ()">gupnp_dlna_int_range_free</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-get-max" title="gupnp_dlna_int_range_get_max ()">gupnp_dlna_int_range_get_max</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-get-min" title="gupnp_dlna_int_range_get_min ()">gupnp_dlna_int_range_get_min</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">gupnp-dlna-g-values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-INT-VALUE-UNSET:CAPS" title="GUPNP_DLNA_INT_VALUE_UNSET">GUPNP_DLNA_INT_VALUE_UNSET</a>, macro in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-INT-VALUE-UNSUPPORTED:CAPS" title="GUPNP_DLNA_INT_VALUE_UNSUPPORTED">GUPNP_DLNA_INT_VALUE_UNSUPPORTED</a>, macro in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-audio-restrictions" title="gupnp_dlna_profile_get_audio_restrictions ()">gupnp_dlna_profile_get_audio_restrictions</a>, function in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-container-restrictions" title="gupnp_dlna_profile_get_container_restrictions ()">gupnp_dlna_profile_get_container_restrictions</a>, function in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-extended" title="gupnp_dlna_profile_get_extended ()">gupnp_dlna_profile_get_extended</a>, function in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-image-restrictions" title="gupnp_dlna_profile_get_image_restrictions ()">gupnp_dlna_profile_get_image_restrictions</a>, function in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-mime" title="gupnp_dlna_profile_get_mime ()">gupnp_dlna_profile_get_mime</a>, function in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-name" title="gupnp_dlna_profile_get_name ()">gupnp_dlna_profile_get_name</a>, function in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-video-restrictions" title="gupnp_dlna_profile_get_video_restrictions ()">gupnp_dlna_profile_get_video_restrictions</a>, function in <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-cleanup" title="gupnp_dlna_profile_guesser_cleanup ()">gupnp_dlna_profile_guesser_cleanup</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-extended-mode" title="gupnp_dlna_profile_guesser_get_extended_mode ()">gupnp_dlna_profile_guesser_get_extended_mode</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-profile" title="gupnp_dlna_profile_guesser_get_profile ()">gupnp_dlna_profile_guesser_get_profile</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-relaxed-mode" title="gupnp_dlna_profile_guesser_get_relaxed_mode ()">gupnp_dlna_profile_guesser_get_relaxed_mode</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-async" title="gupnp_dlna_profile_guesser_guess_profile_async ()">gupnp_dlna_profile_guesser_guess_profile_async</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-from-info" title="gupnp_dlna_profile_guesser_guess_profile_from_info ()">gupnp_dlna_profile_guesser_guess_profile_from_info</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-sync" title="gupnp_dlna_profile_guesser_guess_profile_sync ()">gupnp_dlna_profile_guesser_guess_profile_sync</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-list-profiles" title="gupnp_dlna_profile_guesser_list_profiles ()">gupnp_dlna_profile_guesser_list_profiles</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-new" title="gupnp_dlna_profile_guesser_new ()">gupnp_dlna_profile_guesser_new</a>, function in <a class="link" href="GUPnPDLNAProfileGuesser.html" title="GUPnPDLNAProfileGuesser">GUPnPDLNAProfileGuesser</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-copy" title="gupnp_dlna_restriction_copy ()">gupnp_dlna_restriction_copy</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">gupnp-dlna-restriction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-free" title="gupnp_dlna_restriction_free ()">gupnp_dlna_restriction_free</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">gupnp-dlna-restriction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-get-entries" title="gupnp_dlna_restriction_get_entries ()">gupnp_dlna_restriction_get_entries</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">gupnp-dlna-restriction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-get-mime" title="gupnp_dlna_restriction_get_mime ()">gupnp_dlna_restriction_get_mime</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">gupnp-dlna-restriction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-is-empty" title="gupnp_dlna_restriction_is_empty ()">gupnp_dlna_restriction_is_empty</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">gupnp-dlna-restriction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-to-string" title="gupnp_dlna_restriction_to_string ()">gupnp_dlna_restriction_to_string</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">gupnp-dlna-restriction</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-STRING-VALUE-UNSET:CAPS" title="GUPNP_DLNA_STRING_VALUE_UNSET">GUPNP_DLNA_STRING_VALUE_UNSET</a>, macro in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-STRING-VALUE-UNSUPPORTED:CAPS" title="GUPNP_DLNA_STRING_VALUE_UNSUPPORTED">GUPNP_DLNA_STRING_VALUE_UNSUPPORTED</a>, macro in <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html" title="GUPnP DLNA Values">GUPnP DLNA Values</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-copy" title="gupnp_dlna_value_list_copy ()">gupnp_dlna_value_list_copy</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html" title="gupnp-dlna-value-list">gupnp-dlna-value-list</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-free" title="gupnp_dlna_value_list_free ()">gupnp_dlna_value_list_free</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html" title="gupnp-dlna-value-list">gupnp-dlna-value-list</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-get-g-values" title="gupnp_dlna_value_list_get_g_values ()">gupnp_dlna_value_list_get_g_values</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html" title="gupnp-dlna-value-list">gupnp-dlna-value-list</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-is-empty" title="gupnp_dlna_value_list_is_empty ()">gupnp_dlna_value_list_is_empty</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html" title="gupnp-dlna-value-list">gupnp-dlna-value-list</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-to-string" title="gupnp_dlna_value_list_to_string ()">gupnp_dlna_value_list_to_string</a>, function in <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html" title="gupnp-dlna-value-list">gupnp-dlna-value-list</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-bitrate" title="gupnp_dlna_video_information_get_bitrate ()">gupnp_dlna_video_information_get_bitrate</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-framerate" title="gupnp_dlna_video_information_get_framerate ()">gupnp_dlna_video_information_get_framerate</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-height" title="gupnp_dlna_video_information_get_height ()">gupnp_dlna_video_information_get_height</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-level" title="gupnp_dlna_video_information_get_level ()">gupnp_dlna_video_information_get_level</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mime" title="gupnp_dlna_video_information_get_mime ()">gupnp_dlna_video_information_get_mime</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mpeg-version" title="gupnp_dlna_video_information_get_mpeg_version ()">gupnp_dlna_video_information_get_mpeg_version</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-pixel-aspect-ratio" title="gupnp_dlna_video_information_get_pixel_aspect_ratio ()">gupnp_dlna_video_information_get_pixel_aspect_ratio</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-profile" title="gupnp_dlna_video_information_get_profile ()">gupnp_dlna_video_information_get_profile</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-width" title="gupnp_dlna_video_information_get_width ()">gupnp_dlna_video_information_get_width</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-is-interlaced" title="gupnp_dlna_video_information_is_interlaced ()">gupnp_dlna_video_information_is_interlaced</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-is-system-stream" title="gupnp_dlna_video_information_is_system_stream ()">gupnp_dlna_video_information_is_system_stream</a>, function in <a class="link" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">GUPnPDLNAVideoInformation</a>
+</dt>
+<dd></dd>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/gupnp-dlna-GUPnP-DLNA-Values.html b/doc/gupnp-dlna/html/gupnp-dlna-GUPnP-DLNA-Values.html
new file mode 100644 (file)
index 0000000..ab495ec
--- /dev/null
@@ -0,0 +1,436 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnP DLNA Values</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">
+<link rel="next" href="GUPnPDLNAAudioInformation.html" title="GUPnPDLNAAudioInformation">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="GUPnPDLNAInformation.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="GUPnPDLNAAudioInformation.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gupnp-dlna-GUPnP-DLNA-Values.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#gupnp-dlna-GUPnP-DLNA-Values.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gupnp-dlna-GUPnP-DLNA-Values"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gupnp-dlna-GUPnP-DLNA-Values.top_of_page"></a>GUPnP DLNA Values</span></h2>
+<p>GUPnP DLNA Values â€” State values for metadata attributes.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gupnp-dlna-GUPnP-DLNA-Values.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">#define             <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-BOOL-VALUE-UNSET:CAPS" title="GUPNP_DLNA_BOOL_VALUE_UNSET">GUPNP_DLNA_BOOL_VALUE_UNSET</a>
+#define             <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-BOOL-VALUE-UNSUPPORTED:CAPS" title="GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED">GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED</a>
+#define             <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-FRACTION-VALUE-UNSET:CAPS" title="GUPNP_DLNA_FRACTION_VALUE_UNSET">GUPNP_DLNA_FRACTION_VALUE_UNSET</a>
+#define             <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-FRACTION-VALUE-UNSUPPORTED:CAPS" title="GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED">GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED</a>
+#define             <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-INT-VALUE-UNSET:CAPS" title="GUPNP_DLNA_INT_VALUE_UNSET">GUPNP_DLNA_INT_VALUE_UNSET</a>
+#define             <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-INT-VALUE-UNSUPPORTED:CAPS" title="GUPNP_DLNA_INT_VALUE_UNSUPPORTED">GUPNP_DLNA_INT_VALUE_UNSUPPORTED</a>
+#define             <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-STRING-VALUE-UNSET:CAPS" title="GUPNP_DLNA_STRING_VALUE_UNSET">GUPNP_DLNA_STRING_VALUE_UNSET</a>
+#define             <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-STRING-VALUE-UNSUPPORTED:CAPS" title="GUPNP_DLNA_STRING_VALUE_UNSUPPORTED">GUPNP_DLNA_STRING_VALUE_UNSUPPORTED</a>
+                    <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue">GUPnPDLNABoolValue</a>;
+                    <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue">GUPnPDLNAFractionValue</a>;
+                    <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue">GUPnPDLNAIntValue</a>;
+                    <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue">GUPnPDLNAStringValue</a>;
+enum                <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAValueState" title="enum GUPnPDLNAValueState">GUPnPDLNAValueState</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-GUPnP-DLNA-Values.description"></a><h2>Description</h2>
+<p>
+The <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="type">GUPnPDLNABoolValue</span></a>, <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="type">GUPnPDLNAFractionValue</span></a>,
+<a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="type">GUPnPDLNAIntValue</span></a> and <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a> hold respectively
+boolean, fraction, integer and string values.
+</p>
+<p>
+The value can be in one of three possible states - set, unset or
+unsupported. When value is in set state it is possible to use the
+underlying value it holds. In other states using such value is
+undefined.
+</p>
+<p>
+Main difference between unset state and unsupported state is that
+the former is set when metadata extractor is capable of extracting
+some attribute in general, but current media file does not have
+such attribute, while the latter means that metadata extractor has
+no idea how to extract such attribute at all.
+</p>
+<p>
+One note on <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a> - it holds a string that has to
+be allocated with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-malloc"><code class="function">g_malloc()</code></a> (that is - <a href="http://library.gnome.org/devel/glib/unstable/glib-String-Utility-Functions.html#g-strdup"><code class="function">g_strdup()</code></a> and others are
+fine as well as they use <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-malloc"><code class="function">g_malloc()</code></a> internally). The string is
+freed by consumer.
+</p>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-GUPnP-DLNA-Values.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPNP-DLNA-BOOL-VALUE-UNSET:CAPS"></a><h3>GUPNP_DLNA_BOOL_VALUE_UNSET</h3>
+<pre class="programlisting">#define             GUPNP_DLNA_BOOL_VALUE_UNSET</pre>
+<p>
+Static initializer for unset <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="type">GUPnPDLNABoolValue</span></a>. Can be used in
+two ways:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSET;
+</pre></div>
+<p>
+</p>
+<p>
+or
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  return GUPNP_DLNA_BOOL_VALUE_UNSET;
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPNP-DLNA-BOOL-VALUE-UNSUPPORTED:CAPS"></a><h3>GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED</h3>
+<pre class="programlisting">#define             GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED</pre>
+<p>
+Static initializer for unsupported <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="type">GUPnPDLNABoolValue</span></a>. Can be used
+in two ways:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED;
+</pre></div>
+<p>
+</p>
+<p>
+or
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  return GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED;
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPNP-DLNA-FRACTION-VALUE-UNSET:CAPS"></a><h3>GUPNP_DLNA_FRACTION_VALUE_UNSET</h3>
+<pre class="programlisting">#define             GUPNP_DLNA_FRACTION_VALUE_UNSET</pre>
+<p>
+Static initializer for unset <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="type">GUPnPDLNAFractionValue</span></a>. Can be used
+in two ways:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+</pre></div>
+<p>
+</p>
+<p>
+or
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  return GUPNP_DLNA_FRACTION_VALUE_UNSET;
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPNP-DLNA-FRACTION-VALUE-UNSUPPORTED:CAPS"></a><h3>GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED</h3>
+<pre class="programlisting">#define             GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED</pre>
+<p>
+Static initializer for unsupported <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="type">GUPnPDLNAFractionValue</span></a>. Can be
+used in two ways:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED;
+</pre></div>
+<p>
+</p>
+<p>
+or
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  return GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED;
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPNP-DLNA-INT-VALUE-UNSET:CAPS"></a><h3>GUPNP_DLNA_INT_VALUE_UNSET</h3>
+<pre class="programlisting">#define             GUPNP_DLNA_INT_VALUE_UNSET</pre>
+<p>
+Static initializer for unset <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="type">GUPnPDLNAIntValue</span></a>. Can be used in
+two ways:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+</pre></div>
+<p>
+</p>
+<p>
+or
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  return GUPNP_DLNA_INT_VALUE_UNSET;
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPNP-DLNA-INT-VALUE-UNSUPPORTED:CAPS"></a><h3>GUPNP_DLNA_INT_VALUE_UNSUPPORTED</h3>
+<pre class="programlisting">#define             GUPNP_DLNA_INT_VALUE_UNSUPPORTED</pre>
+<p>
+Static initializer for unsupported <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="type">GUPnPDLNAIntValue</span></a>. Can be used in
+two ways:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSUPPORTED;
+</pre></div>
+<p>
+</p>
+<p>
+or
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  return GUPNP_DLNA_INT_VALUE_UNSUPPORTED;
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPNP-DLNA-STRING-VALUE-UNSET:CAPS"></a><h3>GUPNP_DLNA_STRING_VALUE_UNSET</h3>
+<pre class="programlisting">#define             GUPNP_DLNA_STRING_VALUE_UNSET</pre>
+<p>
+Static initializer for unset <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a>. Can be used in
+two ways:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+</pre></div>
+<p>
+</p>
+<p>
+or
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  return GUPNP_DLNA_STRING_VALUE_UNSET;
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPNP-DLNA-STRING-VALUE-UNSUPPORTED:CAPS"></a><h3>GUPNP_DLNA_STRING_VALUE_UNSUPPORTED</h3>
+<pre class="programlisting">#define             GUPNP_DLNA_STRING_VALUE_UNSUPPORTED</pre>
+<p>
+Static initializer for unsupported <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a>. Can be
+used in two ways:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSUPPORTED;
+</pre></div>
+<p>
+</p>
+<p>
+or
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+  return GUPNP_DLNA_STRING_VALUE_UNSUPPORTED;
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNABoolValue"></a><h3>GUPnPDLNABoolValue</h3>
+<pre class="programlisting">typedef struct {
+        gboolean            value;
+        GUPnPDLNAValueState state;
+} GUPnPDLNABoolValue;
+</pre>
+<p>
+GUPnP DLNA Value representing a boolean value of some metadata attribute.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> <em class="structfield"><code><a name="GUPnPDLNABoolValue.value"></a>value</code></em>;</span></p></td>
+<td>The boolean value.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAValueState" title="enum GUPnPDLNAValueState"><span class="type">GUPnPDLNAValueState</span></a> <em class="structfield"><code><a name="GUPnPDLNABoolValue.state"></a>state</code></em>;</span></p></td>
+<td>The state of <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue" title="GUPnPDLNABoolValue"><span class="type">GUPnPDLNABoolValue</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAFractionValue"></a><h3>GUPnPDLNAFractionValue</h3>
+<pre class="programlisting">typedef struct {
+        gint                numerator;
+        gint                denominator;
+        GUPnPDLNAValueState state;
+} GUPnPDLNAFractionValue;
+</pre>
+<p>
+GUPnP DLNA Value representing a fraction value of some metadata attribute.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GUPnPDLNAFractionValue.numerator"></a>numerator</code></em>;</span></p></td>
+<td>The numerator of fraction.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GUPnPDLNAFractionValue.denominator"></a>denominator</code></em>;</span></p></td>
+<td>The denominator of fraction.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAValueState" title="enum GUPnPDLNAValueState"><span class="type">GUPnPDLNAValueState</span></a> <em class="structfield"><code><a name="GUPnPDLNAFractionValue.state"></a>state</code></em>;</span></p></td>
+<td>The state of <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue" title="GUPnPDLNAFractionValue"><span class="type">GUPnPDLNAFractionValue</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAIntValue"></a><h3>GUPnPDLNAIntValue</h3>
+<pre class="programlisting">typedef struct {
+        gint                value;
+        GUPnPDLNAValueState state;
+} GUPnPDLNAIntValue;
+</pre>
+<p>
+GUPnP DLNA Value representing an integer value of some metadata attribute.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> <em class="structfield"><code><a name="GUPnPDLNAIntValue.value"></a>value</code></em>;</span></p></td>
+<td>The integer value.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAValueState" title="enum GUPnPDLNAValueState"><span class="type">GUPnPDLNAValueState</span></a> <em class="structfield"><code><a name="GUPnPDLNAIntValue.state"></a>state</code></em>;</span></p></td>
+<td>The state of <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue" title="GUPnPDLNAIntValue"><span class="type">GUPnPDLNAIntValue</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAStringValue"></a><h3>GUPnPDLNAStringValue</h3>
+<pre class="programlisting">typedef struct {
+        gchar               *value;
+        GUPnPDLNAValueState  state;
+} GUPnPDLNAStringValue;
+</pre>
+<p>
+GUPnP DLNA Value representing a string value of some metadata
+attribute.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GUPnPDLNAStringValue.value"></a>value</code></em>;</span></p></td>
+<td>The string value.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAValueState" title="enum GUPnPDLNAValueState"><span class="type">GUPnPDLNAValueState</span></a> <em class="structfield"><code><a name="GUPnPDLNAStringValue.state"></a>state</code></em>;</span></p></td>
+<td>The state of <a class="link" href="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue" title="GUPnPDLNAStringValue"><span class="type">GUPnPDLNAStringValue</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAValueState"></a><h3>enum GUPnPDLNAValueState</h3>
+<pre class="programlisting">typedef enum {
+        GUPNP_DLNA_VALUE_STATE_SET,
+        GUPNP_DLNA_VALUE_STATE_UNSET,
+        GUPNP_DLNA_VALUE_STATE_UNSUPPORTED
+} GUPnPDLNAValueState;
+</pre>
+<p>
+Flags describing a state of GUPnP DLNA Value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GUPNP-DLNA-VALUE-STATE-SET:CAPS"></a><span class="term"><code class="literal">GUPNP_DLNA_VALUE_STATE_SET</code></span></p></td>
+<td>Value is set.
+</td>
+</tr>
+<tr>
+<td><p><a name="GUPNP-DLNA-VALUE-STATE-UNSET:CAPS"></a><span class="term"><code class="literal">GUPNP_DLNA_VALUE_STATE_UNSET</code></span></p></td>
+<td>Value is unset.
+</td>
+</tr>
+<tr>
+<td><p><a name="GUPNP-DLNA-VALUE-STATE-UNSUPPORTED:CAPS"></a><span class="term"><code class="literal">GUPNP_DLNA_VALUE_STATE_UNSUPPORTED</code></span></p></td>
+<td>Value is unsupported.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-g-values.html b/doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-g-values.html
new file mode 100644 (file)
index 0000000..9f5eab9
--- /dev/null
@@ -0,0 +1,316 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gupnp-dlna-g-values</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="gupnp-dlna-gupnp-dlna-value-list.html" title="gupnp-dlna-value-list">
+<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gupnp-dlna-gupnp-dlna-value-list.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gupnp-dlna-gupnp-dlna-g-values.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#gupnp-dlna-gupnp-dlna-g-values.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#gupnp-dlna-gupnp-dlna-g-values.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gupnp-dlna-gupnp-dlna-g-values"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gupnp-dlna-gupnp-dlna-g-values.top_of_page"></a>gupnp-dlna-g-values</span></h2>
+<p>gupnp-dlna-g-values</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gupnp-dlna-gupnp-dlna-g-values.synopsis"></a><h2>Synopsis</h2>
+<a name="GUPnPDLNAFraction"></a><a name="GUPnPDLNAFractionRange"></a><a name="GUPnPDLNAIntRange"></a><pre class="synopsis">                    <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction-struct" title="GUPnPDLNAFraction">GUPnPDLNAFraction</a>;
+                    <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange-struct" title="GUPnPDLNAFractionRange">GUPnPDLNAFractionRange</a>;
+                    <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange-struct" title="GUPnPDLNAIntRange">GUPnPDLNAIntRange</a>;
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="returnvalue">GUPnPDLNAFraction</span></a> * <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-copy" title="gupnp_dlna_fraction_copy ()">gupnp_dlna_fraction_copy</a>            (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="type">GUPnPDLNAFraction</span></a> *fraction</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-free" title="gupnp_dlna_fraction_free ()">gupnp_dlna_fraction_free</a>            (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="type">GUPnPDLNAFraction</span></a> *fraction</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-get-denominator" title="gupnp_dlna_fraction_get_denominator ()">gupnp_dlna_fraction_get_denominator</a> (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="type">GUPnPDLNAFraction</span></a> *fraction</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-get-numerator" title="gupnp_dlna_fraction_get_numerator ()">gupnp_dlna_fraction_get_numerator</a>   (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="type">GUPnPDLNAFraction</span></a> *fraction</code></em>);
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="returnvalue">GUPnPDLNAFractionRange</span></a> * <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-copy" title="gupnp_dlna_fraction_range_copy ()">gupnp_dlna_fraction_range_copy</a> (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="type">GUPnPDLNAFractionRange</span></a> *range</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-free" title="gupnp_dlna_fraction_range_free ()">gupnp_dlna_fraction_range_free</a>      (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="type">GUPnPDLNAFractionRange</span></a> *range</code></em>);
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="returnvalue">GUPnPDLNAFraction</span></a> * <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-get-max" title="gupnp_dlna_fraction_range_get_max ()">gupnp_dlna_fraction_range_get_max</a>   (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="type">GUPnPDLNAFractionRange</span></a> *range</code></em>);
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="returnvalue">GUPnPDLNAFraction</span></a> * <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-get-min" title="gupnp_dlna_fraction_range_get_min ()">gupnp_dlna_fraction_range_get_min</a>   (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="type">GUPnPDLNAFractionRange</span></a> *range</code></em>);
+<a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="returnvalue">GUPnPDLNAIntRange</span></a> * <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-copy" title="gupnp_dlna_int_range_copy ()">gupnp_dlna_int_range_copy</a>           (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="type">GUPnPDLNAIntRange</span></a> *range</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-free" title="gupnp_dlna_int_range_free ()">gupnp_dlna_int_range_free</a>           (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="type">GUPnPDLNAIntRange</span></a> *range</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-get-max" title="gupnp_dlna_int_range_get_max ()">gupnp_dlna_int_range_get_max</a>        (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="type">GUPnPDLNAIntRange</span></a> *range</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-get-min" title="gupnp_dlna_int_range_get_min ()">gupnp_dlna_int_range_get_min</a>        (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="type">GUPnPDLNAIntRange</span></a> *range</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-g-values.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  GBoxed
+   +----GUPnPDLNAFraction
+</pre>
+<pre class="synopsis">
+  GBoxed
+   +----GUPnPDLNAFractionRange
+</pre>
+<pre class="synopsis">
+  GBoxed
+   +----GUPnPDLNAIntRange
+</pre>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-g-values.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-g-values.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAFraction-struct"></a><h3>GUPnPDLNAFraction</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAFraction GUPnPDLNAFraction;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAFractionRange-struct"></a><h3>GUPnPDLNAFractionRange</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAFractionRange GUPnPDLNAFractionRange;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDLNAIntRange-struct"></a><h3>GUPnPDLNAIntRange</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAIntRange GUPnPDLNAIntRange;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-fraction-copy"></a><h3>gupnp_dlna_fraction_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="returnvalue">GUPnPDLNAFraction</span></a> * gupnp_dlna_fraction_copy            (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="type">GUPnPDLNAFraction</span></a> *fraction</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fraction</code></em> :</span></p></td>
+<td>A fraction to copy. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A copy of <em class="parameter"><code>fraction</code></em>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-fraction-free"></a><h3>gupnp_dlna_fraction_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                gupnp_dlna_fraction_free            (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="type">GUPnPDLNAFraction</span></a> *fraction</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>fraction</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>fraction</code></em> :</span></p></td>
+<td>A fraction to free.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-fraction-get-denominator"></a><h3>gupnp_dlna_fraction_get_denominator ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                gupnp_dlna_fraction_get_denominator (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="type">GUPnPDLNAFraction</span></a> *fraction</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fraction</code></em> :</span></p></td>
+<td>A fraction.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>fraction</code></em>'s denominator.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-fraction-get-numerator"></a><h3>gupnp_dlna_fraction_get_numerator ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                gupnp_dlna_fraction_get_numerator   (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="type">GUPnPDLNAFraction</span></a> *fraction</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fraction</code></em> :</span></p></td>
+<td>A fraction.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>fraction</code></em>'s numerator.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-fraction-range-copy"></a><h3>gupnp_dlna_fraction_range_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="returnvalue">GUPnPDLNAFractionRange</span></a> * gupnp_dlna_fraction_range_copy (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="type">GUPnPDLNAFractionRange</span></a> *range</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>A range to copy. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A copy of <em class="parameter"><code>range</code></em>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-fraction-range-free"></a><h3>gupnp_dlna_fraction_range_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                gupnp_dlna_fraction_range_free      (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="type">GUPnPDLNAFractionRange</span></a> *range</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>range</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>A range to free.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-fraction-range-get-max"></a><h3>gupnp_dlna_fraction_range_get_max ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="returnvalue">GUPnPDLNAFraction</span></a> * gupnp_dlna_fraction_range_get_max   (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="type">GUPnPDLNAFractionRange</span></a> *range</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>A range.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Maximum value of <em class="parameter"><code>range</code></em>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-fraction-range-get-min"></a><h3>gupnp_dlna_fraction_range_get_min ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction"><span class="returnvalue">GUPnPDLNAFraction</span></a> * gupnp_dlna_fraction_range_get_min   (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange"><span class="type">GUPnPDLNAFractionRange</span></a> *range</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>A range.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Minimum value of <em class="parameter"><code>range</code></em>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-int-range-copy"></a><h3>gupnp_dlna_int_range_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="returnvalue">GUPnPDLNAIntRange</span></a> * gupnp_dlna_int_range_copy           (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="type">GUPnPDLNAIntRange</span></a> *range</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>A range to copy. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A copy of <em class="parameter"><code>range</code></em>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-int-range-free"></a><h3>gupnp_dlna_int_range_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                gupnp_dlna_int_range_free           (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="type">GUPnPDLNAIntRange</span></a> *range</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>range</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>A range to free.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-int-range-get-max"></a><h3>gupnp_dlna_int_range_get_max ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                gupnp_dlna_int_range_get_max        (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="type">GUPnPDLNAIntRange</span></a> *range</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>A range.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Maximum value of <em class="parameter"><code>range</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-int-range-get-min"></a><h3>gupnp_dlna_int_range_get_min ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                gupnp_dlna_int_range_get_min        (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange"><span class="type">GUPnPDLNAIntRange</span></a> *range</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>range</code></em> :</span></p></td>
+<td>A range.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Minimum value of <em class="parameter"><code>range</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-restriction.html b/doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-restriction.html
new file mode 100644 (file)
index 0000000..2af80e9
--- /dev/null
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gupnp-dlna-restriction</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="GUPnPDLNAVideoInformation.html" title="GUPnPDLNAVideoInformation">
+<link rel="next" href="gupnp-dlna-gupnp-dlna-value-list.html" title="gupnp-dlna-value-list">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="GUPnPDLNAVideoInformation.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="gupnp-dlna-gupnp-dlna-value-list.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gupnp-dlna-gupnp-dlna-restriction.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#gupnp-dlna-gupnp-dlna-restriction.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#gupnp-dlna-gupnp-dlna-restriction.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gupnp-dlna-gupnp-dlna-restriction"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gupnp-dlna-gupnp-dlna-restriction.top_of_page"></a>gupnp-dlna-restriction</span></h2>
+<p>gupnp-dlna-restriction</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gupnp-dlna-gupnp-dlna-restriction.synopsis"></a><h2>Synopsis</h2>
+<a name="GUPnPDLNARestriction"></a><pre class="synopsis">                    <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction-struct" title="GUPnPDLNARestriction">GUPnPDLNARestriction</a>;
+<a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="returnvalue">GUPnPDLNARestriction</span></a> * <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-copy" title="gupnp_dlna_restriction_copy ()">gupnp_dlna_restriction_copy</a>      (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-free" title="gupnp_dlna_restriction_free ()">gupnp_dlna_restriction_free</a>         (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Hash-Tables.html#GHashTable"><span class="returnvalue">GHashTable</span></a> *        <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-get-entries" title="gupnp_dlna_restriction_get_entries ()">gupnp_dlna_restriction_get_entries</a>  (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-get-mime" title="gupnp_dlna_restriction_get_mime ()">gupnp_dlna_restriction_get_mime</a>     (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-is-empty" title="gupnp_dlna_restriction_is_empty ()">gupnp_dlna_restriction_is_empty</a>     (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-to-string" title="gupnp_dlna_restriction_to_string ()">gupnp_dlna_restriction_to_string</a>    (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-restriction.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  GBoxed
+   +----GUPnPDLNARestriction
+</pre>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-restriction.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-restriction.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNARestriction-struct"></a><h3>GUPnPDLNARestriction</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNARestriction GUPnPDLNARestriction;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-restriction-copy"></a><h3>gupnp_dlna_restriction_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="returnvalue">GUPnPDLNARestriction</span></a> * gupnp_dlna_restriction_copy      (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>A restriction to copy. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A copy of <em class="parameter"><code>restriction</code></em>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-restriction-free"></a><h3>gupnp_dlna_restriction_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                gupnp_dlna_restriction_free         (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>restriction</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>A restriction to free.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-restriction-get-entries"></a><h3>gupnp_dlna_restriction_get_entries ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Hash-Tables.html#GHashTable"><span class="returnvalue">GHashTable</span></a> *        gupnp_dlna_restriction_get_entries  (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);</pre>
+<p>
+Gets <em class="parameter"><code>restriction</code></em>'s entries. It is a string to <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a>
+mapping.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>A restriction. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Entries. Do not modify. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8 GUPnPDLNAValueList]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-restriction-get-mime"></a><h3>gupnp_dlna_restriction_get_mime ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *       gupnp_dlna_restriction_get_mime     (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);</pre>
+<p>
+Gets <em class="parameter"><code>restriction</code></em>'s MIME type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>A restriction. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>MIME type. Do not modify. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-restriction-is-empty"></a><h3>gupnp_dlna_restriction_is_empty ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            gupnp_dlna_restriction_is_empty     (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>A restriction. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>restriction</code></em> is empty and has no MIME type,
+otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-restriction-to-string"></a><h3>gupnp_dlna_restriction_to_string ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             gupnp_dlna_restriction_to_string    (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction"><span class="type">GUPnPDLNARestriction</span></a> *restriction</code></em>);</pre>
+<p>
+Creates a string representation of <em class="parameter"><code>restriction</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>restriction</code></em> :</span></p></td>
+<td>A restriction. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A string representation of
+<em class="parameter"><code>restriction</code></em>. Free with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-value-list.html b/doc/gupnp-dlna/html/gupnp-dlna-gupnp-dlna-value-list.html
new file mode 100644 (file)
index 0000000..3e3cf5d
--- /dev/null
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gupnp-dlna-value-list</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP DLNA">
+<link rel="prev" href="gupnp-dlna-gupnp-dlna-restriction.html" title="gupnp-dlna-restriction">
+<link rel="next" href="gupnp-dlna-gupnp-dlna-g-values.html" title="gupnp-dlna-g-values">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="gupnp-dlna-gupnp-dlna-restriction.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
+<td><a accesskey="n" href="gupnp-dlna-gupnp-dlna-g-values.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gupnp-dlna-gupnp-dlna-value-list.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#gupnp-dlna-gupnp-dlna-value-list.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#gupnp-dlna-gupnp-dlna-value-list.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gupnp-dlna-gupnp-dlna-value-list"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gupnp-dlna-gupnp-dlna-value-list.top_of_page"></a>gupnp-dlna-value-list</span></h2>
+<p>gupnp-dlna-value-list</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gupnp-dlna-gupnp-dlna-value-list.synopsis"></a><h2>Synopsis</h2>
+<a name="GUPnPDLNAValueList"></a><pre class="synopsis">                    <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList-struct" title="GUPnPDLNAValueList">GUPnPDLNAValueList</a>;
+<a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="returnvalue">GUPnPDLNAValueList</span></a> * <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-copy" title="gupnp_dlna_value_list_copy ()">gupnp_dlna_value_list_copy</a>         (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);
+<span class="returnvalue">void</span>                <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-free" title="gupnp_dlna_value_list_free ()">gupnp_dlna_value_list_free</a>          (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-get-g-values" title="gupnp_dlna_value_list_get_g_values ()">gupnp_dlna_value_list_get_g_values</a>  (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-is-empty" title="gupnp_dlna_value_list_is_empty ()">gupnp_dlna_value_list_is_empty</a>      (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             <a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-to-string" title="gupnp_dlna_value_list_to_string ()">gupnp_dlna_value_list_to_string</a>     (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-value-list.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  GBoxed
+   +----GUPnPDLNAValueList
+</pre>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-value-list.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gupnp-dlna-gupnp-dlna-value-list.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPDLNAValueList-struct"></a><h3>GUPnPDLNAValueList</h3>
+<pre class="programlisting">typedef struct _GUPnPDLNAValueList GUPnPDLNAValueList;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-value-list-copy"></a><h3>gupnp_dlna_value_list_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="returnvalue">GUPnPDLNAValueList</span></a> * gupnp_dlna_value_list_copy         (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list to copy. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A copy of <em class="parameter"><code>list</code></em>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-value-list-free"></a><h3>gupnp_dlna_value_list_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>                gupnp_dlna_value_list_free          (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);</pre>
+<p>
+Frees the value list.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list to free.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-value-list-get-g-values"></a><h3>gupnp_dlna_value_list_get_g_values ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *             gupnp_dlna_value_list_get_g_values  (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);</pre>
+<p>
+Gets a list of <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValues</span></a>. <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValues</span></a> can be of types <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#G-TYPE-BOOLEAN:CAPS"><span class="type">G_TYPE_BOOLEAN</span></a>,
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#G-TYPE-INT:CAPS"><span class="type">G_TYPE_INT</span></a>, <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#G-TYPE-STRING:CAPS"><span class="type">G_TYPE_STRING</span></a>, <span class="type">GUPNP_TYPE_DLNA_FRACTION</span>,
+<span class="type">GUPNP_TYPE_DLNA_FRACTION_RANGE</span> or <span class="type">GUPNP_TYPE_DLNA_INT_RANGE</span>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A list. Free it
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#g-list-free-full"><code class="function">g_list_free_full()</code></a> with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GValue]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-value-list-is-empty"></a><h3>gupnp_dlna_value_list_is_empty ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            gupnp_dlna_value_list_is_empty      (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);</pre>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>list</code></em> is empty, otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-dlna-value-list-to-string"></a><h3>gupnp_dlna_value_list_to_string ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *             gupnp_dlna_value_list_to_string     (<em class="parameter"><code><a class="link" href="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList"><span class="type">GUPnPDLNAValueList</span></a> *list</code></em>);</pre>
+<p>
+Creates a string representation of <em class="parameter"><code>list</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>A list. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A string representation of <em class="parameter"><code>list</code></em>. Free
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when not needed. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/gupnp-dlna.devhelp2 b/doc/gupnp-dlna/html/gupnp-dlna.devhelp2
new file mode 100644 (file)
index 0000000..d65c020
--- /dev/null
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
+<book xmlns="http://www.devhelp.net/book" title="GUPnP DLNA Reference Manual" link="index.html" author="" name="gupnp-dlna" version="2" language="c">
+  <chapters>
+    <sub name="GUPnP DLNA" link="ch01.html">
+      <sub name="GUPnPDLNAProfileGuesser" link="GUPnPDLNAProfileGuesser.html"/>
+      <sub name="GUPnPDLNAProfile" link="GUPnPDLNAProfile.html"/>
+      <sub name="GUPnPDLNAInformation" link="GUPnPDLNAInformation.html"/>
+      <sub name="GUPnP DLNA Values" link="gupnp-dlna-GUPnP-DLNA-Values.html"/>
+      <sub name="GUPnPDLNAAudioInformation" link="GUPnPDLNAAudioInformation.html"/>
+      <sub name="GUPnPDLNAContainerInformation" link="GUPnPDLNAContainerInformation.html"/>
+      <sub name="GUPnPDLNAImageInformation" link="GUPnPDLNAImageInformation.html"/>
+      <sub name="GUPnPDLNAVideoInformation" link="GUPnPDLNAVideoInformation.html"/>
+      <sub name="gupnp-dlna-restriction" link="gupnp-dlna-gupnp-dlna-restriction.html"/>
+      <sub name="gupnp-dlna-value-list" link="gupnp-dlna-gupnp-dlna-value-list.html"/>
+      <sub name="gupnp-dlna-g-values" link="gupnp-dlna-gupnp-dlna-g-values.html"/>
+    </sub>
+    <sub name="Annotation Glossary" link="annotation-glossary.html"/>
+  </chapters>
+  <functions>
+    <keyword type="struct" name="GUPnPDLNAProfileGuesser" link="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser-struct"/>
+    <keyword type="struct" name="GUPnPDLNAProfileGuesserClass" link="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesserClass"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_cleanup ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-cleanup"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_get_extended_mode ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-extended-mode"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_get_profile ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-profile"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_get_relaxed_mode ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-relaxed-mode"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_guess_profile_async ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-async"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_guess_profile_from_info ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-from-info"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_guess_profile_sync ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-sync"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_list_profiles ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-list-profiles"/>
+    <keyword type="function" name="gupnp_dlna_profile_guesser_new ()" link="GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-new"/>
+    <keyword type="property" name="The &quot;extended-mode&quot; property" link="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser--extended-mode"/>
+    <keyword type="property" name="The &quot;relaxed-mode&quot; property" link="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser--relaxed-mode"/>
+    <keyword type="signal" name="The &quot;done&quot; signal" link="GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser-done"/>
+    <keyword type="struct" name="GUPnPDLNAProfile" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile-struct"/>
+    <keyword type="struct" name="GUPnPDLNAProfileClass" link="GUPnPDLNAProfile.html#GUPnPDLNAProfileClass"/>
+    <keyword type="function" name="gupnp_dlna_profile_get_audio_restrictions ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-audio-restrictions"/>
+    <keyword type="function" name="gupnp_dlna_profile_get_container_restrictions ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-container-restrictions"/>
+    <keyword type="function" name="gupnp_dlna_profile_get_extended ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-extended"/>
+    <keyword type="function" name="gupnp_dlna_profile_get_image_restrictions ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-image-restrictions"/>
+    <keyword type="function" name="gupnp_dlna_profile_get_mime ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-mime"/>
+    <keyword type="function" name="gupnp_dlna_profile_get_name ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-name"/>
+    <keyword type="function" name="gupnp_dlna_profile_get_video_restrictions ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-video-restrictions"/>
+    <keyword type="property" name="The &quot;audio-restrictions&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--audio-restrictions"/>
+    <keyword type="property" name="The &quot;container-restrictions&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--container-restrictions"/>
+    <keyword type="property" name="The &quot;extended&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--extended"/>
+    <keyword type="property" name="The &quot;image-restrictions&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--image-restrictions"/>
+    <keyword type="property" name="The &quot;mime&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--mime"/>
+    <keyword type="property" name="The &quot;name&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--name"/>
+    <keyword type="property" name="The &quot;video-restrictions&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--video-restrictions"/>
+    <keyword type="struct" name="GUPnPDLNAInformation" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation-struct"/>
+    <keyword type="struct" name="GUPnPDLNAInformationClass" link="GUPnPDLNAInformation.html#GUPnPDLNAInformationClass"/>
+    <keyword type="function" name="gupnp_dlna_information_get_audio_information ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-get-audio-information"/>
+    <keyword type="function" name="gupnp_dlna_information_get_container_information ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-get-container-information"/>
+    <keyword type="function" name="gupnp_dlna_information_get_image_information ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-get-image-information"/>
+    <keyword type="function" name="gupnp_dlna_information_get_uri ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-get-uri"/>
+    <keyword type="function" name="gupnp_dlna_information_get_video_information ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-get-video-information"/>
+    <keyword type="property" name="The &quot;audio-information&quot; property" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation--audio-information"/>
+    <keyword type="property" name="The &quot;container-information&quot; property" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation--container-information"/>
+    <keyword type="property" name="The &quot;image-information&quot; property" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation--image-information"/>
+    <keyword type="property" name="The &quot;uri&quot; property" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation--uri"/>
+    <keyword type="property" name="The &quot;video-information&quot; property" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation--video-information"/>
+    <keyword type="macro" name="GUPNP_DLNA_BOOL_VALUE_UNSET" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-BOOL-VALUE-UNSET:CAPS"/>
+    <keyword type="macro" name="GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-BOOL-VALUE-UNSUPPORTED:CAPS"/>
+    <keyword type="macro" name="GUPNP_DLNA_FRACTION_VALUE_UNSET" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-FRACTION-VALUE-UNSET:CAPS"/>
+    <keyword type="macro" name="GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-FRACTION-VALUE-UNSUPPORTED:CAPS"/>
+    <keyword type="macro" name="GUPNP_DLNA_INT_VALUE_UNSET" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-INT-VALUE-UNSET:CAPS"/>
+    <keyword type="macro" name="GUPNP_DLNA_INT_VALUE_UNSUPPORTED" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-INT-VALUE-UNSUPPORTED:CAPS"/>
+    <keyword type="macro" name="GUPNP_DLNA_STRING_VALUE_UNSET" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-STRING-VALUE-UNSET:CAPS"/>
+    <keyword type="macro" name="GUPNP_DLNA_STRING_VALUE_UNSUPPORTED" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-STRING-VALUE-UNSUPPORTED:CAPS"/>
+    <keyword type="struct" name="GUPnPDLNABoolValue" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue"/>
+    <keyword type="struct" name="GUPnPDLNAFractionValue" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue"/>
+    <keyword type="struct" name="GUPnPDLNAIntValue" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue"/>
+    <keyword type="struct" name="GUPnPDLNAStringValue" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue"/>
+    <keyword type="enum" name="enum GUPnPDLNAValueState" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAValueState"/>
+    <keyword type="struct" name="GUPnPDLNAAudioInformation" link="GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation-struct"/>
+    <keyword type="struct" name="GUPnPDLNAAudioInformationClass" link="GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformationClass"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_bitrate ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-bitrate"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_channels ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-channels"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_depth ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-depth"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_layer ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-layer"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_level ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-level"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_mime ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mime"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_mpeg_audio_version ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mpeg-audio-version"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_mpeg_version ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mpeg-version"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_profile ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-profile"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_rate ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-rate"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_stream_format ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-stream-format"/>
+    <keyword type="function" name="gupnp_dlna_audio_information_get_wma_version ()" link="GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-wma-version"/>
+    <keyword type="struct" name="GUPnPDLNAContainerInformation" link="GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation-struct"/>
+    <keyword type="struct" name="GUPnPDLNAContainerInformationClass" link="GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformationClass"/>
+    <keyword type="function" name="gupnp_dlna_container_information_get_mime ()" link="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mime"/>
+    <keyword type="function" name="gupnp_dlna_container_information_get_mpeg_version ()" link="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mpeg-version"/>
+    <keyword type="function" name="gupnp_dlna_container_information_get_packet_size ()" link="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-packet-size"/>
+    <keyword type="function" name="gupnp_dlna_container_information_get_profile ()" link="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-profile"/>
+    <keyword type="function" name="gupnp_dlna_container_information_get_variant ()" link="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-variant"/>
+    <keyword type="function" name="gupnp_dlna_container_information_is_system_stream ()" link="GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-is-system-stream"/>
+    <keyword type="struct" name="GUPnPDLNAImageInformation" link="GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation-struct"/>
+    <keyword type="struct" name="GUPnPDLNAImageInformationClass" link="GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformationClass"/>
+    <keyword type="function" name="gupnp_dlna_image_information_get_depth ()" link="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-depth"/>
+    <keyword type="function" name="gupnp_dlna_image_information_get_height ()" link="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-height"/>
+    <keyword type="function" name="gupnp_dlna_image_information_get_mime ()" link="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-mime"/>
+    <keyword type="function" name="gupnp_dlna_image_information_get_width ()" link="GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-width"/>
+    <keyword type="struct" name="GUPnPDLNAVideoInformation" link="GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation-struct"/>
+    <keyword type="struct" name="GUPnPDLNAVideoInformationClass" link="GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformationClass"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_bitrate ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-bitrate"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_framerate ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-framerate"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_height ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-height"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_level ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-level"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_mime ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mime"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_mpeg_version ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mpeg-version"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_pixel_aspect_ratio ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-pixel-aspect-ratio"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_profile ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-profile"/>
+    <keyword type="function" name="gupnp_dlna_video_information_get_width ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-width"/>
+    <keyword type="function" name="gupnp_dlna_video_information_is_interlaced ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-is-interlaced"/>
+    <keyword type="function" name="gupnp_dlna_video_information_is_system_stream ()" link="GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-is-system-stream"/>
+    <keyword type="struct" name="GUPnPDLNARestriction" link="gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction-struct"/>
+    <keyword type="function" name="gupnp_dlna_restriction_copy ()" link="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-copy"/>
+    <keyword type="function" name="gupnp_dlna_restriction_free ()" link="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-free"/>
+    <keyword type="function" name="gupnp_dlna_restriction_get_entries ()" link="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-get-entries"/>
+    <keyword type="function" name="gupnp_dlna_restriction_get_mime ()" link="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-get-mime"/>
+    <keyword type="function" name="gupnp_dlna_restriction_is_empty ()" link="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-is-empty"/>
+    <keyword type="function" name="gupnp_dlna_restriction_to_string ()" link="gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-to-string"/>
+    <keyword type="struct" name="GUPnPDLNAValueList" link="gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList-struct"/>
+    <keyword type="function" name="gupnp_dlna_value_list_copy ()" link="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-copy"/>
+    <keyword type="function" name="gupnp_dlna_value_list_free ()" link="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-free"/>
+    <keyword type="function" name="gupnp_dlna_value_list_get_g_values ()" link="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-get-g-values"/>
+    <keyword type="function" name="gupnp_dlna_value_list_is_empty ()" link="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-is-empty"/>
+    <keyword type="function" name="gupnp_dlna_value_list_to_string ()" link="gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-to-string"/>
+    <keyword type="struct" name="GUPnPDLNAFraction" link="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction-struct"/>
+    <keyword type="struct" name="GUPnPDLNAFractionRange" link="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange-struct"/>
+    <keyword type="struct" name="GUPnPDLNAIntRange" link="gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange-struct"/>
+    <keyword type="function" name="gupnp_dlna_fraction_copy ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-copy"/>
+    <keyword type="function" name="gupnp_dlna_fraction_free ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-free"/>
+    <keyword type="function" name="gupnp_dlna_fraction_get_denominator ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-get-denominator"/>
+    <keyword type="function" name="gupnp_dlna_fraction_get_numerator ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-get-numerator"/>
+    <keyword type="function" name="gupnp_dlna_fraction_range_copy ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-copy"/>
+    <keyword type="function" name="gupnp_dlna_fraction_range_free ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-free"/>
+    <keyword type="function" name="gupnp_dlna_fraction_range_get_max ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-get-max"/>
+    <keyword type="function" name="gupnp_dlna_fraction_range_get_min ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-get-min"/>
+    <keyword type="function" name="gupnp_dlna_int_range_copy ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-copy"/>
+    <keyword type="function" name="gupnp_dlna_int_range_free ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-free"/>
+    <keyword type="function" name="gupnp_dlna_int_range_get_max ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-get-max"/>
+    <keyword type="function" name="gupnp_dlna_int_range_get_min ()" link="gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-get-min"/>
+    <keyword type="constant" name="GUPNP_DLNA_VALUE_STATE_SET" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-VALUE-STATE-SET:CAPS"/>
+    <keyword type="constant" name="GUPNP_DLNA_VALUE_STATE_UNSET" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-VALUE-STATE-UNSET:CAPS"/>
+    <keyword type="constant" name="GUPNP_DLNA_VALUE_STATE_UNSUPPORTED" link="gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-VALUE-STATE-UNSUPPORTED:CAPS"/>
+  </functions>
+</book>
diff --git a/doc/gupnp-dlna/html/home.png b/doc/gupnp-dlna/html/home.png
new file mode 100644 (file)
index 0000000..fb60b55
Binary files /dev/null and b/doc/gupnp-dlna/html/home.png differ
diff --git a/doc/gupnp-dlna/html/index.html b/doc/gupnp-dlna/html/index.html
new file mode 100644 (file)
index 0000000..cf9a106
--- /dev/null
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnP DLNA Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
+<link rel="next" href="ch01.html" title="GUPnP DLNA">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<div class="book">
+<div class="titlepage">
+<div>
+<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GUPnP DLNA Reference Manual</p></th></tr></table></div>
+<div><p class="releaseinfo">Version 0.10.0
+</p></div>
+<div><p class="copyright">Copyright Â© 2010 Arun Raghavan &lt;arun.raghavan@collabora.co.uk&gt;</p></div>
+<div><p class="copyright">Copyright Â© 2010 Collabora Multimedia</p></div>
+<div><p class="copyright">Copyright Â© 2010 Nokia Corporation</p></div>
+<div><p class="copyright">Copyright Â© 2012 Intel Corporation</p></div>
+<div><div class="legalnotice">
+<a name="idp4121568"></a><p>
+        Permission is granted to copy, distribute and/or modify this
+        document under the terms of the <em class="citetitle">GNU Free
+        Documentation License</em>, Version 1.1 or any later
+        version published by the Free Software Foundation with no
+        Invariant Sections, no Front-Cover Texts, and no Back-Cover
+        Texts. You may obtain a copy of the <em class="citetitle">GNU Free
+        Documentation License</em> from the Free Software
+        Foundation by visiting <a class="ulink" href="http://www.fsf.org" target="_top">their Web site</a> or by writing
+        to:
+
+        </p>
+<div class="address"><p><br>
+          The Free Software Foundation, Inc.,<br>
+          <span class="street">59 Temple Place</span> - Suite 330,<br>
+          <span class="city">Boston</span>, <span class="state">MA</span> <span class="postcode">02111-1307</span>,<br>
+          <span class="country">USA</span><br>
+        </p></div>
+<p>
+      </p>
+</div></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl>
+<dt><span class="chapter"><a href="ch01.html">GUPnP DLNA</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAProfileGuesser.html">GUPnPDLNAProfileGuesser</a></span><span class="refpurpose"> â€” Utility API for discovering DLNA profile for
+given media.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAProfile.html">GUPnPDLNAProfile</a></span><span class="refpurpose"> â€” Object representing a DLNA profile</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAInformation.html">GUPnPDLNAInformation</a></span><span class="refpurpose"> â€” Base class for storing various types of
+metadata informations.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gupnp-dlna-GUPnP-DLNA-Values.html">GUPnP DLNA Values</a></span><span class="refpurpose"> â€” State values for metadata attributes.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAAudioInformation.html">GUPnPDLNAAudioInformation</a></span><span class="refpurpose"> â€” Base class representing audio metadata needed
+for DLNA profiles matching.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAContainerInformation.html">GUPnPDLNAContainerInformation</a></span><span class="refpurpose"> â€” Base class representing container metadata
+needed for DLNA profiles matching.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAImageInformation.html">GUPnPDLNAImageInformation</a></span><span class="refpurpose"> â€” Base class representing image metadata needed
+for DLNA profiles matching.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPDLNAVideoInformation.html">GUPnPDLNAVideoInformation</a></span><span class="refpurpose"> â€” Base class representing video metadata needed
+for DLNA profiles matching.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gupnp-dlna-gupnp-dlna-restriction.html">gupnp-dlna-restriction</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gupnp-dlna-gupnp-dlna-value-list.html">gupnp-dlna-value-list</a></span><span class="refpurpose"></span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gupnp-dlna-gupnp-dlna-g-values.html">gupnp-dlna-g-values</a></span><span class="refpurpose"></span>
+</dt>
+</dl></dd>
+<dt><span class="glossary"><a href="annotation-glossary.html">Annotation Glossary</a></span></dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/gupnp-dlna/html/index.sgml b/doc/gupnp-dlna/html/index.sgml
new file mode 100644 (file)
index 0000000..14a6e9b
--- /dev/null
@@ -0,0 +1,203 @@
+<ANCHOR id="GUPnPDLNAProfileGuesser" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html">
+<ANCHOR id="GUPnPDLNAProfileGuesser.synopsis" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser.synopsis">
+<ANCHOR id="GUPnPDLNAProfileGuesser.object-hierarchy" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser.object-hierarchy">
+<ANCHOR id="GUPnPDLNAProfileGuesser.properties" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser.properties">
+<ANCHOR id="GUPnPDLNAProfileGuesser.signals" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser.signals">
+<ANCHOR id="GUPnPDLNAProfileGuesser.description" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser.description">
+<ANCHOR id="GUPnPDLNAProfileGuesser.details" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser.details">
+<ANCHOR id="GUPnPDLNAProfileGuesser-struct" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser-struct">
+<ANCHOR id="GUPnPDLNAProfileGuesserClass" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesserClass">
+<ANCHOR id="gupnp-dlna-profile-guesser-cleanup" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-cleanup">
+<ANCHOR id="gupnp-dlna-profile-guesser-get-extended-mode" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-extended-mode">
+<ANCHOR id="gupnp-dlna-profile-guesser-get-profile" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-profile">
+<ANCHOR id="gupnp-dlna-profile-guesser-get-relaxed-mode" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-get-relaxed-mode">
+<ANCHOR id="gupnp-dlna-profile-guesser-guess-profile-async" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-async">
+<ANCHOR id="gupnp-dlna-profile-guesser-guess-profile-from-info" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-from-info">
+<ANCHOR id="gupnp-dlna-profile-guesser-guess-profile-sync" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-guess-profile-sync">
+<ANCHOR id="gupnp-dlna-profile-guesser-list-profiles" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-list-profiles">
+<ANCHOR id="gupnp-dlna-profile-guesser-new" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#gupnp-dlna-profile-guesser-new">
+<ANCHOR id="GUPnPDLNAProfileGuesser.property-details" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser.property-details">
+<ANCHOR id="GUPnPDLNAProfileGuesser--extended-mode" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser--extended-mode">
+<ANCHOR id="GUPnPDLNAProfileGuesser--relaxed-mode" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser--relaxed-mode">
+<ANCHOR id="GUPnPDLNAProfileGuesser.signal-details" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser.signal-details">
+<ANCHOR id="GUPnPDLNAProfileGuesser-done" href="gupnp-dlna/GUPnPDLNAProfileGuesser.html#GUPnPDLNAProfileGuesser-done">
+<ANCHOR id="GUPnPDLNAProfile" href="gupnp-dlna/GUPnPDLNAProfile.html">
+<ANCHOR id="GUPnPDLNAProfile.synopsis" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.synopsis">
+<ANCHOR id="GUPnPDLNAProfile.object-hierarchy" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.object-hierarchy">
+<ANCHOR id="GUPnPDLNAProfile.properties" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.properties">
+<ANCHOR id="GUPnPDLNAProfile.description" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.description">
+<ANCHOR id="GUPnPDLNAProfile.details" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.details">
+<ANCHOR id="GUPnPDLNAProfile-struct" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile-struct">
+<ANCHOR id="GUPnPDLNAProfileClass" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfileClass">
+<ANCHOR id="gupnp-dlna-profile-get-audio-restrictions" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-audio-restrictions">
+<ANCHOR id="gupnp-dlna-profile-get-container-restrictions" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-container-restrictions">
+<ANCHOR id="gupnp-dlna-profile-get-extended" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-extended">
+<ANCHOR id="gupnp-dlna-profile-get-image-restrictions" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-image-restrictions">
+<ANCHOR id="gupnp-dlna-profile-get-mime" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-mime">
+<ANCHOR id="gupnp-dlna-profile-get-name" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-name">
+<ANCHOR id="gupnp-dlna-profile-get-video-restrictions" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-video-restrictions">
+<ANCHOR id="GUPnPDLNAProfile.property-details" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.property-details">
+<ANCHOR id="GUPnPDLNAProfile--audio-restrictions" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--audio-restrictions">
+<ANCHOR id="GUPnPDLNAProfile--container-restrictions" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--container-restrictions">
+<ANCHOR id="GUPnPDLNAProfile--extended" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--extended">
+<ANCHOR id="GUPnPDLNAProfile--image-restrictions" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--image-restrictions">
+<ANCHOR id="GUPnPDLNAProfile--mime" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--mime">
+<ANCHOR id="GUPnPDLNAProfile--name" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--name">
+<ANCHOR id="GUPnPDLNAProfile--video-restrictions" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--video-restrictions">
+<ANCHOR id="GUPnPDLNAInformation" href="gupnp-dlna/GUPnPDLNAInformation.html">
+<ANCHOR id="GUPnPDLNAInformation.synopsis" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.synopsis">
+<ANCHOR id="GUPnPDLNAInformation.object-hierarchy" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.object-hierarchy">
+<ANCHOR id="GUPnPDLNAInformation.properties" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.properties">
+<ANCHOR id="GUPnPDLNAInformation.description" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.description">
+<ANCHOR id="GUPnPDLNAInformation.details" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.details">
+<ANCHOR id="GUPnPDLNAInformation-struct" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation-struct">
+<ANCHOR id="GUPnPDLNAInformationClass" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformationClass">
+<ANCHOR id="gupnp-dlna-information-get-audio-information" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-audio-information">
+<ANCHOR id="gupnp-dlna-information-get-container-information" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-container-information">
+<ANCHOR id="gupnp-dlna-information-get-image-information" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-image-information">
+<ANCHOR id="gupnp-dlna-information-get-uri" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-uri">
+<ANCHOR id="gupnp-dlna-information-get-video-information" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-video-information">
+<ANCHOR id="GUPnPDLNAInformation.property-details" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.property-details">
+<ANCHOR id="GUPnPDLNAInformation--audio-information" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation--audio-information">
+<ANCHOR id="GUPnPDLNAInformation--container-information" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation--container-information">
+<ANCHOR id="GUPnPDLNAInformation--image-information" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation--image-information">
+<ANCHOR id="GUPnPDLNAInformation--uri" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation--uri">
+<ANCHOR id="GUPnPDLNAInformation--video-information" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation--video-information">
+<ANCHOR id="gupnp-dlna-GUPnP-DLNA-Values" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html">
+<ANCHOR id="gupnp-dlna-GUPnP-DLNA-Values.synopsis" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#gupnp-dlna-GUPnP-DLNA-Values.synopsis">
+<ANCHOR id="gupnp-dlna-GUPnP-DLNA-Values.description" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#gupnp-dlna-GUPnP-DLNA-Values.description">
+<ANCHOR id="gupnp-dlna-GUPnP-DLNA-Values.details" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#gupnp-dlna-GUPnP-DLNA-Values.details">
+<ANCHOR id="GUPNP-DLNA-BOOL-VALUE-UNSET:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-BOOL-VALUE-UNSET:CAPS">
+<ANCHOR id="GUPNP-DLNA-BOOL-VALUE-UNSUPPORTED:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-BOOL-VALUE-UNSUPPORTED:CAPS">
+<ANCHOR id="GUPNP-DLNA-FRACTION-VALUE-UNSET:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-FRACTION-VALUE-UNSET:CAPS">
+<ANCHOR id="GUPNP-DLNA-FRACTION-VALUE-UNSUPPORTED:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-FRACTION-VALUE-UNSUPPORTED:CAPS">
+<ANCHOR id="GUPNP-DLNA-INT-VALUE-UNSET:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-INT-VALUE-UNSET:CAPS">
+<ANCHOR id="GUPNP-DLNA-INT-VALUE-UNSUPPORTED:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-INT-VALUE-UNSUPPORTED:CAPS">
+<ANCHOR id="GUPNP-DLNA-STRING-VALUE-UNSET:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-STRING-VALUE-UNSET:CAPS">
+<ANCHOR id="GUPNP-DLNA-STRING-VALUE-UNSUPPORTED:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-STRING-VALUE-UNSUPPORTED:CAPS">
+<ANCHOR id="GUPnPDLNABoolValue" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNABoolValue">
+<ANCHOR id="GUPnPDLNAFractionValue" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAFractionValue">
+<ANCHOR id="GUPnPDLNAIntValue" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAIntValue">
+<ANCHOR id="GUPnPDLNAStringValue" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAStringValue">
+<ANCHOR id="GUPnPDLNAValueState" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPnPDLNAValueState">
+<ANCHOR id="GUPNP-DLNA-VALUE-STATE-SET:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-VALUE-STATE-SET:CAPS">
+<ANCHOR id="GUPNP-DLNA-VALUE-STATE-UNSET:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-VALUE-STATE-UNSET:CAPS">
+<ANCHOR id="GUPNP-DLNA-VALUE-STATE-UNSUPPORTED:CAPS" href="gupnp-dlna/gupnp-dlna-GUPnP-DLNA-Values.html#GUPNP-DLNA-VALUE-STATE-UNSUPPORTED:CAPS">
+<ANCHOR id="GUPnPDLNAAudioInformation" href="gupnp-dlna/GUPnPDLNAAudioInformation.html">
+<ANCHOR id="GUPnPDLNAAudioInformation.synopsis" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation.synopsis">
+<ANCHOR id="GUPnPDLNAAudioInformation.object-hierarchy" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation.object-hierarchy">
+<ANCHOR id="GUPnPDLNAAudioInformation.description" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation.description">
+<ANCHOR id="GUPnPDLNAAudioInformation.details" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation.details">
+<ANCHOR id="GUPnPDLNAAudioInformation-struct" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation-struct">
+<ANCHOR id="GUPnPDLNAAudioInformationClass" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformationClass">
+<ANCHOR id="gupnp-dlna-audio-information-get-bitrate" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-bitrate">
+<ANCHOR id="gupnp-dlna-audio-information-get-channels" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-channels">
+<ANCHOR id="gupnp-dlna-audio-information-get-depth" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-depth">
+<ANCHOR id="gupnp-dlna-audio-information-get-layer" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-layer">
+<ANCHOR id="gupnp-dlna-audio-information-get-level" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-level">
+<ANCHOR id="gupnp-dlna-audio-information-get-mime" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mime">
+<ANCHOR id="gupnp-dlna-audio-information-get-mpeg-audio-version" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mpeg-audio-version">
+<ANCHOR id="gupnp-dlna-audio-information-get-mpeg-version" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-mpeg-version">
+<ANCHOR id="gupnp-dlna-audio-information-get-profile" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-profile">
+<ANCHOR id="gupnp-dlna-audio-information-get-rate" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-rate">
+<ANCHOR id="gupnp-dlna-audio-information-get-stream-format" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-stream-format">
+<ANCHOR id="gupnp-dlna-audio-information-get-wma-version" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#gupnp-dlna-audio-information-get-wma-version">
+<ANCHOR id="GUPnPDLNAAudioInformation.see-also" href="gupnp-dlna/GUPnPDLNAAudioInformation.html#GUPnPDLNAAudioInformation.see-also">
+<ANCHOR id="GUPnPDLNAContainerInformation" href="gupnp-dlna/GUPnPDLNAContainerInformation.html">
+<ANCHOR id="GUPnPDLNAContainerInformation.synopsis" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation.synopsis">
+<ANCHOR id="GUPnPDLNAContainerInformation.object-hierarchy" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation.object-hierarchy">
+<ANCHOR id="GUPnPDLNAContainerInformation.description" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation.description">
+<ANCHOR id="GUPnPDLNAContainerInformation.details" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation.details">
+<ANCHOR id="GUPnPDLNAContainerInformation-struct" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation-struct">
+<ANCHOR id="GUPnPDLNAContainerInformationClass" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformationClass">
+<ANCHOR id="gupnp-dlna-container-information-get-mime" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mime">
+<ANCHOR id="gupnp-dlna-container-information-get-mpeg-version" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-mpeg-version">
+<ANCHOR id="gupnp-dlna-container-information-get-packet-size" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-packet-size">
+<ANCHOR id="gupnp-dlna-container-information-get-profile" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-profile">
+<ANCHOR id="gupnp-dlna-container-information-get-variant" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-get-variant">
+<ANCHOR id="gupnp-dlna-container-information-is-system-stream" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#gupnp-dlna-container-information-is-system-stream">
+<ANCHOR id="GUPnPDLNAContainerInformation.see-also" href="gupnp-dlna/GUPnPDLNAContainerInformation.html#GUPnPDLNAContainerInformation.see-also">
+<ANCHOR id="GUPnPDLNAImageInformation" href="gupnp-dlna/GUPnPDLNAImageInformation.html">
+<ANCHOR id="GUPnPDLNAImageInformation.synopsis" href="gupnp-dlna/GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation.synopsis">
+<ANCHOR id="GUPnPDLNAImageInformation.object-hierarchy" href="gupnp-dlna/GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation.object-hierarchy">
+<ANCHOR id="GUPnPDLNAImageInformation.description" href="gupnp-dlna/GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation.description">
+<ANCHOR id="GUPnPDLNAImageInformation.details" href="gupnp-dlna/GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation.details">
+<ANCHOR id="GUPnPDLNAImageInformation-struct" href="gupnp-dlna/GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation-struct">
+<ANCHOR id="GUPnPDLNAImageInformationClass" href="gupnp-dlna/GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformationClass">
+<ANCHOR id="gupnp-dlna-image-information-get-depth" href="gupnp-dlna/GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-depth">
+<ANCHOR id="gupnp-dlna-image-information-get-height" href="gupnp-dlna/GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-height">
+<ANCHOR id="gupnp-dlna-image-information-get-mime" href="gupnp-dlna/GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-mime">
+<ANCHOR id="gupnp-dlna-image-information-get-width" href="gupnp-dlna/GUPnPDLNAImageInformation.html#gupnp-dlna-image-information-get-width">
+<ANCHOR id="GUPnPDLNAImageInformation.see-also" href="gupnp-dlna/GUPnPDLNAImageInformation.html#GUPnPDLNAImageInformation.see-also">
+<ANCHOR id="GUPnPDLNAVideoInformation" href="gupnp-dlna/GUPnPDLNAVideoInformation.html">
+<ANCHOR id="GUPnPDLNAVideoInformation.synopsis" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation.synopsis">
+<ANCHOR id="GUPnPDLNAVideoInformation.object-hierarchy" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation.object-hierarchy">
+<ANCHOR id="GUPnPDLNAVideoInformation.description" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation.description">
+<ANCHOR id="GUPnPDLNAVideoInformation.details" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation.details">
+<ANCHOR id="GUPnPDLNAVideoInformation-struct" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation-struct">
+<ANCHOR id="GUPnPDLNAVideoInformationClass" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformationClass">
+<ANCHOR id="gupnp-dlna-video-information-get-bitrate" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-bitrate">
+<ANCHOR id="gupnp-dlna-video-information-get-framerate" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-framerate">
+<ANCHOR id="gupnp-dlna-video-information-get-height" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-height">
+<ANCHOR id="gupnp-dlna-video-information-get-level" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-level">
+<ANCHOR id="gupnp-dlna-video-information-get-mime" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mime">
+<ANCHOR id="gupnp-dlna-video-information-get-mpeg-version" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-mpeg-version">
+<ANCHOR id="gupnp-dlna-video-information-get-pixel-aspect-ratio" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-pixel-aspect-ratio">
+<ANCHOR id="gupnp-dlna-video-information-get-profile" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-profile">
+<ANCHOR id="gupnp-dlna-video-information-get-width" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-get-width">
+<ANCHOR id="gupnp-dlna-video-information-is-interlaced" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-is-interlaced">
+<ANCHOR id="gupnp-dlna-video-information-is-system-stream" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#gupnp-dlna-video-information-is-system-stream">
+<ANCHOR id="GUPnPDLNAVideoInformation.see-also" href="gupnp-dlna/GUPnPDLNAVideoInformation.html#GUPnPDLNAVideoInformation.see-also">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-restriction" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-restriction.synopsis" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-gupnp-dlna-restriction.synopsis">
+<ANCHOR id="GUPnPDLNARestriction" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-restriction.object-hierarchy" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-gupnp-dlna-restriction.object-hierarchy">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-restriction.description" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-gupnp-dlna-restriction.description">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-restriction.details" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-gupnp-dlna-restriction.details">
+<ANCHOR id="GUPnPDLNARestriction-struct" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#GUPnPDLNARestriction-struct">
+<ANCHOR id="gupnp-dlna-restriction-copy" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-copy">
+<ANCHOR id="gupnp-dlna-restriction-free" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-free">
+<ANCHOR id="gupnp-dlna-restriction-get-entries" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-get-entries">
+<ANCHOR id="gupnp-dlna-restriction-get-mime" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-get-mime">
+<ANCHOR id="gupnp-dlna-restriction-is-empty" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-is-empty">
+<ANCHOR id="gupnp-dlna-restriction-to-string" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-restriction.html#gupnp-dlna-restriction-to-string">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-value-list" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-value-list.synopsis" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-gupnp-dlna-value-list.synopsis">
+<ANCHOR id="GUPnPDLNAValueList" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-value-list.object-hierarchy" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-gupnp-dlna-value-list.object-hierarchy">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-value-list.description" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-gupnp-dlna-value-list.description">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-value-list.details" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-gupnp-dlna-value-list.details">
+<ANCHOR id="GUPnPDLNAValueList-struct" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#GUPnPDLNAValueList-struct">
+<ANCHOR id="gupnp-dlna-value-list-copy" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-copy">
+<ANCHOR id="gupnp-dlna-value-list-free" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-free">
+<ANCHOR id="gupnp-dlna-value-list-get-g-values" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-get-g-values">
+<ANCHOR id="gupnp-dlna-value-list-is-empty" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-is-empty">
+<ANCHOR id="gupnp-dlna-value-list-to-string" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-value-list.html#gupnp-dlna-value-list-to-string">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-g-values" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-g-values.synopsis" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-gupnp-dlna-g-values.synopsis">
+<ANCHOR id="GUPnPDLNAFraction" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction">
+<ANCHOR id="GUPnPDLNAFractionRange" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange">
+<ANCHOR id="GUPnPDLNAIntRange" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-g-values.object-hierarchy" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-gupnp-dlna-g-values.object-hierarchy">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-g-values.description" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-gupnp-dlna-g-values.description">
+<ANCHOR id="gupnp-dlna-gupnp-dlna-g-values.details" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-gupnp-dlna-g-values.details">
+<ANCHOR id="GUPnPDLNAFraction-struct" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFraction-struct">
+<ANCHOR id="GUPnPDLNAFractionRange-struct" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAFractionRange-struct">
+<ANCHOR id="GUPnPDLNAIntRange-struct" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#GUPnPDLNAIntRange-struct">
+<ANCHOR id="gupnp-dlna-fraction-copy" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-copy">
+<ANCHOR id="gupnp-dlna-fraction-free" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-free">
+<ANCHOR id="gupnp-dlna-fraction-get-denominator" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-get-denominator">
+<ANCHOR id="gupnp-dlna-fraction-get-numerator" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-get-numerator">
+<ANCHOR id="gupnp-dlna-fraction-range-copy" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-copy">
+<ANCHOR id="gupnp-dlna-fraction-range-free" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-free">
+<ANCHOR id="gupnp-dlna-fraction-range-get-max" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-get-max">
+<ANCHOR id="gupnp-dlna-fraction-range-get-min" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-fraction-range-get-min">
+<ANCHOR id="gupnp-dlna-int-range-copy" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-copy">
+<ANCHOR id="gupnp-dlna-int-range-free" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-free">
+<ANCHOR id="gupnp-dlna-int-range-get-max" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-get-max">
+<ANCHOR id="gupnp-dlna-int-range-get-min" href="gupnp-dlna/gupnp-dlna-gupnp-dlna-g-values.html#gupnp-dlna-int-range-get-min">
+<ANCHOR id="annotation-glossterm-out" href="gupnp-dlna/annotation-glossary.html#annotation-glossterm-out">
+<ANCHOR id="annotation-glossterm-allow-none" href="gupnp-dlna/annotation-glossary.html#annotation-glossterm-allow-none">
+<ANCHOR id="annotation-glossterm-element-type" href="gupnp-dlna/annotation-glossary.html#annotation-glossterm-element-type">
+<ANCHOR id="annotation-glossterm-transfer full" href="gupnp-dlna/annotation-glossary.html#annotation-glossterm-transfer full">
+<ANCHOR id="annotation-glossterm-transfer none" href="gupnp-dlna/annotation-glossary.html#annotation-glossterm-transfer none">
diff --git a/doc/gupnp-dlna/html/left.png b/doc/gupnp-dlna/html/left.png
new file mode 100644 (file)
index 0000000..48cab27
Binary files /dev/null and b/doc/gupnp-dlna/html/left.png differ
diff --git a/doc/gupnp-dlna/html/right.png b/doc/gupnp-dlna/html/right.png
new file mode 100644 (file)
index 0000000..ed55207
Binary files /dev/null and b/doc/gupnp-dlna/html/right.png differ
diff --git a/doc/gupnp-dlna/html/style.css b/doc/gupnp-dlna/html/style.css
new file mode 100644 (file)
index 0000000..d6f6c26
--- /dev/null
@@ -0,0 +1,266 @@
+.synopsis, .classsynopsis
+{
+  /* tango:aluminium 1/2 */
+  background: #eeeeec;
+  border: solid 1px #d3d7cf;
+  padding: 0.5em;
+}
+.programlisting
+{
+  /* tango:sky blue 0/1 */
+  background: #e6f3ff;
+  border: solid 1px #729fcf;
+  padding: 0.5em;
+}
+.variablelist
+{
+  padding: 4px;
+  margin-left: 3em;
+}
+.variablelist td:first-child
+{
+  vertical-align: top;
+}
+
+@media screen {
+  sup a.footnote
+  {
+    position: relative;
+    top: 0em ! important;
+    
+  }
+  /* this is needed so that the local anchors are displayed below the naviagtion */
+  div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name]
+  {
+    display: inline-block;
+    position: relative;
+    top:-5em;
+  }
+  /* this seems to be a bug in the xsl style sheets when generating indexes */
+  div.index div.index
+  {
+    top: 0em;
+  }
+  /* make space for the fixed navigation bar and add space at the bottom so that
+   * link targets appear somewhat close to top
+   */
+  body
+  {
+    padding-top: 3.2em;
+    padding-bottom: 20em;
+  }
+  /* style and size the navigation bar */
+  table.navigation#top
+  {
+    position: fixed;
+    /* tango:scarlet red 0/1 */
+    background: #ffe6e6;
+    border: solid 1px #ef2929;
+    margin-top: 0;
+    margin-bottom: 0;
+    top: 0;
+    left: 0;
+    height: 3em;
+    z-index: 10;
+  }
+  .navigation a, .navigation a:visited
+  {
+    /* tango:scarlet red 3 */
+    color: #a40000;
+  }
+  .navigation a:hover
+  {
+    /* tango:scarlet red 1 */
+    color: #ef2929;
+  }
+  td.shortcuts
+  {
+    /* tango:scarlet red 1 */
+    color: #ef2929;
+    font-size: 80%;
+    white-space: nowrap;
+  }
+}
+@media print {
+  table.navigation {
+    visibility: collapse;
+    display: none;
+  }
+  div.titlepage table.navigation {
+    visibility: visible;
+    display: table;
+    /* tango:scarlet red 0/1 */
+    background: #ffe6e6;
+    border: solid 1px #ef2929;
+    margin-top: 0;
+    margin-bottom: 0;
+    top: 0;
+    left: 0;
+    height: 3em;
+  }
+}
+
+.navigation .title
+{
+  font-size: 200%;
+}
+
+div.gallery-float
+{
+  float: left;
+  padding: 10px;
+}
+div.gallery-float img
+{
+  border-style: none;
+}
+div.gallery-spacer
+{
+  clear: both;
+}
+
+a, a:visited
+{
+  text-decoration: none;
+  /* tango:sky blue 2 */
+  color: #3465a4;
+}
+a:hover
+{
+  text-decoration: underline;
+  /* tango:sky blue 1 */
+  color: #729fcf;
+}
+
+div.table table
+{
+  border-collapse: collapse;
+  border-spacing: 0px;
+  /* tango:aluminium 3 */
+  border: solid 1px #babdb6;
+}
+
+div.table table td, div.table table th
+{
+  /* tango:aluminium 3 */
+  border: solid 1px #babdb6;
+  padding: 3px;
+  vertical-align: top;
+}
+
+div.table table th
+{
+  /* tango:aluminium 2 */
+  background-color: #d3d7cf;
+}
+
+hr
+{
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  background: #babdb6;
+  border: none 0px;
+  height: 1px;
+  clear: both;
+}
+
+.footer
+{
+  padding-top: 3.5em;
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  text-align: center;
+  font-size: 80%;
+}
+
+.warning
+{
+  /* tango:orange 0/1 */
+  background: #ffeed9;
+  border-color: #ffb04f;
+}
+.note
+{
+  /* tango:chameleon 0/0.5 */
+  background: #d8ffb2;
+  border-color: #abf562;
+}
+.note, .warning
+{
+  padding: 0.5em;
+  border-width: 1px;
+  border-style: solid;
+}
+.note h3, .warning h3
+{
+  margin-top: 0.0em
+}
+.note p, .warning p
+{
+  margin-bottom: 0.0em
+}
+
+/* blob links */
+h2 .extralinks, h3 .extralinks
+{
+  float: right;
+  /* tango:aluminium 3 */
+  color: #babdb6;
+  font-size: 80%;
+  font-weight: normal;
+}
+
+.annotation
+{
+  /* tango:aluminium 5 */
+  color: #555753;
+  font-size: 80%;
+  font-weight: normal;
+}
+
+/* code listings */
+
+.listing_code .programlisting .cbracket   { color: #a40000; } /* tango: scarlet red 3 */
+.listing_code .programlisting .comment    { color: #a1a39d; } /* tango: aluminium 4 */
+.listing_code .programlisting .function   { color: #000000; font-weight: bold; }
+.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */
+.listing_code .programlisting .keyword    { color: #4e9a06; } /* tango: chameleon 3  */
+.listing_code .programlisting .linenum    { color: #babdb6; } /* tango: aluminium 3 */
+.listing_code .programlisting .normal     { color: #000000; }
+.listing_code .programlisting .number     { color: #75507b; } /* tango: plum 2 */
+.listing_code .programlisting .preproc    { color: #204a87; } /* tango: sky blue 3  */
+.listing_code .programlisting .string     { color: #c17d11; } /* tango: chocolate 2 */
+.listing_code .programlisting .type       { color: #000000; }
+.listing_code .programlisting .type a     { color: #11326b; } /* tango: sky blue 4 */
+.listing_code .programlisting .symbol     { color: #ce5c00; } /* tango: orange 3 */
+
+.listing_frame {
+  /* tango:sky blue 1 */
+  border: solid 1px #729fcf;
+  padding: 0px;
+}
+
+.listing_lines, .listing_code {
+  margin-top: 0px;
+  margin-bottom: 0px;
+  padding: 0.5em;
+}
+.listing_lines {
+  /* tango:sky blue 0.5 */
+  background: #a6c5e3;
+  /* tango:aluminium 6 */
+  color: #2e3436;
+}
+.listing_code {
+  /* tango:sky blue 0 */
+  background: #e6f3ff;
+}
+.listing_code .programlisting {
+  /* override from previous */
+  border: none 0px;
+  padding: 0px;
+}
+.listing_lines pre, .listing_code pre {
+  margin: 0px;
+}
+
diff --git a/doc/gupnp-dlna/html/up.png b/doc/gupnp-dlna/html/up.png
new file mode 100644 (file)
index 0000000..8eb591f
Binary files /dev/null and b/doc/gupnp-dlna/html/up.png differ
diff --git a/doc/html/GUPnPDLNADiscoverer.html b/doc/html/GUPnPDLNADiscoverer.html
deleted file mode 100644 (file)
index 90c011c..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>GUPnPDLNADiscoverer</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
-<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
-<link rel="up" href="ch01.html" title="GUPnP DLNA">
-<link rel="prev" href="ch01.html" title="GUPnP DLNA">
-<link rel="next" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">
-<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
-<tr valign="middle">
-<td><a accesskey="p" href="ch01.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
-<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
-<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
-<td><a accesskey="n" href="GUPnPDLNAInformation.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
-</tr>
-<tr><td colspan="5" class="shortcuts">
-<a href="#GUPnPDLNADiscoverer.synopsis" class="shortcut">Top</a>
-                  Â | 
-                  <a href="#GUPnPDLNADiscoverer.description" class="shortcut">Description</a>
-                  Â | 
-                  <a href="#GUPnPDLNADiscoverer.object-hierarchy" class="shortcut">Object Hierarchy</a>
-                  Â | 
-                  <a href="#GUPnPDLNADiscoverer.properties" class="shortcut">Properties</a>
-                  Â | 
-                  <a href="#GUPnPDLNADiscoverer.signals" class="shortcut">Signals</a>
-</td></tr>
-</table>
-<div class="refentry">
-<a name="GUPnPDLNADiscoverer"></a><div class="titlepage"></div>
-<div class="refnamediv"><table width="100%"><tr>
-<td valign="top">
-<h2><span class="refentrytitle"><a name="GUPnPDLNADiscoverer.top_of_page"></a>GUPnPDLNADiscoverer</span></h2>
-<p>GUPnPDLNADiscoverer â€” Utility API for discovering DLNA profile/mime type and
-other metadata for given media.</p>
-</td>
-<td valign="top" align="right"></td>
-</tr></table></div>
-<div class="refsynopsisdiv">
-<a name="GUPnPDLNADiscoverer.synopsis"></a><h2>Synopsis</h2>
-<pre class="synopsis">                    <a class="link" href="GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer-struct" title="GUPnPDLNADiscoverer">GUPnPDLNADiscoverer</a>;
-<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="returnvalue">GUPnPDLNADiscoverer</span></a> * <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-new" title="gupnp_dlna_discoverer_new ()">gupnp_dlna_discoverer_new</a>         (<em class="parameter"><code><span class="type">GstClockTime</span> timeout</code></em>,
-                                                         <em class="parameter"><code><span class="type">gboolean</span> relaxed_mode</code></em>,
-                                                         <em class="parameter"><code><span class="type">gboolean</span> extended_mode</code></em>);
-#define             <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-start" title="gupnp_dlna_discoverer_start()">gupnp_dlna_discoverer_start</a>         (discoverer)
-#define             <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-stop" title="gupnp_dlna_discoverer_stop()">gupnp_dlna_discoverer_stop</a>          (discoverer)
-<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-discover-uri" title="gupnp_dlna_discoverer_discover_uri ()">gupnp_dlna_discoverer_discover_uri</a>  (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *discoverer</code></em>,
-                                                         <em class="parameter"><code>const <span class="type">gchar</span> *uri</code></em>);
-<a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="returnvalue">GUPnPDLNAInformation</span></a> * <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-discover-uri-sync" title="gupnp_dlna_discoverer_discover_uri_sync ()">gupnp_dlna_discoverer_discover_uri_sync</a>
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *discoverer</code></em>,
-                                                         <em class="parameter"><code>const <span class="type">gchar</span> *uri</code></em>,
-                                                         <em class="parameter"><code><span class="type">GError</span> **err</code></em>);
-<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-profile" title="gupnp_dlna_discoverer_get_profile ()">gupnp_dlna_discoverer_get_profile</a>   (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *self</code></em>,
-                                                         <em class="parameter"><code>const <span class="type">gchar</span> *name</code></em>);
-const <span class="returnvalue">GList</span> *       <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-list-profiles" title="gupnp_dlna_discoverer_list_profiles ()">gupnp_dlna_discoverer_list_profiles</a> (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *self</code></em>);
-<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-relaxed-mode" title="gupnp_dlna_discoverer_get_relaxed_mode ()">gupnp_dlna_discoverer_get_relaxed_mode</a>
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *self</code></em>);
-<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-extended-mode" title="gupnp_dlna_discoverer_get_extended_mode ()">gupnp_dlna_discoverer_get_extended_mode</a>
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *self</code></em>);
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNADiscoverer.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="synopsis">
-  GObject
-   +----GstDiscoverer
-         +----GUPnPDLNADiscoverer
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNADiscoverer.properties"></a><h2>Properties</h2>
-<pre class="synopsis">
-  "<a class="link" href="GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer--extended-mode" title='The "extended-mode" property'>extended-mode</a>"            <span class="type">gboolean</span>              : Read / Write / Construct Only
-  "<a class="link" href="GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer--relaxed-mode" title='The "relaxed-mode" property'>relaxed-mode</a>"             <span class="type">gboolean</span>              : Read / Write / Construct Only
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNADiscoverer.signals"></a><h2>Signals</h2>
-<pre class="synopsis">
-  "<a class="link" href="GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer-done" title='The "done" signal'>done</a>"                                           : <code class="literal">Run Last</code>
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNADiscoverer.description"></a><h2>Description</h2>
-<p>
-The GUPnPDLNADiscoverer object provides a light-weight wrapper over the
-<span class="type">GstDiscoverer</span> API. The latter provides a simple interface to discover
-media metadata given a URI. GUPnPDLNADiscoverer extends this API to also
-provide a DLNA profile name and mime type for the media.
-</p>
-<p>
-The API provided corresponds very closely to the API provided by
-<span class="type">GstDiscoverer</span> - both synchronous and asynchronous discovery of metadata
-are possible.
-</p>
-<p>
-The asynchronous mode requires a running <span class="type">GMainLoop</span> in the default
-<span class="type">GMainContext</span>, where one connects to the various signals, appends the
-URIs to be processed and then asks for the discovery to begin.
-</p>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNADiscoverer.details"></a><h2>Details</h2>
-<div class="refsect2">
-<a name="GUPnPDLNADiscoverer-struct"></a><h3>GUPnPDLNADiscoverer</h3>
-<pre class="programlisting">typedef struct _GUPnPDLNADiscoverer GUPnPDLNADiscoverer;</pre>
-<p>
-The top-level object used to for metadata extraction.
-</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-new"></a><h3>gupnp_dlna_discoverer_new ()</h3>
-<pre class="programlisting"><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="returnvalue">GUPnPDLNADiscoverer</span></a> * gupnp_dlna_discoverer_new         (<em class="parameter"><code><span class="type">GstClockTime</span> timeout</code></em>,
-                                                         <em class="parameter"><code><span class="type">gboolean</span> relaxed_mode</code></em>,
-                                                         <em class="parameter"><code><span class="type">gboolean</span> extended_mode</code></em>);</pre>
-<p>
-Creates a new <a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object with the given default timeout
-value.
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
-<td>default discovery timeout, in nanoseconds</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>relaxed_mode</code></em> :</span></p></td>
-<td>set to TRUE, to enable relaxed mode support. FALSE otherwise</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>extended_mode</code></em> :</span></p></td>
-<td>set to TRUE, to enable extended mode support. FALSE otherwise</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>A new <a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object.</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-start"></a><h3>gupnp_dlna_discoverer_start()</h3>
-<pre class="programlisting">#define             gupnp_dlna_discoverer_start(discoverer)</pre>
-<p>
-Allows asynchronous discovery of URIs to begin.
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody><tr>
-<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
-<td>
-<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object to start discovery on</td>
-</tr></tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-stop"></a><h3>gupnp_dlna_discoverer_stop()</h3>
-<pre class="programlisting">#define             gupnp_dlna_discoverer_stop(discoverer)</pre>
-<p>
-Stops asynchronous discovery of URIs.
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody><tr>
-<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
-<td>
-<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object to stop discovery on</td>
-</tr></tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-discover-uri"></a><h3>gupnp_dlna_discoverer_discover_uri ()</h3>
-<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_dlna_discoverer_discover_uri  (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *discoverer</code></em>,
-                                                         <em class="parameter"><code>const <span class="type">gchar</span> *uri</code></em>);</pre>
-<p>
-Queues <em class="parameter"><code>uri</code></em> for metadata discovery. When discovery is completed, the
-"discovered" signal is emitted on <em class="parameter"><code>discoverer</code></em>.
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
-<td>
-<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object to use for discovery</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
-<td>URI to gather metadata for</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>TRUE if <em class="parameter"><code>uri</code></em> was successfully queued, FALSE otherwise.</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-discover-uri-sync"></a><h3>gupnp_dlna_discoverer_discover_uri_sync ()</h3>
-<pre class="programlisting"><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="returnvalue">GUPnPDLNAInformation</span></a> * gupnp_dlna_discoverer_discover_uri_sync
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *discoverer</code></em>,
-                                                         <em class="parameter"><code>const <span class="type">gchar</span> *uri</code></em>,
-                                                         <em class="parameter"><code><span class="type">GError</span> **err</code></em>);</pre>
-<p>
-Synchronously gathers metadata for <em class="parameter"><code>uri</code></em>.
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
-<td>
-<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object to use for discovery</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
-<td>URI to gather metadata for</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>err</code></em> :</span></p></td>
-<td>contains details of the error if discovery fails, else is NULL</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> with the metadata for <em class="parameter"><code>uri</code></em>
-on success, NULL otherwise. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-get-profile"></a><h3>gupnp_dlna_discoverer_get_profile ()</h3>
-<pre class="programlisting"><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  gupnp_dlna_discoverer_get_profile   (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *self</code></em>,
-                                                         <em class="parameter"><code>const <span class="type">gchar</span> *name</code></em>);</pre>
-<p>
-Given <em class="parameter"><code>name</code></em>, this finds the corresponding DLNA profile information (stored
-as a <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a>).
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
-<td>The name of the DLNA profile to be retrieved</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> on success, NULL otherwise. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-list-profiles"></a><h3>gupnp_dlna_discoverer_list_profiles ()</h3>
-<pre class="programlisting">const <span class="returnvalue">GList</span> *       gupnp_dlna_discoverer_list_profiles (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *self</code></em>);</pre>
-<p>
-Retuns a list of the all the DLNA profiles supported by <em class="parameter"><code>self</code></em>.
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> whose profile list is required</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a <span class="type">GList</span> of
-<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> on success, NULL otherwise. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDLNAProfile*]</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-get-relaxed-mode"></a><h3>gupnp_dlna_discoverer_get_relaxed_mode ()</h3>
-<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_dlna_discoverer_get_relaxed_mode
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *self</code></em>);</pre>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>true if relaxed mode is set and false otherwise</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-discoverer-get-extended-mode"></a><h3>gupnp_dlna_discoverer_get_extended_mode ()</h3>
-<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_dlna_discoverer_get_extended_mode
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> *self</code></em>);</pre>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>true if application is using extended mode and false otherwise</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNADiscoverer.property-details"></a><h2>Property Details</h2>
-<div class="refsect2">
-<a name="GUPnPDLNADiscoverer--extended-mode"></a><h3>The <code class="literal">"extended-mode"</code> property</h3>
-<pre class="programlisting">  "extended-mode"            <span class="type">gboolean</span>              : Read / Write / Construct Only</pre>
-<p>Indicates support for profiles that are not part of the DLNA specification.</p>
-<p>Default value: FALSE</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GUPnPDLNADiscoverer--relaxed-mode"></a><h3>The <code class="literal">"relaxed-mode"</code> property</h3>
-<pre class="programlisting">  "relaxed-mode"             <span class="type">gboolean</span>              : Read / Write / Construct Only</pre>
-<p>Indicates that profile matching shouldbe strictly compliant with the DLNA specification.</p>
-<p>Default value: FALSE</p>
-</div>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNADiscoverer.signal-details"></a><h2>Signal Details</h2>
-<div class="refsect2">
-<a name="GUPnPDLNADiscoverer-done"></a><h3>The <code class="literal">"done"</code> signal</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a>  *discoverer,
-                                                        <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *dlna,
-                                                        <span class="type">GError</span>               *err,
-                                                        <span class="type">gpointer</span>              user_data)       : <code class="literal">Run Last</code></pre>
-<p>
-Will be emitted when all information on a URI could be discovered.
-</p>
-<p>
-The reciever must unref <em class="parameter"><code>dlna</code></em> with when done using it.
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>discoverer</code></em> :</span></p></td>
-<td>the <a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a>
-</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>dlna</code></em> :</span></p></td>
-<td>the results as <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a>
-</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>err</code></em> :</span></p></td>
-<td>contains details of the error if discovery fails, else is NULL</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
-<td>user data set when the signal handler was connected.</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-</div>
-<div class="footer">
-<hr>
-          Generated by GTK-Doc V1.18</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/doc/html/GUPnPDLNAInformation.html b/doc/html/GUPnPDLNAInformation.html
deleted file mode 100644 (file)
index 44c0604..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>GUPnPDLNAInformation</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
-<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
-<link rel="up" href="ch01.html" title="GUPnP DLNA">
-<link rel="prev" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer">
-<link rel="next" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile">
-<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
-<tr valign="middle">
-<td><a accesskey="p" href="GUPnPDLNADiscoverer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
-<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
-<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
-<td><a accesskey="n" href="GUPnPDLNAProfile.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
-</tr>
-<tr><td colspan="5" class="shortcuts">
-<a href="#GUPnPDLNAInformation.synopsis" class="shortcut">Top</a>
-                  Â | 
-                  <a href="#GUPnPDLNAInformation.description" class="shortcut">Description</a>
-                  Â | 
-                  <a href="#GUPnPDLNAInformation.object-hierarchy" class="shortcut">Object Hierarchy</a>
-                  Â | 
-                  <a href="#GUPnPDLNAInformation.properties" class="shortcut">Properties</a>
-</td></tr>
-</table>
-<div class="refentry">
-<a name="GUPnPDLNAInformation"></a><div class="titlepage"></div>
-<div class="refnamediv"><table width="100%"><tr>
-<td valign="top">
-<h2><span class="refentrytitle"><a name="GUPnPDLNAInformation.top_of_page"></a>GUPnPDLNAInformation</span></h2>
-<p>GUPnPDLNAInformation â€” Object containing metadata information returned by the
-<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> API</p>
-</td>
-<td valign="top" align="right"></td>
-</tr></table></div>
-<div class="refsynopsisdiv">
-<a name="GUPnPDLNAInformation.synopsis"></a><h2>Synopsis</h2>
-<pre class="synopsis">                    <a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation-struct" title="GUPnPDLNAInformation">GUPnPDLNAInformation</a>;
-<a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="returnvalue">GUPnPDLNAInformation</span></a> * <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-new" title="gupnp_dlna_information_new ()">gupnp_dlna_information_new</a>       (<em class="parameter"><code><span class="type">gchar</span> *name</code></em>,
-                                                         <em class="parameter"><code><span class="type">gchar</span> *mime</code></em>,
-                                                         <em class="parameter"><code><span class="type">GstDiscovererInfo</span> *info</code></em>);
-const <span class="returnvalue">gchar</span> *       <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-name" title="gupnp_dlna_information_get_name ()">gupnp_dlna_information_get_name</a>     (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *self</code></em>);
-const <span class="returnvalue">gchar</span> *       <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-mime" title="gupnp_dlna_information_get_mime ()">gupnp_dlna_information_get_mime</a>     (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *self</code></em>);
-const <span class="returnvalue">GstDiscovererInfo</span> * <a class="link" href="GUPnPDLNAInformation.html#gupnp-dlna-information-get-info" title="gupnp_dlna_information_get_info ()">gupnp_dlna_information_get_info</a>
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *self</code></em>);
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAInformation.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="synopsis">
-  GObject
-   +----GUPnPDLNAInformation
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAInformation.properties"></a><h2>Properties</h2>
-<pre class="synopsis">
-  "<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--info" title='The "info" property'>info</a>"                     <span class="type">GstDiscovererInfo</span>*    : Read / Write / Construct Only
-  "<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--mime" title='The "mime" property'>mime</a>"                     <span class="type">gchar</span>*                : Read / Write / Construct Only
-  "<a class="link" href="GUPnPDLNAInformation.html#GUPnPDLNAInformation--name" title='The "name" property'>name</a>"                     <span class="type">gchar</span>*                : Read / Write / Construct Only
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAInformation.description"></a><h2>Description</h2>
-<p>
-The GUPnPDLNAInformation object holds metadata information discovered by the
-GUPnPDiscoverer API. The DLNA profile name and MIME type have their own
-fields, and other metadata is held in a GstDiscovererInfo structure.
-All fields are read-only.
-</p>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAInformation.details"></a><h2>Details</h2>
-<div class="refsect2">
-<a name="GUPnPDLNAInformation-struct"></a><h3>GUPnPDLNAInformation</h3>
-<pre class="programlisting">typedef struct _GUPnPDLNAInformation GUPnPDLNAInformation;</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-information-new"></a><h3>gupnp_dlna_information_new ()</h3>
-<pre class="programlisting"><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="returnvalue">GUPnPDLNAInformation</span></a> * gupnp_dlna_information_new       (<em class="parameter"><code><span class="type">gchar</span> *name</code></em>,
-                                                         <em class="parameter"><code><span class="type">gchar</span> *mime</code></em>,
-                                                         <em class="parameter"><code><span class="type">GstDiscovererInfo</span> *info</code></em>);</pre>
-<p>
-Creates a new <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object with the given properties.
-</p>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
-<td>DLNA media profile name corresponding to the media</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>mime</code></em> :</span></p></td>
-<td>DLNA MIME type for the media</td>
-</tr>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
-<td>
-<span class="type">GstDiscovererInfo</span> type with additional metadata about the
-stream</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>A newly created <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object.</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-information-get-name"></a><h3>gupnp_dlna_information_get_name ()</h3>
-<pre class="programlisting">const <span class="returnvalue">gchar</span> *       gupnp_dlna_information_get_name     (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *self</code></em>);</pre>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the DLNA profile name of the stream represented by <em class="parameter"><code>self</code></em>. Do not
-free this string.</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-information-get-mime"></a><h3>gupnp_dlna_information_get_mime ()</h3>
-<pre class="programlisting">const <span class="returnvalue">gchar</span> *       gupnp_dlna_information_get_mime     (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *self</code></em>);</pre>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> object</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the DLNA MIME type of the stream represented by <em class="parameter"><code>self</code></em>. Do not
-free this string.</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-information-get-info"></a><h3>gupnp_dlna_information_get_info ()</h3>
-<pre class="programlisting">const <span class="returnvalue">GstDiscovererInfo</span> * gupnp_dlna_information_get_info
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation"><span class="type">GUPnPDLNAInformation</span></a> *self</code></em>);</pre>
-</div>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAInformation.property-details"></a><h2>Property Details</h2>
-<div class="refsect2">
-<a name="GUPnPDLNAInformation--info"></a><h3>The <code class="literal">"info"</code> property</h3>
-<pre class="programlisting">  "info"                     <span class="type">GstDiscovererInfo</span>*    : Read / Write / Construct Only</pre>
-<p>Metadata of the stream in a GstDiscovererInfo structure.</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GUPnPDLNAInformation--mime"></a><h3>The <code class="literal">"mime"</code> property</h3>
-<pre class="programlisting">  "mime"                     <span class="type">gchar</span>*                : Read / Write / Construct Only</pre>
-<p>The DLNA MIME type of the stream.</p>
-<p>Default value: NULL</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GUPnPDLNAInformation--name"></a><h3>The <code class="literal">"name"</code> property</h3>
-<pre class="programlisting">  "name"                     <span class="type">gchar</span>*                : Read / Write / Construct Only</pre>
-<p>The name of the DLNA profile corresponding to the strream.</p>
-<p>Default value: NULL</p>
-</div>
-</div>
-</div>
-<div class="footer">
-<hr>
-          Generated by GTK-Doc V1.18</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/doc/html/GUPnPDLNAProfile.html b/doc/html/GUPnPDLNAProfile.html
deleted file mode 100644 (file)
index f5bdafa..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>GUPnPDLNAProfile</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
-<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
-<link rel="up" href="ch01.html" title="GUPnP DLNA">
-<link rel="prev" href="GUPnPDLNAInformation.html" title="GUPnPDLNAInformation">
-<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
-<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
-<tr valign="middle">
-<td><a accesskey="p" href="GUPnPDLNAInformation.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
-<td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
-<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
-<td><a accesskey="n" href="annotation-glossary.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
-</tr>
-<tr><td colspan="5" class="shortcuts">
-<a href="#GUPnPDLNAProfile.synopsis" class="shortcut">Top</a>
-                  Â | 
-                  <a href="#GUPnPDLNAProfile.description" class="shortcut">Description</a>
-                  Â | 
-                  <a href="#GUPnPDLNAProfile.object-hierarchy" class="shortcut">Object Hierarchy</a>
-                  Â | 
-                  <a href="#GUPnPDLNAProfile.properties" class="shortcut">Properties</a>
-</td></tr>
-</table>
-<div class="refentry">
-<a name="GUPnPDLNAProfile"></a><div class="titlepage"></div>
-<div class="refnamediv"><table width="100%"><tr>
-<td valign="top">
-<h2><span class="refentrytitle"><a name="GUPnPDLNAProfile.top_of_page"></a>GUPnPDLNAProfile</span></h2>
-<p>GUPnPDLNAProfile â€” Object representing a DLNA profile</p>
-</td>
-<td valign="top" align="right"></td>
-</tr></table></div>
-<div class="refsynopsisdiv">
-<a name="GUPnPDLNAProfile.synopsis"></a><h2>Synopsis</h2>
-<pre class="synopsis">                    <a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile-struct" title="GUPnPDLNAProfile">GUPnPDLNAProfile</a>;
-                    <a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfileClass" title="GUPnPDLNAProfileClass">GUPnPDLNAProfileClass</a>;
-<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-new" title="gupnp_dlna_profile_new ()">gupnp_dlna_profile_new</a>              (<em class="parameter"><code><span class="type">gchar</span> *name</code></em>,
-                                                         <em class="parameter"><code><span class="type">gchar</span> *mime</code></em>,
-                                                         <em class="parameter"><code><span class="type">GstCaps</span> *container_caps</code></em>,
-                                                         <em class="parameter"><code><span class="type">GstCaps</span> *video_caps</code></em>,
-                                                         <em class="parameter"><code><span class="type">GstCaps</span> *audio_caps</code></em>,
-                                                         <em class="parameter"><code><span class="type">gboolean</span> extended</code></em>);
-const <span class="returnvalue">gchar</span> *       <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-name" title="gupnp_dlna_profile_get_name ()">gupnp_dlna_profile_get_name</a>         (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *self</code></em>);
-const <span class="returnvalue">gchar</span> *       <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-mime" title="gupnp_dlna_profile_get_mime ()">gupnp_dlna_profile_get_mime</a>         (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *self</code></em>);
-<span class="returnvalue">GstEncodingProfile</span> * <a class="link" href="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-encoding-profile" title="gupnp_dlna_profile_get_encoding_profile ()">gupnp_dlna_profile_get_encoding_profile</a>
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *self</code></em>);
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAProfile.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="synopsis">
-  GObject
-   +----GUPnPDLNAProfile
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAProfile.properties"></a><h2>Properties</h2>
-<pre class="synopsis">
-  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--encoding-profile" title='The "encoding-profile" property'>encoding-profile</a>"         <span class="type">GstEncodingProfile</span>*   : Read
-  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--extended" title='The "extended" property'>extended</a>"                 <span class="type">gboolean</span>              : Read / Write / Construct Only
-  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--mime" title='The "mime" property'>mime</a>"                     <span class="type">gchar</span>*                : Read / Write / Construct Only
-  "<a class="link" href="GUPnPDLNAProfile.html#GUPnPDLNAProfile--name" title='The "name" property'>name</a>"                     <span class="type">gchar</span>*                : Read / Write / Construct Only
-</pre>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAProfile.description"></a><h2>Description</h2>
-<p>
-The <a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> object provides a few APIs that return
-<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> objects. These represent a single DLNA profile. Each
-<a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> has a name (the name of the DLNA profile), the
-corresponding MIME type, and a <span class="type">GstEncodingProfile</span> which represents the
-various audio/video/container restrictions specified for that DLNA profile.
-</p>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAProfile.details"></a><h2>Details</h2>
-<div class="refsect2">
-<a name="GUPnPDLNAProfile-struct"></a><h3>GUPnPDLNAProfile</h3>
-<pre class="programlisting">typedef struct _GUPnPDLNAProfile GUPnPDLNAProfile;</pre>
-<p>
-The top-level object used for the in-memory representation of the DLNA
-Profiles.
-</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GUPnPDLNAProfileClass"></a><h3>GUPnPDLNAProfileClass</h3>
-<pre class="programlisting">typedef struct {
-        GObjectClass parent_class;
-} GUPnPDLNAProfileClass;
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-profile-new"></a><h3>gupnp_dlna_profile_new ()</h3>
-<pre class="programlisting"><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="returnvalue">GUPnPDLNAProfile</span></a> *  gupnp_dlna_profile_new              (<em class="parameter"><code><span class="type">gchar</span> *name</code></em>,
-                                                         <em class="parameter"><code><span class="type">gchar</span> *mime</code></em>,
-                                                         <em class="parameter"><code><span class="type">GstCaps</span> *container_caps</code></em>,
-                                                         <em class="parameter"><code><span class="type">GstCaps</span> *video_caps</code></em>,
-                                                         <em class="parameter"><code><span class="type">GstCaps</span> *audio_caps</code></em>,
-                                                         <em class="parameter"><code><span class="type">gboolean</span> extended</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-profile-get-name"></a><h3>gupnp_dlna_profile_get_name ()</h3>
-<pre class="programlisting">const <span class="returnvalue">gchar</span> *       gupnp_dlna_profile_get_name         (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *self</code></em>);</pre>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> object</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the name of the DLNA profile represented by <em class="parameter"><code>self</code></em>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-profile-get-mime"></a><h3>gupnp_dlna_profile_get_mime ()</h3>
-<pre class="programlisting">const <span class="returnvalue">gchar</span> *       gupnp_dlna_profile_get_mime         (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *self</code></em>);</pre>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> object</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the DLNA MIME type of the DLNA profile represented by <em class="parameter"><code>self</code></em>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gupnp-dlna-profile-get-encoding-profile"></a><h3>gupnp_dlna_profile_get_encoding_profile ()</h3>
-<pre class="programlisting"><span class="returnvalue">GstEncodingProfile</span> * gupnp_dlna_profile_get_encoding_profile
-                                                        (<em class="parameter"><code><a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> *self</code></em>);</pre>
-<div class="variablelist"><table border="0">
-<col align="left" valign="top">
-<tbody>
-<tr>
-<td><p><span class="term"><em class="parameter"><code>self</code></em> :</span></p></td>
-<td>The <a class="link" href="GUPnPDLNAProfile.html" title="GUPnPDLNAProfile"><span class="type">GUPnPDLNAProfile</span></a> object</td>
-</tr>
-<tr>
-<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a <span class="type">GstEncodingProfile</span> object that, in a future
-version, can be used to transcode a given stream to match the DLNA
-profile represented by <em class="parameter"><code>self</code></em>.
-The receiver must unref the returned <span class="type">GstEncodingProfile</span> when done
-using it. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<div class="refsect1">
-<a name="GUPnPDLNAProfile.property-details"></a><h2>Property Details</h2>
-<div class="refsect2">
-<a name="GUPnPDLNAProfile--encoding-profile"></a><h3>The <code class="literal">"encoding-profile"</code> property</h3>
-<pre class="programlisting">  "encoding-profile"         <span class="type">GstEncodingProfile</span>*   : Read</pre>
-<p>GstEncodingProfile objectcorresponding to the DLNA profile.</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GUPnPDLNAProfile--extended"></a><h3>The <code class="literal">"extended"</code> property</h3>
-<pre class="programlisting">  "extended"                 <span class="type">gboolean</span>              : Read / Write / Construct Only</pre>
-<p>Indicates that this profile is not part of the DLNA specification.</p>
-<p>Default value: FALSE</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GUPnPDLNAProfile--mime"></a><h3>The <code class="literal">"mime"</code> property</h3>
-<pre class="programlisting">  "mime"                     <span class="type">gchar</span>*                : Read / Write / Construct Only</pre>
-<p>The MIME type of the DLNA profile.</p>
-<p>Default value: NULL</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GUPnPDLNAProfile--name"></a><h3>The <code class="literal">"name"</code> property</h3>
-<pre class="programlisting">  "name"                     <span class="type">gchar</span>*                : Read / Write / Construct Only</pre>
-<p>The name of the DLNA profile .</p>
-<p>Default value: NULL</p>
-</div>
-</div>
-</div>
-<div class="footer">
-<hr>
-          Generated by GTK-Doc V1.18</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/doc/html/ch01.html b/doc/html/ch01.html
deleted file mode 100644 (file)
index 07403b1..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>GUPnP DLNA</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
-<link rel="home" href="index.html" title="GUPnP DLNA Reference Manual">
-<link rel="up" href="index.html" title="GUPnP DLNA Reference Manual">
-<link rel="prev" href="index.html" title="GUPnP DLNA Reference Manual">
-<link rel="next" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer">
-<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
-<td><a accesskey="p" href="index.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
-<td> </td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
-<th width="100%" align="center">GUPnP DLNA Reference Manual</th>
-<td><a accesskey="n" href="GUPnPDLNADiscoverer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="chapter">
-<div class="titlepage"><div><div><h2 class="title">
-<a name="idp2511320"></a>GUPnP DLNA</h2></div></div></div>
-<div class="toc"><dl>
-<dt>
-<span class="refentrytitle"><a href="GUPnPDLNADiscoverer.html">GUPnPDLNADiscoverer</a></span><span class="refpurpose"> â€” Utility API for discovering DLNA profile/mime type and
-other metadata for given media.</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="GUPnPDLNAInformation.html">GUPnPDLNAInformation</a></span><span class="refpurpose"> â€” Object containing metadata information returned by the
-<a class="link" href="GUPnPDLNADiscoverer.html" title="GUPnPDLNADiscoverer"><span class="type">GUPnPDLNADiscoverer</span></a> API</span>
-</dt>
-<dt>
-<span class="refentrytitle"><a href="GUPnPDLNAProfile.html">GUPnPDLNAProfile</a></span><span class="refpurpose"> â€” Object representing a DLNA profile</span>
-</dt>
-</dl></div>
-<p>
-      GUPnP DLNA is a set of utility APIs to simplify DLNA-specific bits of
-      MediaServer implementations, such as DLNA media profile guessing.
-    </p>
-<p>
-      Before using the GUPnP DLNA API, you must initialise GStreamer by calling
-      gst_init() or gst_init_check().
-    </p>
-</div>
-<div class="footer">
-<hr>
-          Generated by GTK-Doc V1.18</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/doc/html/gupnp-dlna.devhelp2 b/doc/html/gupnp-dlna.devhelp2
deleted file mode 100644 (file)
index 8c92e1c..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
-<book xmlns="http://www.devhelp.net/book" title="GUPnP DLNA Reference Manual" link="index.html" author="" name="gupnp-dlna" version="2" language="c">
-  <chapters>
-    <sub name="GUPnP DLNA" link="ch01.html">
-      <sub name="GUPnPDLNADiscoverer" link="GUPnPDLNADiscoverer.html"/>
-      <sub name="GUPnPDLNAInformation" link="GUPnPDLNAInformation.html"/>
-      <sub name="GUPnPDLNAProfile" link="GUPnPDLNAProfile.html"/>
-    </sub>
-    <sub name="Annotation Glossary" link="annotation-glossary.html"/>
-  </chapters>
-  <functions>
-    <keyword type="struct" name="GUPnPDLNADiscoverer" link="GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer-struct"/>
-    <keyword type="function" name="gupnp_dlna_discoverer_new ()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-new"/>
-    <keyword type="macro" name="gupnp_dlna_discoverer_start()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-start"/>
-    <keyword type="macro" name="gupnp_dlna_discoverer_stop()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-stop"/>
-    <keyword type="function" name="gupnp_dlna_discoverer_discover_uri ()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-discover-uri"/>
-    <keyword type="function" name="gupnp_dlna_discoverer_discover_uri_sync ()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-discover-uri-sync"/>
-    <keyword type="function" name="gupnp_dlna_discoverer_get_profile ()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-profile"/>
-    <keyword type="function" name="gupnp_dlna_discoverer_list_profiles ()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-list-profiles"/>
-    <keyword type="function" name="gupnp_dlna_discoverer_get_relaxed_mode ()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-relaxed-mode"/>
-    <keyword type="function" name="gupnp_dlna_discoverer_get_extended_mode ()" link="GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-extended-mode"/>
-    <keyword type="property" name="The &quot;extended-mode&quot; property" link="GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer--extended-mode"/>
-    <keyword type="property" name="The &quot;relaxed-mode&quot; property" link="GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer--relaxed-mode"/>
-    <keyword type="signal" name="The &quot;done&quot; signal" link="GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer-done"/>
-    <keyword type="struct" name="GUPnPDLNAInformation" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation-struct"/>
-    <keyword type="function" name="gupnp_dlna_information_new ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-new"/>
-    <keyword type="function" name="gupnp_dlna_information_get_name ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-get-name"/>
-    <keyword type="function" name="gupnp_dlna_information_get_mime ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-get-mime"/>
-    <keyword type="function" name="gupnp_dlna_information_get_info ()" link="GUPnPDLNAInformation.html#gupnp-dlna-information-get-info"/>
-    <keyword type="property" name="The &quot;info&quot; property" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation--info"/>
-    <keyword type="property" name="The &quot;mime&quot; property" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation--mime"/>
-    <keyword type="property" name="The &quot;name&quot; property" link="GUPnPDLNAInformation.html#GUPnPDLNAInformation--name"/>
-    <keyword type="struct" name="GUPnPDLNAProfile" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile-struct"/>
-    <keyword type="struct" name="GUPnPDLNAProfileClass" link="GUPnPDLNAProfile.html#GUPnPDLNAProfileClass"/>
-    <keyword type="function" name="gupnp_dlna_profile_new ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-new"/>
-    <keyword type="function" name="gupnp_dlna_profile_get_name ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-name"/>
-    <keyword type="function" name="gupnp_dlna_profile_get_mime ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-mime"/>
-    <keyword type="function" name="gupnp_dlna_profile_get_encoding_profile ()" link="GUPnPDLNAProfile.html#gupnp-dlna-profile-get-encoding-profile"/>
-    <keyword type="property" name="The &quot;encoding-profile&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--encoding-profile"/>
-    <keyword type="property" name="The &quot;extended&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--extended"/>
-    <keyword type="property" name="The &quot;mime&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--mime"/>
-    <keyword type="property" name="The &quot;name&quot; property" link="GUPnPDLNAProfile.html#GUPnPDLNAProfile--name"/>
-  </functions>
-</book>
diff --git a/doc/html/index.sgml b/doc/html/index.sgml
deleted file mode 100644 (file)
index 57d06fb..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<ANCHOR id="GUPnPDLNADiscoverer" href="gupnp-dlna/GUPnPDLNADiscoverer.html">
-<ANCHOR id="GUPnPDLNADiscoverer.synopsis" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer.synopsis">
-<ANCHOR id="GUPnPDLNADiscoverer.object-hierarchy" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer.object-hierarchy">
-<ANCHOR id="GUPnPDLNADiscoverer.properties" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer.properties">
-<ANCHOR id="GUPnPDLNADiscoverer.signals" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer.signals">
-<ANCHOR id="GUPnPDLNADiscoverer.description" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer.description">
-<ANCHOR id="GUPnPDLNADiscoverer.details" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer.details">
-<ANCHOR id="GUPnPDLNADiscoverer-struct" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer-struct">
-<ANCHOR id="gupnp-dlna-discoverer-new" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-new">
-<ANCHOR id="gupnp-dlna-discoverer-start" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-start">
-<ANCHOR id="gupnp-dlna-discoverer-stop" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-stop">
-<ANCHOR id="gupnp-dlna-discoverer-discover-uri" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-discover-uri">
-<ANCHOR id="gupnp-dlna-discoverer-discover-uri-sync" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-discover-uri-sync">
-<ANCHOR id="gupnp-dlna-discoverer-get-profile" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-profile">
-<ANCHOR id="gupnp-dlna-discoverer-list-profiles" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-list-profiles">
-<ANCHOR id="gupnp-dlna-discoverer-get-relaxed-mode" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-relaxed-mode">
-<ANCHOR id="gupnp-dlna-discoverer-get-extended-mode" href="gupnp-dlna/GUPnPDLNADiscoverer.html#gupnp-dlna-discoverer-get-extended-mode">
-<ANCHOR id="GUPnPDLNADiscoverer.property-details" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer.property-details">
-<ANCHOR id="GUPnPDLNADiscoverer--extended-mode" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer--extended-mode">
-<ANCHOR id="GUPnPDLNADiscoverer--relaxed-mode" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer--relaxed-mode">
-<ANCHOR id="GUPnPDLNADiscoverer.signal-details" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer.signal-details">
-<ANCHOR id="GUPnPDLNADiscoverer-done" href="gupnp-dlna/GUPnPDLNADiscoverer.html#GUPnPDLNADiscoverer-done">
-<ANCHOR id="GUPnPDLNAInformation" href="gupnp-dlna/GUPnPDLNAInformation.html">
-<ANCHOR id="GUPnPDLNAInformation.synopsis" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.synopsis">
-<ANCHOR id="GUPnPDLNAInformation.object-hierarchy" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.object-hierarchy">
-<ANCHOR id="GUPnPDLNAInformation.properties" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.properties">
-<ANCHOR id="GUPnPDLNAInformation.description" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.description">
-<ANCHOR id="GUPnPDLNAInformation.details" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.details">
-<ANCHOR id="GUPnPDLNAInformation-struct" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation-struct">
-<ANCHOR id="gupnp-dlna-information-new" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-new">
-<ANCHOR id="gupnp-dlna-information-get-name" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-name">
-<ANCHOR id="gupnp-dlna-information-get-mime" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-mime">
-<ANCHOR id="gupnp-dlna-information-get-info" href="gupnp-dlna/GUPnPDLNAInformation.html#gupnp-dlna-information-get-info">
-<ANCHOR id="GUPnPDLNAInformation.property-details" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation.property-details">
-<ANCHOR id="GUPnPDLNAInformation--info" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation--info">
-<ANCHOR id="GUPnPDLNAInformation--mime" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation--mime">
-<ANCHOR id="GUPnPDLNAInformation--name" href="gupnp-dlna/GUPnPDLNAInformation.html#GUPnPDLNAInformation--name">
-<ANCHOR id="GUPnPDLNAProfile" href="gupnp-dlna/GUPnPDLNAProfile.html">
-<ANCHOR id="GUPnPDLNAProfile.synopsis" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.synopsis">
-<ANCHOR id="GUPnPDLNAProfile.object-hierarchy" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.object-hierarchy">
-<ANCHOR id="GUPnPDLNAProfile.properties" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.properties">
-<ANCHOR id="GUPnPDLNAProfile.description" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.description">
-<ANCHOR id="GUPnPDLNAProfile.details" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.details">
-<ANCHOR id="GUPnPDLNAProfile-struct" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile-struct">
-<ANCHOR id="GUPnPDLNAProfileClass" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfileClass">
-<ANCHOR id="gupnp-dlna-profile-new" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-new">
-<ANCHOR id="gupnp-dlna-profile-get-name" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-name">
-<ANCHOR id="gupnp-dlna-profile-get-mime" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-mime">
-<ANCHOR id="gupnp-dlna-profile-get-encoding-profile" href="gupnp-dlna/GUPnPDLNAProfile.html#gupnp-dlna-profile-get-encoding-profile">
-<ANCHOR id="GUPnPDLNAProfile.property-details" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile.property-details">
-<ANCHOR id="GUPnPDLNAProfile--encoding-profile" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--encoding-profile">
-<ANCHOR id="GUPnPDLNAProfile--extended" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--extended">
-<ANCHOR id="GUPnPDLNAProfile--mime" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--mime">
-<ANCHOR id="GUPnPDLNAProfile--name" href="gupnp-dlna/GUPnPDLNAProfile.html#GUPnPDLNAProfile--name">
-<ANCHOR id="annotation-glossterm-element-type" href="gupnp-dlna/annotation-glossary.html#annotation-glossterm-element-type">
-<ANCHOR id="annotation-glossterm-transfer full" href="gupnp-dlna/annotation-glossary.html#annotation-glossterm-transfer full">
-<ANCHOR id="annotation-glossterm-transfer none" href="gupnp-dlna/annotation-glossary.html#annotation-glossterm-transfer none">
index 05e8a45..78bc1ab 100644 (file)
@@ -1 +1 @@
-0.6.6
+0.10.0
diff --git a/gupnp-dlna-1.0-uninstalled.pc.in b/gupnp-dlna-1.0-uninstalled.pc.in
deleted file mode 100644 (file)
index f706b1a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=
-exec_prefix=
-libdir=${top_srcdir}/libgupnp-dlna
-includedir=${top_srcdir}/
-
-Name: gupnp-dlna-1.0
-Description: GObject-based AV specific UPnP library
-Version: @VERSION@
-Libs: ${libdir}/libgupnp-dlna-1.0.la
-Cflags: -I${includedir} -I$(top_srcdir)/gst-convenience/gst-libs
-Requires: gstreamer-0.10 gstreamer-base-0.10 gstreamer-video-0.10
diff --git a/gupnp-dlna-1.0.pc.in b/gupnp-dlna-1.0.pc.in
deleted file mode 100644 (file)
index 7f7c74a..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: gupnp-dlna-1.0
-Description: GObject-based AV specific UPnP library
-Version: @VERSION@
-Libs: -L${libdir} -lgupnp-dlna-1.0
-Cflags: -I${includedir}/gupnp-dlna-1.0
-Requires: gstreamer-0.10 gstreamer-base-0.10 gstreamer-video-0.10
diff --git a/gupnp-dlna-2.0.pc.in b/gupnp-dlna-2.0.pc.in
new file mode 100644 (file)
index 0000000..f6d3002
--- /dev/null
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: gupnp-dlna-2.0
+Description: GObject-based DLNA specific UPnP library
+Version: @VERSION@
+Libs: -L${libdir} -lgupnp-dlna-2.0
+Cflags: -I${includedir}/gupnp-dlna-2.0
+Requires: glib-2.0 gobject-2.0
+Requires.private: gmodule-2.0
diff --git a/gupnp-dlna-gst-2.0.pc.in b/gupnp-dlna-gst-2.0.pc.in
new file mode 100644 (file)
index 0000000..90a3a60
--- /dev/null
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: gupnp-dlna-gst-2.0
+Description: GStreamer specific utils using GUPnP-DLNA
+Version: @VERSION@
+Libs: -L${libdir} -lgupnp-dlna-gst-2.0
+Requires: glib-2.0 gobject-2.0 gupnp-dlna-2.0 gstreamer-@GST_MAJORMINOR@ gstreamer-pbutils-@GST_MAJORMINOR@
diff --git a/gupnp-dlna-gst-legacy-2.0.pc.in b/gupnp-dlna-gst-legacy-2.0.pc.in
new file mode 100644 (file)
index 0000000..3587bf3
--- /dev/null
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: gupnp-dlna-gst-legacy-2.0
+Description: GStreamer specific utils using GUPnP-DLNA
+Version: @VERSION@
+Libs: -L${libdir} -lgupnp-dlna-gst-legacy-2.0
+Requires: glib-2.0 gobject-2.0 gupnp-dlna-2.0 gstreamer-@GST_LEGACY_MAJORMINOR@ gstreamer-pbutils-@GST_LEGACY_MAJORMINOR@
diff --git a/gupnp-dlna-metadata-2.0.pc.in b/gupnp-dlna-metadata-2.0.pc.in
new file mode 100644 (file)
index 0000000..cd6fb4f
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+plugindir=@METADATA_DIRECTORY@
+
+Name: gupnp-dlna-metadata-2.0
+Description: Metadata extractor plugin development files for GUPnP-DLNA
+Version: @VERSION@
+Cflags: -I${includedir}/gupnp-dlna-2.0/metadata
+Requires: glib-2.0 gobject-2.0 gupnp-dlna-2.0
index 55f4ed2..7b34825 100644 (file)
 # increment age.
 # If any interfaces have been removed since the last public release, then set
 # age to 0.
+AUTOMAKE_OPTIONS=subdir-objects
+
 LTVERSION = $(GUPNP_DLNA_VERSION_INFO)
 
-shareddir = $(datadir)/gupnp-dlna
+include $(top_srcdir)/common.am
+
+libgupnp_dlna_incdir = \
+       $(includedir)/gupnp-dlna-2.0/libgupnp-dlna
+libgupnp_dlna_inc_HEADERS =
+noinst_LTLIBRARIES =
+pkglib_LTLIBRARIES =
+lib_LTLIBRARIES =
+dist_noinst_HEADERS =
+
+lib_LTLIBRARIES += libgupnp-dlna-2.0.la
 
-AM_CFLAGS = -I$(top_srcdir) \
-           $(LIBXML_CFLAGS) \
-           $(GST_CFLAGS) \
-           $(GST_PBU_CFLAGS) \
-           -DDATA_DIR='"$(shareddir)"' \
-           -DG_LOG_DOMAIN='"gupnp-dlna"'
+general_log_cflags = \
+       -DG_LOG_DOMAIN='"gupnp-dlna"'
 
-lib_LTLIBRARIES = libgupnp-dlna-1.0.la
+loader_log_cflags = \
+       -DG_LOG_DOMAIN='"gupnp-dlna-loader"'
 
-gupnp-dlna-marshal.c: gupnp-dlna-marshal.list
-       $(AM_V_GEN) \
-       $(GLIB_GENMARSHAL) --prefix=gupnp_dlna_marshal $(srcdir)/gupnp-dlna-marshal.list --header --body > gupnp-dlna-marshal.c
+guesser_log_cflags = \
+       -DG_LOG_DOMAIN='"gupnp-dlna-guesser"'
 
-gupnp-dlna-marshal.h: gupnp-dlna-marshal.list
-       $(AM_V_GEN) \
-       $(GLIB_GENMARSHAL) --prefix=gupnp_dlna_marshal $(srcdir)/gupnp-dlna-marshal.list --header > gupnp-dlna-marshal.h
+metadata_log_cflags = \
+       -DG_LOG_DOMAIN='"gupnp-dlna-metadata"'
 
-BUILT_SOURCES = gupnp-dlna-marshal.c gupnp-dlna-marshal.h
+common_cflags = \
+       $(GLIB_CFLAGS) \
+       $(GOBJECT_CFLAGS) \
+       -I$(top_srcdir)
 
-libgupnp_dlna_incdir = $(includedir)/gupnp-dlna-1.0/libgupnp-dlna
+metadata_cflags = \
+       -I$(top_srcdir)/libgupnp-dlna/metadata
 
-libgupnp_dlna_1_0_la_LDFLAGS = -version-info $(LTVERSION) -no-undefined
+common_libadd = \
+       $(GLIB_LIBS) \
+       $(GOBJECT_LIBS)
 
-libgupnp_dlna_inc_HEADERS = gupnp-dlna-profile.h \
-                           gupnp-dlna-information.h \
-                           gupnp-dlna-discoverer.h
+gupnp_ldflags = \
+       -version-info $(LTVERSION) \
+       -no-undefined
 
-noinst_HEADERS = profile-loading.h \
-                 gupnp-dlna-profile-private.h
+gupnp_cflags = \
+       $(common_cflags)
 
-introspection_sources = $(libgupnp_dlna_inc_HEADERS) \
-                       gupnp-dlna-information.c \
-                       gupnp-dlna-discoverer.c \
-                       gupnp-dlna-profile.c \
-                       gupnp-dlna-profiles.c \
-                       profile-loading.c
+gupnp_libadd = \
+       $(common_libadd)
 
-libgupnp_dlna_1_0_la_SOURCES = $(introspection_sources) \
-                              $(BUILT_SOURCES)
+include $(top_srcdir)/libgupnp-dlna/metadata/metadata.am
 
-libgupnp_dlna_1_0_la_LIBADD = $(LIBXML_LIBS) \
-                             $(GST_PBU_LIBS)
+metadatadir=$(METADATA_DIRECTORY)
+metadata_LTLIBRARIES =
 
+if GSTREAMER_METADATA_BACKEND_ENABLED
+include $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer/gstreamer.am
+endif
+
+if GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED
+include $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer-legacy/gstreamer.am
+endif
+
+noinst_LTLIBRARIES += \
+       libloader.la \
+       libguesser.la \
+       libmetadata.la
+
+libloader_la_SOURCES = \
+       gupnp-dlna-profile-loader.c
+libloader_la_LIBADD = \
+       $(common_libadd) \
+       $(LIBXML_LIBS)
+libloader_la_CFLAGS = \
+       $(loader_log_cflags) \
+       $(metadata_cflags) \
+       $(common_cflags) \
+       $(LIBXML_CFLAGS) \
+       -DDATA_DIR='"$(shareddir)"'
+
+libguesser_la_SOURCES = \
+       gupnp-dlna-profile-guesser.c \
+       gupnp-dlna-profile-guesser-impl.c
+libguesser_la_LIBADD = \
+       $(common_libadd)
+libguesser_la_CFLAGS = \
+       $(guesser_log_cflags) \
+       $(metadata_cflags) \
+       $(common_cflags)
+
+libmetadata_la_SOURCES = \
+       gupnp-dlna-metadata-backend.c \
+       $(metadata_metadata_sources)
+libmetadata_la_LIBADD = \
+       $(common_libadd) \
+       $(GMODULE_LIBS)
+libmetadata_la_CFLAGS = \
+       $(metadata_log_cflags) \
+       $(metadata_cflags) \
+       $(GUPNP_DLNA_METADATA_BACKEND_CFLAGS) \
+       $(common_cflags) \
+       $(GMODULE_CFLAGS)
+
+libgupnp_dlna_2_0_la_LDFLAGS = \
+       $(gupnp_ldflags)
+libgupnp_dlna_2_0_la_SOURCES = \
+       gupnp-dlna-audio-information.c \
+       gupnp-dlna-container-information.c \
+       gupnp-dlna-image-information.c \
+       gupnp-dlna-information.c \
+       gupnp-dlna-video-information.c \
+       gupnp-dlna-field-value.c \
+       gupnp-dlna-profile.c \
+       gupnp-dlna-restriction.c \
+       gupnp-dlna-value-list.c \
+       gupnp-dlna-g-values.c \
+       gupnp-dlna-utils.c \
+       gupnp-dlna-value-type.c \
+       gupnp-dlna-info-value.c \
+       gupnp-dlna-value.c \
+       gupnp-dlna-info-set.c
+libgupnp_dlna_2_0_la_LIBADD = \
+       $(gupnp_libadd) \
+       libloader.la \
+       libguesser.la \
+       libmetadata.la
+libgupnp_dlna_2_0_la_CFLAGS = \
+       $(general_log_cflags) \
+       $(metadata_cflags) \
+       $(gupnp_cflags)
+
+libgupnp_dlna_inc_HEADERS += \
+       gupnp-dlna-profile-guesser.h \
+       gupnp-dlna-profile.h \
+       gupnp-dlna-restriction.h \
+       gupnp-dlna-value-list.h \
+       gupnp-dlna-g-values.h \
+       gupnp-dlna-audio-information.h \
+       gupnp-dlna-container-information.h \
+       gupnp-dlna-image-information.h \
+       gupnp-dlna-video-information.h \
+       gupnp-dlna-information.h \
+       gupnp-dlna-values.h \
+       gupnp-dlna.h
+
+libgupnp_dlna_metadata_incdir = \
+       $(libgupnp_dlna_incdir)/metadata
+libgupnp_dlna_metadata_inc_HEADERS = \
+       metadata/gupnp-dlna-metadata-extractor.h
+
+dist_noinst_HEADERS += \
+       gupnp-dlna-field-value.h \
+       gupnp-dlna-metadata-backend.h \
+       gupnp-dlna-profile-loader.h \
+       gupnp-dlna-profile-guesser-impl.h \
+       gupnp-dlna-restriction-private.h \
+       gupnp-dlna-value-list-private.h \
+       gupnp-dlna-g-values-private.h \
+       gupnp-dlna-utils.h \
+       gupnp-dlna-value-union.h \
+       gupnp-dlna-value-type.h \
+       gupnp-dlna-info-value.h \
+       gupnp-dlna-value.h \
+       gupnp-dlna-info-set.h \
+       gupnp-dlna-profile-private.h
+
+
+# INTROSPECTION
 -include $(INTROSPECTION_MAKEFILE)
 INTROSPECTION_GIRS =
-INTROSPECTION_SCANNER_ARGS = --warn-all                                \
-                            --symbol-prefix=gupnp_dlna         \
-                            --identifier-prefix=GUPnPDLNA      \
-                            --add-include-path=$(top_srcdir) \
-                            --add-init-section="gst_init(NULL, NULL);"
-INTROSPECTION_COMPILER_ARGS = --includedir=$(top_srcdir)
+INTROSPECTION_SCANNER_ARGS = \
+       --warn-all
+INTROSPECTION_COMPILER_ARGS = \
+       --includedir=$(top_srcdir)
 
 if HAVE_INTROSPECTION
-GUPnPDLNA-1.0.gir: libgupnp-dlna-1.0.la
-GUPnPDLNA_1_0_gir_INCLUDES = libxml2-2.0 GObject-2.0 GstPbutils-0.10
-GUPnPDLNA_1_0_gir_CFLAGS =  $(INCLUDES) $(AM_CFLAGS)
-GUPnPDLNA_1_0_gir_LIBS = libgupnp-dlna-1.0.la gstreamer-0.10
-GUPnPDLNA_1_0_gir_FILES = $(introspection_sources)
-GUPnPDLNA_1_0_gir_NAMESPACE = GUPnPDLNA
-GUPnPDLNA_1_0_gir_VERSION = 1.0
 
-INTROSPECTION_GIRS += GUPnPDLNA-1.0.gir
+girs = GUPnPDLNA-2.0.gir
+
+introspection_sources = \
+       gupnp-dlna-profile-guesser.h \
+       gupnp-dlna-profile.h \
+       gupnp-dlna-restriction.h \
+       gupnp-dlna-value-list.h \
+       gupnp-dlna-g-values.h \
+       gupnp-dlna-audio-information.h \
+       gupnp-dlna-container-information.h \
+       gupnp-dlna-image-information.h \
+       gupnp-dlna-video-information.h \
+       gupnp-dlna-information.h \
+       gupnp-dlna-values.h \
+       gupnp-dlna-profile-guesser.c \
+       gupnp-dlna-profile.c \
+       gupnp-dlna-restriction.c \
+       gupnp-dlna-value-list.c \
+       gupnp-dlna-g-values.c \
+       gupnp-dlna-audio-information.c \
+       gupnp-dlna-container-information.c \
+       gupnp-dlna-image-information.c \
+       gupnp-dlna-video-information.c \
+       gupnp-dlna-information.c
+
+GUPnPDLNA-2.0.gir: libgupnp-dlna-2.0.la
+GUPnPDLNA_2_0_gir_FILES = $(introspection_sources)
+GUPnPDLNA_2_0_gir_LIBS = libgupnp-dlna-2.0.la
+GUPnPDLNA_2_0_gir_INCLUDES = GObject-2.0
+GUPnPDLNA_2_0_gir_SCANNERFLAGS = \
+       --symbol-prefix=gupnp_dlna \
+       --identifier-prefix=GUPnPDLNA
+GUPnPDLNA_2_0_gir_CFLAGS = \
+       -I$(top_srcdir)
+
+if GSTREAMER_METADATA_BACKEND_ENABLED
+girs += GUPnPDLNAGst-2.0.gir
+
+gst_introspection_sources = \
+       metadata-backends/gstreamer/gupnp-dlna-gst-utils.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-utils.c
+
+GUPnPDLNAGst-2.0.gir: $(gstreamer_utils_lib) GUPnPDLNA-2.0.gir
+GUPnPDLNAGst_2_0_gir_FILES = $(gst_introspection_sources)
+GUPnPDLNAGst_2_0_gir_LIBS = $(gstreamer_utils_lib)
+GUPnPDLNAGst_2_0_gir_INCLUDES = GObject-2.0 GUPnPDLNA-2.0 Gst-1.0 GstPbutils-1.0
+GUPnPDLNAGst_2_0_gir_SCANNERFLAGS = \
+       --symbol-prefix=gupnp_dlna_gst \
+       --identifier-prefix=GUPnPDLNAGst \
+       --add-include-path=.
+GUPnPDLNAGst_2_0_gir_CFLAGS = \
+       -I$(top_srcdir)
+endif
+
+INTROSPECTION_GIRS += $(girs)
 
 girdir = $(datadir)/gir-1.0
-gir_DATA = GUPnPDLNA-1.0.gir
+gir_DATA = $(girs)
 
 typelibdir = $(libdir)/girepository-1.0/
 typelib_DATA = $(gir_DATA:.gir=.typelib)
-endif
 
-EXTRA_DIST = gupnp-dlna-marshal.list
+CLEANFILES = $(gir_DATA) $(typelib_DATA)
 
-CLEANFILES = $(BUILT_SOURCES) $(gir_DATA) $(typelib_DATA)
+endif
index da6a808..ed25e4c 100644 (file)
@@ -53,16 +53,58 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-@HAVE_INTROSPECTION_TRUE@am__append_1 = GUPnPDLNA-1.0.gir
+DIST_COMMON = $(am__dist_noinst_HEADERS_DIST) \
+       $(am__libgupnp_dlna_inc_HEADERS_DIST) \
+       $(libgupnp_dlna_metadata_inc_HEADERS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(top_srcdir)/common.am \
+       $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer-legacy/gstreamer.am \
+       $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer/gstreamer.am \
+       $(top_srcdir)/libgupnp-dlna/metadata/metadata.am
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am__append_1 = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gstreamer_metadata_backend)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am__append_2 = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gstreamer_utils_lib)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am__append_3 = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.h \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-container-information.h \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-image-information.h \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-information.h \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.h \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.h \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-video-information.h
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am__append_4 = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-utils.h
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am__append_5 = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gstreamer_legacy_metadata_backend)
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am__append_6 = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gstreamer_legacy_utils_lib)
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am__append_7 = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.h \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.h \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.h \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.h \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.h \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.h \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.h
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am__append_8 = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-legacy-utils.h
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@am__append_9 = GUPnPDLNAGst-2.0.gir
+@HAVE_INTROSPECTION_TRUE@am__append_10 = $(girs)
 subdir = libgupnp-dlna
-DIST_COMMON = $(libgupnp_dlna_inc_HEADERS) $(noinst_HEADERS) \
-       $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -96,26 +138,162 @@ am__uninstall_files_from_dir = { \
     || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
-       "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(libgupnp_dlna_incdir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(metadatadir)" \
+       "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(girdir)" \
+       "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(libgupnp_dlna_incdir)" \
+       "$(DESTDIR)$(libgupnp_dlna_metadata_incdir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(metadata_LTLIBRARIES) \
+       $(noinst_LTLIBRARIES) $(pkglib_LTLIBRARIES)
 am__DEPENDENCIES_1 =
-libgupnp_dlna_1_0_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-       $(am__DEPENDENCIES_1)
-am__objects_1 =
-am__objects_2 = $(am__objects_1) gupnp-dlna-information.lo \
-       gupnp-dlna-discoverer.lo gupnp-dlna-profile.lo \
-       gupnp-dlna-profiles.lo profile-loading.lo
-am__objects_3 = gupnp-dlna-marshal.lo
-am_libgupnp_dlna_1_0_la_OBJECTS = $(am__objects_2) $(am__objects_3)
-libgupnp_dlna_1_0_la_OBJECTS = $(am_libgupnp_dlna_1_0_la_OBJECTS)
+am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+libguesser_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_libguesser_la_OBJECTS =  \
+       libguesser_la-gupnp-dlna-profile-guesser.lo \
+       libguesser_la-gupnp-dlna-profile-guesser-impl.lo
+libguesser_la_OBJECTS = $(am_libguesser_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
-libgupnp_dlna_1_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+libguesser_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libguesser_la_CFLAGS) \
+       $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2)
+libgupnp_dlna_2_0_la_DEPENDENCIES = $(am__DEPENDENCIES_3) libloader.la \
+       libguesser.la libmetadata.la
+am_libgupnp_dlna_2_0_la_OBJECTS =  \
+       libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-container-information.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-image-information.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-information.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-video-information.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-field-value.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-profile.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-restriction.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-value-list.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-g-values.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-utils.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-value-type.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-info-value.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-value.lo \
+       libgupnp_dlna_2_0_la-gupnp-dlna-info-set.lo
+libgupnp_dlna_2_0_la_OBJECTS = $(am_libgupnp_dlna_2_0_la_OBJECTS)
+libgupnp_dlna_2_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
        $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-       $(AM_CFLAGS) $(CFLAGS) $(libgupnp_dlna_1_0_la_LDFLAGS) \
+       $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) \
+       $(libgupnp_dlna_2_0_la_LDFLAGS) $(LDFLAGS) -o $@
+libloader_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+       $(am__DEPENDENCIES_1)
+am_libloader_la_OBJECTS = libloader_la-gupnp-dlna-profile-loader.lo
+libloader_la_OBJECTS = $(am_libloader_la_OBJECTS)
+libloader_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libloader_la_CFLAGS) \
+       $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+libmetadata_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+       $(am__DEPENDENCIES_1)
+am__dirstamp = $(am__leading_dot)dirstamp
+am__objects_1 =  \
+       metadata/libmetadata_la-gupnp-dlna-metadata-extractor.lo
+am_libmetadata_la_OBJECTS =  \
+       libmetadata_la-gupnp-dlna-metadata-backend.lo $(am__objects_1)
+libmetadata_la_OBJECTS = $(am_libmetadata_la_OBJECTS)
+libmetadata_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(libmetadata_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+       $@
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_2) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(am__DEPENDENCIES_1) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(am__DEPENDENCIES_1) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       libgupnp-dlna-2.0.la
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_DEPENDENCIES = $(am__DEPENDENCIES_4) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gstreamer_legacy_utils_lib)
+am__metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_SOURCES_DIST = metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am_metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_OBJECTS = metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.lo \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.lo
+metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_OBJECTS = $(am_metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_OBJECTS)
+metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_LINK =  \
+       $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_CFLAGS) \
+       $(CFLAGS) \
+       $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_LDFLAGS) \
+       $(LDFLAGS) -o $@
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am_metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_rpath =  \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       -rpath \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(metadatadir)
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_DEPENDENCIES = $(am__DEPENDENCIES_4)
+am__metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_SOURCES_DIST = metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am_metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_OBJECTS = metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.lo \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.lo \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.lo \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.lo \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.lo \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.lo \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.lo
+metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_OBJECTS = $(am_metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_OBJECTS)
+metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_LINK =  \
+       $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) \
+       $(CFLAGS) \
+       $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_LDFLAGS) \
        $(LDFLAGS) -o $@
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@am_metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_rpath =  \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       -rpath \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(libdir)
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_2) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(am__DEPENDENCIES_1) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(am__DEPENDENCIES_1) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      libgupnp-dlna-2.0.la
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgstreamer_la_DEPENDENCIES = $(am__DEPENDENCIES_5) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gstreamer_utils_lib)
+am__metadata_backends_gstreamer_libgstreamer_la_SOURCES_DIST =  \
+       metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am_metadata_backends_gstreamer_libgstreamer_la_OBJECTS = metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.lo \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.lo
+metadata_backends_gstreamer_libgstreamer_la_OBJECTS =  \
+       $(am_metadata_backends_gstreamer_libgstreamer_la_OBJECTS)
+metadata_backends_gstreamer_libgstreamer_la_LINK = $(LIBTOOL) \
+       $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+       --mode=link $(CCLD) \
+       $(metadata_backends_gstreamer_libgstreamer_la_CFLAGS) \
+       $(CFLAGS) \
+       $(metadata_backends_gstreamer_libgstreamer_la_LDFLAGS) \
+       $(LDFLAGS) -o $@
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am_metadata_backends_gstreamer_libgstreamer_la_rpath =  \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      -rpath $(metadatadir)
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_DEPENDENCIES = $(am__DEPENDENCIES_5)
+am__metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_SOURCES_DIST = metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-information.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-utils.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am_metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_OBJECTS = metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.lo \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.lo \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.lo \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.lo \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.lo \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.lo \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.lo
+metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_OBJECTS = $(am_metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_OBJECTS)
+metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_LINK =  \
+       $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) \
+       $(CFLAGS) \
+       $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_LDFLAGS) \
+       $(LDFLAGS) -o $@
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@am_metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_rpath =  \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      -rpath $(libdir)
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
@@ -142,15 +320,58 @@ am__v_CCLD_0 = @echo "  CCLD  " $@;
 AM_V_GEN = $(am__v_GEN_@AM_V@)
 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(libgupnp_dlna_1_0_la_SOURCES)
-DIST_SOURCES = $(libgupnp_dlna_1_0_la_SOURCES)
+SOURCES = $(libguesser_la_SOURCES) $(libgupnp_dlna_2_0_la_SOURCES) \
+       $(libloader_la_SOURCES) $(libmetadata_la_SOURCES) \
+       $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_SOURCES) \
+       $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_SOURCES) \
+       $(metadata_backends_gstreamer_libgstreamer_la_SOURCES) \
+       $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_SOURCES)
+DIST_SOURCES = $(libguesser_la_SOURCES) \
+       $(libgupnp_dlna_2_0_la_SOURCES) $(libloader_la_SOURCES) \
+       $(libmetadata_la_SOURCES) \
+       $(am__metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_SOURCES_DIST) \
+       $(am__metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_SOURCES_DIST) \
+       $(am__metadata_backends_gstreamer_libgstreamer_la_SOURCES_DIST) \
+       $(am__metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_SOURCES_DIST)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 DATA = $(gir_DATA) $(typelib_DATA)
-HEADERS = $(libgupnp_dlna_inc_HEADERS) $(noinst_HEADERS)
+am__dist_noinst_HEADERS_DIST = metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-container-information.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-image-information.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-information.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-video-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.h \
+       gupnp-dlna-field-value.h gupnp-dlna-metadata-backend.h \
+       gupnp-dlna-profile-loader.h gupnp-dlna-profile-guesser-impl.h \
+       gupnp-dlna-restriction-private.h \
+       gupnp-dlna-value-list-private.h gupnp-dlna-g-values-private.h \
+       gupnp-dlna-utils.h gupnp-dlna-value-union.h \
+       gupnp-dlna-value-type.h gupnp-dlna-info-value.h \
+       gupnp-dlna-value.h gupnp-dlna-info-set.h \
+       gupnp-dlna-profile-private.h
+am__libgupnp_dlna_inc_HEADERS_DIST =  \
+       metadata-backends/gstreamer/gupnp-dlna-gst-utils.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-legacy-utils.h \
+       gupnp-dlna-profile-guesser.h gupnp-dlna-profile.h \
+       gupnp-dlna-restriction.h gupnp-dlna-value-list.h \
+       gupnp-dlna-g-values.h gupnp-dlna-audio-information.h \
+       gupnp-dlna-container-information.h \
+       gupnp-dlna-image-information.h gupnp-dlna-video-information.h \
+       gupnp-dlna-information.h gupnp-dlna-values.h gupnp-dlna.h
+HEADERS = $(dist_noinst_HEADERS) $(libgupnp_dlna_inc_HEADERS) \
+       $(libgupnp_dlna_metadata_inc_HEADERS)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -180,18 +401,30 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
 GST_LIBS = @GST_LIBS@
 GST_MAJORMINOR = @GST_MAJORMINOR@
 GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
 GST_PBU_LIBS = @GST_PBU_LIBS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
 GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
 HTML_DIR = @HTML_DIR@
 INSTALL = @INSTALL@
@@ -217,8 +450,10 @@ LIBXML_LIBS = @LIBXML_LIBS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -242,6 +477,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -305,65 +541,318 @@ top_srcdir = @top_srcdir@
 # increment age.
 # If any interfaces have been removed since the last public release, then set
 # age to 0.
+AUTOMAKE_OPTIONS = subdir-objects
 LTVERSION = $(GUPNP_DLNA_VERSION_INFO)
-shareddir = $(datadir)/gupnp-dlna
-AM_CFLAGS = -I$(top_srcdir) \
-           $(LIBXML_CFLAGS) \
-           $(GST_CFLAGS) \
-           $(GST_PBU_CFLAGS) \
-           -DDATA_DIR='"$(shareddir)"' \
-           -DG_LOG_DOMAIN='"gupnp-dlna"'
-
-lib_LTLIBRARIES = libgupnp-dlna-1.0.la
-BUILT_SOURCES = gupnp-dlna-marshal.c gupnp-dlna-marshal.h
-libgupnp_dlna_incdir = $(includedir)/gupnp-dlna-1.0/libgupnp-dlna
-libgupnp_dlna_1_0_la_LDFLAGS = -version-info $(LTVERSION) -no-undefined
-libgupnp_dlna_inc_HEADERS = gupnp-dlna-profile.h \
-                           gupnp-dlna-information.h \
-                           gupnp-dlna-discoverer.h
-
-noinst_HEADERS = profile-loading.h \
-                 gupnp-dlna-profile-private.h
-
-introspection_sources = $(libgupnp_dlna_inc_HEADERS) \
-                       gupnp-dlna-information.c \
-                       gupnp-dlna-discoverer.c \
-                       gupnp-dlna-profile.c \
-                       gupnp-dlna-profiles.c \
-                       profile-loading.c
-
-libgupnp_dlna_1_0_la_SOURCES = $(introspection_sources) \
-                              $(BUILT_SOURCES)
-
-libgupnp_dlna_1_0_la_LIBADD = $(LIBXML_LIBS) \
-                             $(GST_PBU_LIBS)
-
-INTROSPECTION_GIRS = $(am__append_1)
-INTROSPECTION_SCANNER_ARGS = --warn-all                                \
-                            --symbol-prefix=gupnp_dlna         \
-                            --identifier-prefix=GUPnPDLNA      \
-                            --add-include-path=$(top_srcdir) \
-                            --add-init-section="gst_init(NULL, NULL);"
-
-INTROSPECTION_COMPILER_ARGS = --includedir=$(top_srcdir)
-@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_1_0_gir_INCLUDES = libxml2-2.0 GObject-2.0 GstPbutils-0.10
-@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_1_0_gir_CFLAGS = $(INCLUDES) $(AM_CFLAGS)
-@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_1_0_gir_LIBS = libgupnp-dlna-1.0.la gstreamer-0.10
-@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_1_0_gir_FILES = $(introspection_sources)
-@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_1_0_gir_NAMESPACE = GUPnPDLNA
-@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_1_0_gir_VERSION = 1.0
+shareddir = $(datadir)/gupnp-dlna-2.0
+libgupnp_dlna_incdir = \
+       $(includedir)/gupnp-dlna-2.0/libgupnp-dlna
+
+libgupnp_dlna_inc_HEADERS = $(am__append_4) $(am__append_8) \
+       gupnp-dlna-profile-guesser.h gupnp-dlna-profile.h \
+       gupnp-dlna-restriction.h gupnp-dlna-value-list.h \
+       gupnp-dlna-g-values.h gupnp-dlna-audio-information.h \
+       gupnp-dlna-container-information.h \
+       gupnp-dlna-image-information.h gupnp-dlna-video-information.h \
+       gupnp-dlna-information.h gupnp-dlna-values.h gupnp-dlna.h
+noinst_LTLIBRARIES = libloader.la libguesser.la libmetadata.la
+pkglib_LTLIBRARIES = 
+lib_LTLIBRARIES = libgupnp-dlna-2.0.la $(am__append_2) $(am__append_6)
+dist_noinst_HEADERS = $(am__append_3) $(am__append_7) \
+       gupnp-dlna-field-value.h gupnp-dlna-metadata-backend.h \
+       gupnp-dlna-profile-loader.h gupnp-dlna-profile-guesser-impl.h \
+       gupnp-dlna-restriction-private.h \
+       gupnp-dlna-value-list-private.h gupnp-dlna-g-values-private.h \
+       gupnp-dlna-utils.h gupnp-dlna-value-union.h \
+       gupnp-dlna-value-type.h gupnp-dlna-info-value.h \
+       gupnp-dlna-value.h gupnp-dlna-info-set.h \
+       gupnp-dlna-profile-private.h
+general_log_cflags = \
+       -DG_LOG_DOMAIN='"gupnp-dlna"'
+
+loader_log_cflags = \
+       -DG_LOG_DOMAIN='"gupnp-dlna-loader"'
+
+guesser_log_cflags = \
+       -DG_LOG_DOMAIN='"gupnp-dlna-guesser"'
+
+metadata_log_cflags = \
+       -DG_LOG_DOMAIN='"gupnp-dlna-metadata"'
+
+common_cflags = \
+       $(GLIB_CFLAGS) \
+       $(GOBJECT_CFLAGS) \
+       -I$(top_srcdir)
+
+metadata_cflags = \
+       -I$(top_srcdir)/libgupnp-dlna/metadata
+
+common_libadd = \
+       $(GLIB_LIBS) \
+       $(GOBJECT_LIBS)
+
+gupnp_ldflags = \
+       -version-info $(LTVERSION) \
+       -no-undefined
+
+gupnp_cflags = \
+       $(common_cflags)
+
+gupnp_libadd = \
+       $(common_libadd)
+
+metadata_metadata_sources = \
+       metadata/gupnp-dlna-metadata-extractor.c
+
+metadatadir = $(METADATA_DIRECTORY)
+metadata_LTLIBRARIES = $(am__append_1) $(am__append_5)
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@gst_metadata_backend_libadd = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(common_libadd) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(GST_LIBS) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(GST_PBU_LIBS) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      libgupnp-dlna-2.0.la
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@gst_metadata_backend_cflags = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(common_cflags) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(GST_CFLAGS) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(GST_PBU_CFLAGS) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(metadata_log_cflags) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(metadata_cflags)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@gstreamer_metadata_backend = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/libgstreamer.la
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@gstreamer_utils_lib = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/libgupnp-dlna-gst-2.0.la
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgstreamer_la_LDFLAGS = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      -no-undefined \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      -shared -fPIC -module -avoid-version -Wl,-z,defs
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgstreamer_la_SOURCES = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgstreamer_la_LIBADD = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gst_metadata_backend_libadd) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gstreamer_utils_lib)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgstreamer_la_CFLAGS = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gst_metadata_backend_cflags)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_LDFLAGS = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gupnp_ldflags)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_SOURCES = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-information.c \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-utils.c \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_LIBADD = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gst_metadata_backend_libadd)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@      $(gst_metadata_backend_cflags)
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@gst_legacy_metadata_backend_libadd = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(common_libadd) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(GST_LEGACY_LIBS) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(GST_PBU_LEGACY_LIBS) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       libgupnp-dlna-2.0.la
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@gst_legacy_metadata_backend_cflags = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(common_cflags) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(GST_LEGACY_CFLAGS) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(GST_PBU_LEGACY_CFLAGS) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(metadata_log_cflags) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(metadata_cflags)
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@gstreamer_legacy_metadata_backend = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/libgstreamer-legacy.la
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@gstreamer_legacy_utils_lib = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/libgupnp-dlna-gst-legacy-2.0.la
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_LDFLAGS = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       -no-undefined \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       -shared -fPIC -module -avoid-version -Wl,-z,defs
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_SOURCES = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_LIBADD = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gst_legacy_metadata_backend_libadd) \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gstreamer_legacy_utils_lib)
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_CFLAGS = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gst_legacy_metadata_backend_cflags)
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_LDFLAGS = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gupnp_ldflags)
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_SOURCES = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_LIBADD = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gst_legacy_metadata_backend_libadd)
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@       $(gst_legacy_metadata_backend_cflags)
+
+libloader_la_SOURCES = \
+       gupnp-dlna-profile-loader.c
+
+libloader_la_LIBADD = \
+       $(common_libadd) \
+       $(LIBXML_LIBS)
+
+libloader_la_CFLAGS = \
+       $(loader_log_cflags) \
+       $(metadata_cflags) \
+       $(common_cflags) \
+       $(LIBXML_CFLAGS) \
+       -DDATA_DIR='"$(shareddir)"'
+
+libguesser_la_SOURCES = \
+       gupnp-dlna-profile-guesser.c \
+       gupnp-dlna-profile-guesser-impl.c
+
+libguesser_la_LIBADD = \
+       $(common_libadd)
+
+libguesser_la_CFLAGS = \
+       $(guesser_log_cflags) \
+       $(metadata_cflags) \
+       $(common_cflags)
+
+libmetadata_la_SOURCES = \
+       gupnp-dlna-metadata-backend.c \
+       $(metadata_metadata_sources)
+
+libmetadata_la_LIBADD = \
+       $(common_libadd) \
+       $(GMODULE_LIBS)
+
+libmetadata_la_CFLAGS = \
+       $(metadata_log_cflags) \
+       $(metadata_cflags) \
+       $(GUPNP_DLNA_METADATA_BACKEND_CFLAGS) \
+       $(common_cflags) \
+       $(GMODULE_CFLAGS)
+
+libgupnp_dlna_2_0_la_LDFLAGS = \
+       $(gupnp_ldflags)
+
+libgupnp_dlna_2_0_la_SOURCES = \
+       gupnp-dlna-audio-information.c \
+       gupnp-dlna-container-information.c \
+       gupnp-dlna-image-information.c \
+       gupnp-dlna-information.c \
+       gupnp-dlna-video-information.c \
+       gupnp-dlna-field-value.c \
+       gupnp-dlna-profile.c \
+       gupnp-dlna-restriction.c \
+       gupnp-dlna-value-list.c \
+       gupnp-dlna-g-values.c \
+       gupnp-dlna-utils.c \
+       gupnp-dlna-value-type.c \
+       gupnp-dlna-info-value.c \
+       gupnp-dlna-value.c \
+       gupnp-dlna-info-set.c
+
+libgupnp_dlna_2_0_la_LIBADD = \
+       $(gupnp_libadd) \
+       libloader.la \
+       libguesser.la \
+       libmetadata.la
+
+libgupnp_dlna_2_0_la_CFLAGS = \
+       $(general_log_cflags) \
+       $(metadata_cflags) \
+       $(gupnp_cflags)
+
+libgupnp_dlna_metadata_incdir = \
+       $(libgupnp_dlna_incdir)/metadata
+
+libgupnp_dlna_metadata_inc_HEADERS = \
+       metadata/gupnp-dlna-metadata-extractor.h
+
+INTROSPECTION_GIRS = $(am__append_10)
+INTROSPECTION_SCANNER_ARGS = \
+       --warn-all
+
+INTROSPECTION_COMPILER_ARGS = \
+       --includedir=$(top_srcdir)
+
+@HAVE_INTROSPECTION_TRUE@girs = GUPnPDLNA-2.0.gir $(am__append_9)
+@HAVE_INTROSPECTION_TRUE@introspection_sources = \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-profile-guesser.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-profile.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-restriction.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-value-list.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-g-values.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-audio-information.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-container-information.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-image-information.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-video-information.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-information.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-values.h \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-profile-guesser.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-profile.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-restriction.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-value-list.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-g-values.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-audio-information.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-container-information.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-image-information.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-video-information.c \
+@HAVE_INTROSPECTION_TRUE@      gupnp-dlna-information.c
+
+@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_2_0_gir_FILES = $(introspection_sources)
+@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_2_0_gir_LIBS = libgupnp-dlna-2.0.la
+@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_2_0_gir_INCLUDES = GObject-2.0
+@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_2_0_gir_SCANNERFLAGS = \
+@HAVE_INTROSPECTION_TRUE@      --symbol-prefix=gupnp_dlna \
+@HAVE_INTROSPECTION_TRUE@      --identifier-prefix=GUPnPDLNA
+
+@HAVE_INTROSPECTION_TRUE@GUPnPDLNA_2_0_gir_CFLAGS = \
+@HAVE_INTROSPECTION_TRUE@      -I$(top_srcdir)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@gst_introspection_sources = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@     metadata-backends/gstreamer/gupnp-dlna-gst-utils.h \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@     metadata-backends/gstreamer/gupnp-dlna-gst-utils.c
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@GUPnPDLNAGst_2_0_gir_FILES = $(gst_introspection_sources)
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@GUPnPDLNAGst_2_0_gir_LIBS = $(gstreamer_utils_lib)
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@GUPnPDLNAGst_2_0_gir_INCLUDES = GObject-2.0 GUPnPDLNA-2.0 Gst-1.0 GstPbutils-1.0
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@GUPnPDLNAGst_2_0_gir_SCANNERFLAGS = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@     --symbol-prefix=gupnp_dlna_gst \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@     --identifier-prefix=GUPnPDLNAGst \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@     --add-include-path=.
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@GUPnPDLNAGst_2_0_gir_CFLAGS = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@     -I$(top_srcdir)
+
 @HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
-@HAVE_INTROSPECTION_TRUE@gir_DATA = GUPnPDLNA-1.0.gir
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(girs)
 @HAVE_INTROSPECTION_TRUE@typelibdir = $(libdir)/girepository-1.0/
 @HAVE_INTROSPECTION_TRUE@typelib_DATA = $(gir_DATA:.gir=.typelib)
-EXTRA_DIST = gupnp-dlna-marshal.list
-CLEANFILES = $(BUILT_SOURCES) $(gir_DATA) $(typelib_DATA)
-all: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) all-am
+@HAVE_INTROSPECTION_TRUE@CLEANFILES = $(gir_DATA) $(typelib_DATA)
+all: all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common.am $(top_srcdir)/libgupnp-dlna/metadata/metadata.am $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer/gstreamer.am $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer-legacy/gstreamer.am $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
            *$$dep*) \
@@ -384,13 +873,14 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
        esac;
+$(top_srcdir)/common.am $(top_srcdir)/libgupnp-dlna/metadata/metadata.am $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer/gstreamer.am $(top_srcdir)/libgupnp-dlna/metadata-backends/gstreamer-legacy/gstreamer.am:
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-$(top_srcdir)/configure:  $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@@ -425,48 +915,551 @@ clean-libLTLIBRARIES:
          echo "rm -f \"$${dir}/so_locations\""; \
          rm -f "$${dir}/so_locations"; \
        done
-libgupnp-dlna-1.0.la: $(libgupnp_dlna_1_0_la_OBJECTS) $(libgupnp_dlna_1_0_la_DEPENDENCIES) $(EXTRA_libgupnp_dlna_1_0_la_DEPENDENCIES) 
-       $(AM_V_CCLD)$(libgupnp_dlna_1_0_la_LINK) -rpath $(libdir) $(libgupnp_dlna_1_0_la_OBJECTS) $(libgupnp_dlna_1_0_la_LIBADD) $(LIBS)
+install-metadataLTLIBRARIES: $(metadata_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(metadata_LTLIBRARIES)'; test -n "$(metadatadir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(metadatadir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(metadatadir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(metadatadir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(metadatadir)"; \
+       }
+
+uninstall-metadataLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(metadata_LTLIBRARIES)'; test -n "$(metadatadir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(metadatadir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(metadatadir)/$$f"; \
+       done
+
+clean-metadataLTLIBRARIES:
+       -test -z "$(metadata_LTLIBRARIES)" || rm -f $(metadata_LTLIBRARIES)
+       @list='$(metadata_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+
+clean-noinstLTLIBRARIES:
+       -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+       @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+       @$(NORMAL_INSTALL)
+       @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+       list2=; for p in $$list; do \
+         if test -f $$p; then \
+           list2="$$list2 $$p"; \
+         else :; fi; \
+       done; \
+       test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+       }
+
+uninstall-pkglibLTLIBRARIES:
+       @$(NORMAL_UNINSTALL)
+       @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+       for p in $$list; do \
+         $(am__strip_dir) \
+         echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+         $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+       done
+
+clean-pkglibLTLIBRARIES:
+       -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+       @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+         dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+         test "$$dir" != "$$p" || dir=.; \
+         echo "rm -f \"$${dir}/so_locations\""; \
+         rm -f "$${dir}/so_locations"; \
+       done
+libguesser.la: $(libguesser_la_OBJECTS) $(libguesser_la_DEPENDENCIES) $(EXTRA_libguesser_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(libguesser_la_LINK)  $(libguesser_la_OBJECTS) $(libguesser_la_LIBADD) $(LIBS)
+libgupnp-dlna-2.0.la: $(libgupnp_dlna_2_0_la_OBJECTS) $(libgupnp_dlna_2_0_la_DEPENDENCIES) $(EXTRA_libgupnp_dlna_2_0_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(libgupnp_dlna_2_0_la_LINK) -rpath $(libdir) $(libgupnp_dlna_2_0_la_OBJECTS) $(libgupnp_dlna_2_0_la_LIBADD) $(LIBS)
+libloader.la: $(libloader_la_OBJECTS) $(libloader_la_DEPENDENCIES) $(EXTRA_libloader_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(libloader_la_LINK)  $(libloader_la_OBJECTS) $(libloader_la_LIBADD) $(LIBS)
+metadata/$(am__dirstamp):
+       @$(MKDIR_P) metadata
+       @: > metadata/$(am__dirstamp)
+metadata/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) metadata/$(DEPDIR)
+       @: > metadata/$(DEPDIR)/$(am__dirstamp)
+metadata/libmetadata_la-gupnp-dlna-metadata-extractor.lo:  \
+       metadata/$(am__dirstamp) metadata/$(DEPDIR)/$(am__dirstamp)
+libmetadata.la: $(libmetadata_la_OBJECTS) $(libmetadata_la_DEPENDENCIES) $(EXTRA_libmetadata_la_DEPENDENCIES) 
+       $(AM_V_CCLD)$(libmetadata_la_LINK)  $(libmetadata_la_OBJECTS) $(libmetadata_la_LIBADD) $(LIBS)
+metadata-backends/gstreamer-legacy/$(am__dirstamp):
+       @$(MKDIR_P) metadata-backends/gstreamer-legacy
+       @: > metadata-backends/gstreamer-legacy/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) metadata-backends/gstreamer-legacy/$(DEPDIR)
+       @: > metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/libgstreamer-legacy.la: $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_OBJECTS) $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_DEPENDENCIES) $(EXTRA_metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_DEPENDENCIES) metadata-backends/gstreamer-legacy/$(am__dirstamp)
+       $(AM_V_CCLD)$(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_LINK) $(am_metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_rpath) $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_OBJECTS) $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_LIBADD) $(LIBS)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.lo:  \
+       metadata-backends/gstreamer-legacy/$(am__dirstamp) \
+       metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer-legacy/libgupnp-dlna-gst-legacy-2.0.la: $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_OBJECTS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_DEPENDENCIES) $(EXTRA_metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_DEPENDENCIES) metadata-backends/gstreamer-legacy/$(am__dirstamp)
+       $(AM_V_CCLD)$(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_LINK) $(am_metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_rpath) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_OBJECTS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_LIBADD) $(LIBS)
+metadata-backends/gstreamer/$(am__dirstamp):
+       @$(MKDIR_P) metadata-backends/gstreamer
+       @: > metadata-backends/gstreamer/$(am__dirstamp)
+metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) metadata-backends/gstreamer/$(DEPDIR)
+       @: > metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/libgstreamer.la: $(metadata_backends_gstreamer_libgstreamer_la_OBJECTS) $(metadata_backends_gstreamer_libgstreamer_la_DEPENDENCIES) $(EXTRA_metadata_backends_gstreamer_libgstreamer_la_DEPENDENCIES) metadata-backends/gstreamer/$(am__dirstamp)
+       $(AM_V_CCLD)$(metadata_backends_gstreamer_libgstreamer_la_LINK) $(am_metadata_backends_gstreamer_libgstreamer_la_rpath) $(metadata_backends_gstreamer_libgstreamer_la_OBJECTS) $(metadata_backends_gstreamer_libgstreamer_la_LIBADD) $(LIBS)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.lo:  \
+       metadata-backends/gstreamer/$(am__dirstamp) \
+       metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+metadata-backends/gstreamer/libgupnp-dlna-gst-2.0.la: $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_OBJECTS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_DEPENDENCIES) $(EXTRA_metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_DEPENDENCIES) metadata-backends/gstreamer/$(am__dirstamp)
+       $(AM_V_CCLD)$(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_LINK) $(am_metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_rpath) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_OBJECTS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.lo
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.lo
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.lo
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.lo
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.lo
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.lo
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.lo
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.lo
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.lo
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.$(OBJEXT)
+       -rm -f metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.lo
+       -rm -f metadata/libmetadata_la-gupnp-dlna-metadata-extractor.$(OBJEXT)
+       -rm -f metadata/libmetadata_la-gupnp-dlna-metadata-extractor.lo
 
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-dlna-discoverer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-dlna-information.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-dlna-marshal.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-dlna-profile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-dlna-profiles.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/profile-loading.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguesser_la-gupnp-dlna-profile-guesser-impl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libguesser_la-gupnp-dlna-profile-guesser.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-container-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-field-value.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-g-values.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-image-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-info-set.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-info-value.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-profile.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-restriction.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value-list.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value-type.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-video-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libloader_la-gupnp-dlna-profile-loader.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmetadata_la-gupnp-dlna-metadata-backend.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@metadata/$(DEPDIR)/libmetadata_la-gupnp-dlna-metadata-extractor.Plo@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
 .c.lo:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@   $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Plo
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+libguesser_la-gupnp-dlna-profile-guesser.lo: gupnp-dlna-profile-guesser.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguesser_la_CFLAGS) $(CFLAGS) -MT libguesser_la-gupnp-dlna-profile-guesser.lo -MD -MP -MF $(DEPDIR)/libguesser_la-gupnp-dlna-profile-guesser.Tpo -c -o libguesser_la-gupnp-dlna-profile-guesser.lo `test -f 'gupnp-dlna-profile-guesser.c' || echo '$(srcdir)/'`gupnp-dlna-profile-guesser.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libguesser_la-gupnp-dlna-profile-guesser.Tpo $(DEPDIR)/libguesser_la-gupnp-dlna-profile-guesser.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-profile-guesser.c' object='libguesser_la-gupnp-dlna-profile-guesser.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguesser_la_CFLAGS) $(CFLAGS) -c -o libguesser_la-gupnp-dlna-profile-guesser.lo `test -f 'gupnp-dlna-profile-guesser.c' || echo '$(srcdir)/'`gupnp-dlna-profile-guesser.c
+
+libguesser_la-gupnp-dlna-profile-guesser-impl.lo: gupnp-dlna-profile-guesser-impl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguesser_la_CFLAGS) $(CFLAGS) -MT libguesser_la-gupnp-dlna-profile-guesser-impl.lo -MD -MP -MF $(DEPDIR)/libguesser_la-gupnp-dlna-profile-guesser-impl.Tpo -c -o libguesser_la-gupnp-dlna-profile-guesser-impl.lo `test -f 'gupnp-dlna-profile-guesser-impl.c' || echo '$(srcdir)/'`gupnp-dlna-profile-guesser-impl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libguesser_la-gupnp-dlna-profile-guesser-impl.Tpo $(DEPDIR)/libguesser_la-gupnp-dlna-profile-guesser-impl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-profile-guesser-impl.c' object='libguesser_la-gupnp-dlna-profile-guesser-impl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libguesser_la_CFLAGS) $(CFLAGS) -c -o libguesser_la-gupnp-dlna-profile-guesser-impl.lo `test -f 'gupnp-dlna-profile-guesser-impl.c' || echo '$(srcdir)/'`gupnp-dlna-profile-guesser-impl.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.lo: gupnp-dlna-audio-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.lo `test -f 'gupnp-dlna-audio-information.c' || echo '$(srcdir)/'`gupnp-dlna-audio-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-audio-information.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-audio-information.lo `test -f 'gupnp-dlna-audio-information.c' || echo '$(srcdir)/'`gupnp-dlna-audio-information.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-container-information.lo: gupnp-dlna-container-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-container-information.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-container-information.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-container-information.lo `test -f 'gupnp-dlna-container-information.c' || echo '$(srcdir)/'`gupnp-dlna-container-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-container-information.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-container-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-container-information.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-container-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-container-information.lo `test -f 'gupnp-dlna-container-information.c' || echo '$(srcdir)/'`gupnp-dlna-container-information.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-image-information.lo: gupnp-dlna-image-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-image-information.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-image-information.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-image-information.lo `test -f 'gupnp-dlna-image-information.c' || echo '$(srcdir)/'`gupnp-dlna-image-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-image-information.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-image-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-image-information.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-image-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-image-information.lo `test -f 'gupnp-dlna-image-information.c' || echo '$(srcdir)/'`gupnp-dlna-image-information.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-information.lo: gupnp-dlna-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-information.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-information.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-information.lo `test -f 'gupnp-dlna-information.c' || echo '$(srcdir)/'`gupnp-dlna-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-information.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-information.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-information.lo `test -f 'gupnp-dlna-information.c' || echo '$(srcdir)/'`gupnp-dlna-information.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-video-information.lo: gupnp-dlna-video-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-video-information.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-video-information.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-video-information.lo `test -f 'gupnp-dlna-video-information.c' || echo '$(srcdir)/'`gupnp-dlna-video-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-video-information.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-video-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-video-information.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-video-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-video-information.lo `test -f 'gupnp-dlna-video-information.c' || echo '$(srcdir)/'`gupnp-dlna-video-information.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-field-value.lo: gupnp-dlna-field-value.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-field-value.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-field-value.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-field-value.lo `test -f 'gupnp-dlna-field-value.c' || echo '$(srcdir)/'`gupnp-dlna-field-value.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-field-value.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-field-value.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-field-value.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-field-value.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-field-value.lo `test -f 'gupnp-dlna-field-value.c' || echo '$(srcdir)/'`gupnp-dlna-field-value.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-profile.lo: gupnp-dlna-profile.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-profile.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-profile.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-profile.lo `test -f 'gupnp-dlna-profile.c' || echo '$(srcdir)/'`gupnp-dlna-profile.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-profile.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-profile.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-profile.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-profile.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-profile.lo `test -f 'gupnp-dlna-profile.c' || echo '$(srcdir)/'`gupnp-dlna-profile.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-restriction.lo: gupnp-dlna-restriction.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-restriction.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-restriction.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-restriction.lo `test -f 'gupnp-dlna-restriction.c' || echo '$(srcdir)/'`gupnp-dlna-restriction.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-restriction.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-restriction.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-restriction.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-restriction.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-restriction.lo `test -f 'gupnp-dlna-restriction.c' || echo '$(srcdir)/'`gupnp-dlna-restriction.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-value-list.lo: gupnp-dlna-value-list.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-value-list.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value-list.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-value-list.lo `test -f 'gupnp-dlna-value-list.c' || echo '$(srcdir)/'`gupnp-dlna-value-list.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value-list.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value-list.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-value-list.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-value-list.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-value-list.lo `test -f 'gupnp-dlna-value-list.c' || echo '$(srcdir)/'`gupnp-dlna-value-list.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-g-values.lo: gupnp-dlna-g-values.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-g-values.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-g-values.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-g-values.lo `test -f 'gupnp-dlna-g-values.c' || echo '$(srcdir)/'`gupnp-dlna-g-values.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-g-values.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-g-values.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-g-values.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-g-values.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-g-values.lo `test -f 'gupnp-dlna-g-values.c' || echo '$(srcdir)/'`gupnp-dlna-g-values.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-utils.lo: gupnp-dlna-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-utils.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-utils.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-utils.lo `test -f 'gupnp-dlna-utils.c' || echo '$(srcdir)/'`gupnp-dlna-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-utils.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-utils.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-utils.lo `test -f 'gupnp-dlna-utils.c' || echo '$(srcdir)/'`gupnp-dlna-utils.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-value-type.lo: gupnp-dlna-value-type.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-value-type.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value-type.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-value-type.lo `test -f 'gupnp-dlna-value-type.c' || echo '$(srcdir)/'`gupnp-dlna-value-type.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value-type.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value-type.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-value-type.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-value-type.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-value-type.lo `test -f 'gupnp-dlna-value-type.c' || echo '$(srcdir)/'`gupnp-dlna-value-type.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-info-value.lo: gupnp-dlna-info-value.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-info-value.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-info-value.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-info-value.lo `test -f 'gupnp-dlna-info-value.c' || echo '$(srcdir)/'`gupnp-dlna-info-value.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-info-value.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-info-value.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-info-value.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-info-value.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-info-value.lo `test -f 'gupnp-dlna-info-value.c' || echo '$(srcdir)/'`gupnp-dlna-info-value.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-value.lo: gupnp-dlna-value.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-value.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-value.lo `test -f 'gupnp-dlna-value.c' || echo '$(srcdir)/'`gupnp-dlna-value.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-value.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-value.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-value.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-value.lo `test -f 'gupnp-dlna-value.c' || echo '$(srcdir)/'`gupnp-dlna-value.c
+
+libgupnp_dlna_2_0_la-gupnp-dlna-info-set.lo: gupnp-dlna-info-set.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -MT libgupnp_dlna_2_0_la-gupnp-dlna-info-set.lo -MD -MP -MF $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-info-set.Tpo -c -o libgupnp_dlna_2_0_la-gupnp-dlna-info-set.lo `test -f 'gupnp-dlna-info-set.c' || echo '$(srcdir)/'`gupnp-dlna-info-set.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-info-set.Tpo $(DEPDIR)/libgupnp_dlna_2_0_la-gupnp-dlna-info-set.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-info-set.c' object='libgupnp_dlna_2_0_la-gupnp-dlna-info-set.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgupnp_dlna_2_0_la_CFLAGS) $(CFLAGS) -c -o libgupnp_dlna_2_0_la-gupnp-dlna-info-set.lo `test -f 'gupnp-dlna-info-set.c' || echo '$(srcdir)/'`gupnp-dlna-info-set.c
+
+libloader_la-gupnp-dlna-profile-loader.lo: gupnp-dlna-profile-loader.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libloader_la_CFLAGS) $(CFLAGS) -MT libloader_la-gupnp-dlna-profile-loader.lo -MD -MP -MF $(DEPDIR)/libloader_la-gupnp-dlna-profile-loader.Tpo -c -o libloader_la-gupnp-dlna-profile-loader.lo `test -f 'gupnp-dlna-profile-loader.c' || echo '$(srcdir)/'`gupnp-dlna-profile-loader.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libloader_la-gupnp-dlna-profile-loader.Tpo $(DEPDIR)/libloader_la-gupnp-dlna-profile-loader.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-profile-loader.c' object='libloader_la-gupnp-dlna-profile-loader.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libloader_la_CFLAGS) $(CFLAGS) -c -o libloader_la-gupnp-dlna-profile-loader.lo `test -f 'gupnp-dlna-profile-loader.c' || echo '$(srcdir)/'`gupnp-dlna-profile-loader.c
+
+libmetadata_la-gupnp-dlna-metadata-backend.lo: gupnp-dlna-metadata-backend.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetadata_la_CFLAGS) $(CFLAGS) -MT libmetadata_la-gupnp-dlna-metadata-backend.lo -MD -MP -MF $(DEPDIR)/libmetadata_la-gupnp-dlna-metadata-backend.Tpo -c -o libmetadata_la-gupnp-dlna-metadata-backend.lo `test -f 'gupnp-dlna-metadata-backend.c' || echo '$(srcdir)/'`gupnp-dlna-metadata-backend.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libmetadata_la-gupnp-dlna-metadata-backend.Tpo $(DEPDIR)/libmetadata_la-gupnp-dlna-metadata-backend.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='gupnp-dlna-metadata-backend.c' object='libmetadata_la-gupnp-dlna-metadata-backend.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetadata_la_CFLAGS) $(CFLAGS) -c -o libmetadata_la-gupnp-dlna-metadata-backend.lo `test -f 'gupnp-dlna-metadata-backend.c' || echo '$(srcdir)/'`gupnp-dlna-metadata-backend.c
+
+metadata/libmetadata_la-gupnp-dlna-metadata-extractor.lo: metadata/gupnp-dlna-metadata-extractor.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetadata_la_CFLAGS) $(CFLAGS) -MT metadata/libmetadata_la-gupnp-dlna-metadata-extractor.lo -MD -MP -MF metadata/$(DEPDIR)/libmetadata_la-gupnp-dlna-metadata-extractor.Tpo -c -o metadata/libmetadata_la-gupnp-dlna-metadata-extractor.lo `test -f 'metadata/gupnp-dlna-metadata-extractor.c' || echo '$(srcdir)/'`metadata/gupnp-dlna-metadata-extractor.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata/$(DEPDIR)/libmetadata_la-gupnp-dlna-metadata-extractor.Tpo metadata/$(DEPDIR)/libmetadata_la-gupnp-dlna-metadata-extractor.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata/gupnp-dlna-metadata-extractor.c' object='metadata/libmetadata_la-gupnp-dlna-metadata-extractor.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libmetadata_la_CFLAGS) $(CFLAGS) -c -o metadata/libmetadata_la-gupnp-dlna-metadata-extractor.lo `test -f 'metadata/gupnp-dlna-metadata-extractor.c' || echo '$(srcdir)/'`metadata/gupnp-dlna-metadata-extractor.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-backend.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgstreamer_legacy_la-gupnp-dlna-gst-metadata-extractor.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-audio-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-container-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-image-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-info-utils.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-utils.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c
+
+metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.lo: metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.lo -MD -MP -MF metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.Tpo -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.Tpo metadata-backends/gstreamer-legacy/$(DEPDIR)/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c' object='metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer-legacy/metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la-gupnp-dlna-gst-video-information.lo `test -f 'metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.lo: metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgstreamer_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgstreamer_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-backend.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.lo: metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgstreamer_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgstreamer_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgstreamer_la-gupnp-dlna-gst-metadata-extractor.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.lo: metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-audio-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.lo: metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-container-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.lo: metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-image-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.lo: metadata-backends/gstreamer/gupnp-dlna-gst-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-information.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-information.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.lo: metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-info-utils.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.lo: metadata-backends/gstreamer/gupnp-dlna-gst-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-utils.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-utils.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-utils.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-utils.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-utils.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-utils.c
+
+metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.lo: metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -MT metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.lo -MD -MP -MF metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.Tpo -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.Tpo metadata-backends/gstreamer/$(DEPDIR)/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c' object='metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS) $(CFLAGS) -c -o metadata-backends/gstreamer/metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la-gupnp-dlna-gst-video-information.lo `test -f 'metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c' || echo '$(srcdir)/'`metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c
+
 mostlyclean-libtool:
        -rm -f *.lo
 
 clean-libtool:
        -rm -rf .libs _libs
+       -rm -rf metadata/.libs metadata/_libs
+       -rm -rf metadata-backends/gstreamer/.libs metadata-backends/gstreamer/_libs
+       -rm -rf metadata-backends/gstreamer-legacy/.libs metadata-backends/gstreamer-legacy/_libs
 install-girDATA: $(gir_DATA)
        @$(NORMAL_INSTALL)
        @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
@@ -530,6 +1523,27 @@ uninstall-libgupnp_dlna_incHEADERS:
        @list='$(libgupnp_dlna_inc_HEADERS)'; test -n "$(libgupnp_dlna_incdir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
        dir='$(DESTDIR)$(libgupnp_dlna_incdir)'; $(am__uninstall_files_from_dir)
+install-libgupnp_dlna_metadata_incHEADERS: $(libgupnp_dlna_metadata_inc_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(libgupnp_dlna_metadata_inc_HEADERS)'; test -n "$(libgupnp_dlna_metadata_incdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libgupnp_dlna_metadata_incdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libgupnp_dlna_metadata_incdir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libgupnp_dlna_metadata_incdir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgupnp_dlna_metadata_incdir)" || exit $$?; \
+       done
+
+uninstall-libgupnp_dlna_metadata_incHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(libgupnp_dlna_metadata_inc_HEADERS)'; test -n "$(libgupnp_dlna_metadata_incdir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(libgupnp_dlna_metadata_incdir)'; $(am__uninstall_files_from_dir)
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
        list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -614,15 +1628,13 @@ distdir: $(DISTFILES)
          fi; \
        done
 check-am: all-am
-check: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) check-am
+check: check-am
 all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
 installdirs:
-       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(libgupnp_dlna_incdir)"; do \
+       for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(metadatadir)" "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(libgupnp_dlna_incdir)" "$(DESTDIR)$(libgupnp_dlna_metadata_incdir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
-install: $(BUILT_SOURCES)
-       $(MAKE) $(AM_MAKEFLAGS) install-am
+install: install-am
 install-exec: install-exec-am
 install-data: install-data-am
 uninstall: uninstall-am
@@ -649,18 +1661,24 @@ clean-generic:
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -rm -f metadata-backends/gstreamer-legacy/$(DEPDIR)/$(am__dirstamp)
+       -rm -f metadata-backends/gstreamer-legacy/$(am__dirstamp)
+       -rm -f metadata-backends/gstreamer/$(DEPDIR)/$(am__dirstamp)
+       -rm -f metadata-backends/gstreamer/$(am__dirstamp)
+       -rm -f metadata/$(DEPDIR)/$(am__dirstamp)
+       -rm -f metadata/$(am__dirstamp)
 
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
-       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
 clean: clean-am
 
 clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-       mostlyclean-am
+       clean-metadataLTLIBRARIES clean-noinstLTLIBRARIES \
+       clean-pkglibLTLIBRARIES mostlyclean-am
 
 distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
+       -rm -rf ./$(DEPDIR) metadata-backends/gstreamer-legacy/$(DEPDIR) metadata-backends/gstreamer/$(DEPDIR) metadata/$(DEPDIR)
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-tags
@@ -678,13 +1696,14 @@ info: info-am
 info-am:
 
 install-data-am: install-girDATA install-libgupnp_dlna_incHEADERS \
-       install-typelibDATA
+       install-libgupnp_dlna_metadata_incHEADERS \
+       install-metadataLTLIBRARIES install-typelibDATA
 
 install-dvi: install-dvi-am
 
 install-dvi-am:
 
-install-exec-am: install-libLTLIBRARIES
+install-exec-am: install-libLTLIBRARIES install-pkglibLTLIBRARIES
 
 install-html: install-html-am
 
@@ -707,7 +1726,7 @@ install-ps-am:
 installcheck-am:
 
 maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
+       -rm -rf ./$(DEPDIR) metadata-backends/gstreamer-legacy/$(DEPDIR) metadata-backends/gstreamer/$(DEPDIR) metadata/$(DEPDIR)
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -725,39 +1744,43 @@ ps: ps-am
 ps-am:
 
 uninstall-am: uninstall-girDATA uninstall-libLTLIBRARIES \
-       uninstall-libgupnp_dlna_incHEADERS uninstall-typelibDATA
+       uninstall-libgupnp_dlna_incHEADERS \
+       uninstall-libgupnp_dlna_metadata_incHEADERS \
+       uninstall-metadataLTLIBRARIES uninstall-pkglibLTLIBRARIES \
+       uninstall-typelibDATA
 
-.MAKE: all check install install-am install-strip
+.MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-libLTLIBRARIES clean-libtool ctags distclean \
-       distclean-compile distclean-generic distclean-libtool \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-girDATA \
-       install-html install-html-am install-info install-info-am \
-       install-libLTLIBRARIES install-libgupnp_dlna_incHEADERS \
-       install-man install-pdf install-pdf-am install-ps \
-       install-ps-am install-strip install-typelibDATA installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am uninstall-girDATA \
-       uninstall-libLTLIBRARIES uninstall-libgupnp_dlna_incHEADERS \
+       clean-libLTLIBRARIES clean-libtool clean-metadataLTLIBRARIES \
+       clean-noinstLTLIBRARIES clean-pkglibLTLIBRARIES ctags \
+       distclean distclean-compile distclean-generic \
+       distclean-libtool distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-girDATA install-html install-html-am \
+       install-info install-info-am install-libLTLIBRARIES \
+       install-libgupnp_dlna_incHEADERS \
+       install-libgupnp_dlna_metadata_incHEADERS install-man \
+       install-metadataLTLIBRARIES install-pdf install-pdf-am \
+       install-pkglibLTLIBRARIES install-ps install-ps-am \
+       install-strip install-typelibDATA installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic \
+       mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-girDATA uninstall-libLTLIBRARIES \
+       uninstall-libgupnp_dlna_incHEADERS \
+       uninstall-libgupnp_dlna_metadata_incHEADERS \
+       uninstall-metadataLTLIBRARIES uninstall-pkglibLTLIBRARIES \
        uninstall-typelibDATA
 
 
-gupnp-dlna-marshal.c: gupnp-dlna-marshal.list
-       $(AM_V_GEN) \
-       $(GLIB_GENMARSHAL) --prefix=gupnp_dlna_marshal $(srcdir)/gupnp-dlna-marshal.list --header --body > gupnp-dlna-marshal.c
-
-gupnp-dlna-marshal.h: gupnp-dlna-marshal.list
-       $(AM_V_GEN) \
-       $(GLIB_GENMARSHAL) --prefix=gupnp_dlna_marshal $(srcdir)/gupnp-dlna-marshal.list --header > gupnp-dlna-marshal.h
-
+# INTROSPECTION
 -include $(INTROSPECTION_MAKEFILE)
 
-@HAVE_INTROSPECTION_TRUE@GUPnPDLNA-1.0.gir: libgupnp-dlna-1.0.la
+@HAVE_INTROSPECTION_TRUE@GUPnPDLNA-2.0.gir: libgupnp-dlna-2.0.la
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@GUPnPDLNAGst-2.0.gir: $(gstreamer_utils_lib) GUPnPDLNA-2.0.gir
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/libgupnp-dlna/gupnp-dlna-audio-information.c b/libgupnp-dlna/gupnp-dlna-audio-information.c
new file mode 100644 (file)
index 0000000..ed1f121
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gupnp-dlna-audio-information
+ * @short_description: Base class representing audio metadata needed
+ * for DLNA profiles matching.
+ * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
+ *
+ * #GUPnPDLNAAudioInformation holds all audio metadatas important for
+ * matching profiles. Note that it does not mean all data should be
+ * provided for every audio file as in some cases it does not make
+ * sense (e.g. WMA version does not make sense for MPEG audio files).
+ *
+ * For metadata attributes that do not exist in current audio file an
+ * unset value should be returned. For metadata attributes that do
+ * exist a set value with proper underlying value should be
+ * returned. In case metadata extractor has completely no clue how to
+ * extract some metadata attribute at all, an unsupported value should
+ * be returned. Note that unsupported values should be a temporary
+ * mean before fixing the multimedia framework to be able to extract
+ * such attribute.
+ *
+ * Note that gupnp_dlna_audio_information_get_mime() should always
+ * return a set value. Otherwise it is highly probably that the file
+ * will not match against any DLNA profile.
+ */
+
+#include "gupnp-dlna-audio-information.h"
+
+G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAAudioInformation,
+                        gupnp_dlna_audio_information,
+                        G_TYPE_OBJECT)
+
+struct _GUPnPDLNAAudioInformationPrivate {
+        gpointer placeholder;
+};
+
+static void
+gupnp_dlna_audio_information_class_init
+                                    (GUPnPDLNAAudioInformationClass *info_class)
+{
+        info_class->get_bitrate = NULL;
+        info_class->get_channels = NULL;
+        info_class->get_depth = NULL;
+        info_class->get_layer = NULL;
+        info_class->get_level = NULL;
+        info_class->get_mpeg_audio_version = NULL;
+        info_class->get_mpeg_version = NULL;
+        info_class->get_profile = NULL;
+        info_class->get_rate = NULL;
+        info_class->get_stream_format = NULL;
+        info_class->get_wma_version = NULL;
+        info_class->get_mime = NULL;
+
+        g_type_class_add_private (info_class,
+                                  sizeof (GUPnPDLNAAudioInformationPrivate));
+}
+
+static void
+gupnp_dlna_audio_information_init (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (info,
+                                         GUPNP_TYPE_DLNA_AUDIO_INFORMATION,
+                                         GUPnPDLNAAudioInformationPrivate);
+
+        info->priv = priv;
+}
+
+/**
+ * gupnp_dlna_audio_information_get_bitrate: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A bitrate.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_bitrate (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_bitrate != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_bitrate (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_channels: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A number of channels.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_channels (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_channels != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_channels (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_depth: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A depth.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_depth (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_depth != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_depth (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_layer: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A layer.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_layer (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_layer != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_layer (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_level: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A level.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_audio_information_get_level (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_level != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_level (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_mpeg_audio_version: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: An MPEG audio version.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_mpeg_audio_version
+                                        (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_mpeg_audio_version != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_mpeg_audio_version (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_mpeg_version: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: An MPEG version.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_mpeg_version (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_mpeg_version != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_mpeg_version (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_profile: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A profile.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_audio_information_get_profile (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_profile != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_profile (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_rate: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A sample rate.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_rate (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_rate != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_rate (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_stream_format: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A stream format.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_audio_information_get_stream_format (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_stream_format != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_stream_format (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_wma_version: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A WMA version.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_wma_version (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_wma_version != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_wma_version (info);
+}
+
+/**
+ * gupnp_dlna_audio_information_get_mime: (skip)
+ * @info: A #GUPnPDLNAAudioInformation object.
+ *
+ * Returns: A MIME type.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_audio_information_get_mime (GUPnPDLNAAudioInformation *info)
+{
+        GUPnPDLNAAudioInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_AUDIO_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_mime != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_mime (info);
+}
diff --git a/libgupnp-dlna/gupnp-dlna-audio-information.h b/libgupnp-dlna/gupnp-dlna-audio-information.h
new file mode 100644 (file)
index 0000000..7662249
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_AUDIO_INFORMATION_H__
+#define __GUPNP_DLNA_AUDIO_INFORMATION_H__
+
+#include <glib-object.h>
+#include <libgupnp-dlna/gupnp-dlna-values.h>
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_AUDIO_INFORMATION \
+        (gupnp_dlna_audio_information_get_type())
+
+#define GUPNP_DLNA_AUDIO_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_AUDIO_INFORMATION, \
+                                     GUPnPDLNAAudioInformation))
+
+#define GUPNP_DLNA_AUDIO_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_AUDIO_INFORMATION, \
+                                  GUPnPDLNAAudioInformationClass))
+
+#define GUPNP_IS_DLNA_AUDIO_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_AUDIO_INFORMATION))
+
+#define GUPNP_IS_DLNA_AUDIO_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_AUDIO_INFORMATION))
+
+#define GUPNP_DLNA_AUDIO_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_AUDIO_INFORMATION, \
+                                    GUPnPDLNAAudioInformationClass))
+
+typedef struct _GUPnPDLNAAudioInformationPrivate
+                GUPnPDLNAAudioInformationPrivate;
+
+typedef struct {
+        GObject parent;
+
+        GUPnPDLNAAudioInformationPrivate *priv;
+} GUPnPDLNAAudioInformation;
+
+/**
+ * GUPnPDLNAAudioInformationClass:
+ * @parent_class: Parent class.
+ * @get_bitrate: This is called by #GUPnPDLNAProfileGuesser to get a
+ * bitrate.
+ * @get_channels: This is called by #GUPnPDLNAProfileGuesser to get a
+ * channels count.
+ * @get_depth: This is called by #GUPnPDLNAProfileGuesser to get a
+ * depth.
+ * @get_layer: This is called by #GUPnPDLNAProfileGuesser to get a
+ * layer.
+ * @get_level: This is called by #GUPnPDLNAProfileGuesser to get a
+ * level.
+ * @get_mpeg_audio_version: This is called by #GUPnPDLNAProfileGuesser
+ * to get an MPEG audio version.
+ * @get_mpeg_version: This is called by #GUPnPDLNAProfileGuesser to
+ * get an MPEG version.
+ * @get_profile: This is called by #GUPnPDLNAProfileGuesser to get a
+ * profile.
+ * @get_rate: This is called by #GUPnPDLNAProfileGuesser to get a
+ * sample rate.
+ * @get_stream_format: This is called by #GUPnPDLNAProfileGuesser to
+ * get a stream format.
+ * @get_wma_version: This is called by #GUPnPDLNAProfileGuesser to get
+ * a WMA version.
+ * @get_mime: This is called by #GUPnPDLNAProfileGuesser to get a MIME
+ * type.
+ * @_reserved: Padding. Ignore it.
+ */
+typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAIntValue
+        (* get_bitrate) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_channels) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_depth) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_layer) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_level) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_mpeg_audio_version) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_mpeg_version) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_profile) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_rate) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_stream_format) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_wma_version) (GUPnPDLNAAudioInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_mime) (GUPnPDLNAAudioInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAAudioInformationClass;
+
+GType
+gupnp_dlna_audio_information_get_type (void);
+
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_bitrate (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_channels (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_depth (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_layer (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_audio_information_get_level (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_mpeg_audio_version
+                                        (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_mpeg_version (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_audio_information_get_profile (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_rate (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_audio_information_get_stream_format
+                                        (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_audio_information_get_wma_version (GUPnPDLNAAudioInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_audio_information_get_mime (GUPnPDLNAAudioInformation *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_AUDIO_INFORMATION_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-container-information.c b/libgupnp-dlna/gupnp-dlna-container-information.c
new file mode 100644 (file)
index 0000000..f2b052b
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gupnp-dlna-container-information
+ * @short_description: Base class representing container metadata
+ * needed for DLNA profiles matching.
+ * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
+ *
+ * #GUPnPDLNAContainerInformation holds all container metadatas
+ * important for matching profiles. Note that it does not mean all
+ * data should be provided for every media file as in some cases it
+ * does not make sense (e.g. MPEG version does not make sense for WMA
+ * media files).
+ *
+ * For metadata attributes that do not exist in current media file an
+ * unset value should be returned. For metadata attributes that do
+ * exist a set value with proper underlying value should be
+ * returned. In case metadata extractor has completely no clue how to
+ * extract some metadata attribute at all, an unsupported value should
+ * be returned. Note that unsupported values should be a temporary
+ * mean before fixing the multimedia framework to be able to extract
+ * such attribute.
+ *
+ * Note that gupnp_dlna_container_information_get_mime() should always
+ * return a set value. Otherwise it is highly probably that the file
+ * will not match against any DLNA profile.
+ */
+
+#include "gupnp-dlna-container-information.h"
+
+G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAContainerInformation,
+                        gupnp_dlna_container_information,
+                        G_TYPE_OBJECT)
+
+struct _GUPnPDLNAContainerInformationPrivate {
+        gpointer placeholder;
+};
+
+static void
+gupnp_dlna_container_information_class_init
+                                (GUPnPDLNAContainerInformationClass *info_class)
+{
+        info_class->get_mpeg_version = NULL;
+        info_class->get_packet_size = NULL;
+        info_class->get_profile = NULL;
+        info_class->is_system_stream = NULL;
+        info_class->get_variant = NULL;
+        info_class->get_mime = NULL;
+
+        g_type_class_add_private
+                                (info_class,
+                                 sizeof (GUPnPDLNAContainerInformationPrivate));
+}
+
+static void
+gupnp_dlna_container_information_init (GUPnPDLNAContainerInformation *info)
+{
+        GUPnPDLNAContainerInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (info,
+                                         GUPNP_TYPE_DLNA_CONTAINER_INFORMATION,
+                                         GUPnPDLNAContainerInformationPrivate);
+
+        info->priv = priv;
+}
+
+/**
+ * gupnp_dlna_container_information_get_mpeg_version: (skip)
+ * @info: A #GUPnPDLNAContainerInformation object.
+ *
+ * Returns: An MPEG version.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_container_information_get_mpeg_version
+                                        (GUPnPDLNAContainerInformation *info)
+{
+        GUPnPDLNAContainerInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_CONTAINER_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_CONTAINER_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                        (GUPNP_IS_DLNA_CONTAINER_INFORMATION_CLASS (info_class),
+                         GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_mpeg_version != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_mpeg_version (info);
+}
+
+/**
+ * gupnp_dlna_container_information_get_packet_size: (skip)
+ * @info: A #GUPnPDLNAContainerInformation object.
+ *
+ * Returns: A packet size.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_container_information_get_packet_size
+                                        (GUPnPDLNAContainerInformation *info)
+{
+        GUPnPDLNAContainerInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_CONTAINER_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_CONTAINER_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                        (GUPNP_IS_DLNA_CONTAINER_INFORMATION_CLASS (info_class),
+                         GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_packet_size != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_packet_size (info);
+}
+
+/**
+ * gupnp_dlna_container_information_get_profile: (skip)
+ * @info: A #GUPnPDLNAContainerInformation object.
+ *
+ * Returns: A profile.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_container_information_get_profile
+                                        (GUPnPDLNAContainerInformation *info)
+{
+        GUPnPDLNAContainerInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_CONTAINER_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_CONTAINER_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                        (GUPNP_IS_DLNA_CONTAINER_INFORMATION_CLASS (info_class),
+                         GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_profile != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_profile (info);
+}
+
+/**
+ * gupnp_dlna_container_information_is_system_stream: (skip)
+ * @info: A #GUPnPDLNAContainerInformation object.
+ *
+ * Returns: Whether it is system stream.
+ */
+GUPnPDLNABoolValue
+gupnp_dlna_container_information_is_system_stream
+                                        (GUPnPDLNAContainerInformation *info)
+{
+        GUPnPDLNAContainerInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_CONTAINER_INFORMATION (info),
+                              GUPNP_DLNA_BOOL_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_CONTAINER_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                        (GUPNP_IS_DLNA_CONTAINER_INFORMATION_CLASS (info_class),
+                         GUPNP_DLNA_BOOL_VALUE_UNSET);
+        g_return_val_if_fail (info_class->is_system_stream != NULL,
+                              GUPNP_DLNA_BOOL_VALUE_UNSET);
+
+        return info_class->is_system_stream (info);
+}
+
+/**
+ * gupnp_dlna_container_information_get_variant: (skip)
+ * @info: A #GUPnPDLNAContainerInformation object.
+ *
+ * Returns: A variant.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_container_information_get_variant
+                                        (GUPnPDLNAContainerInformation *info)
+{
+        GUPnPDLNAContainerInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_CONTAINER_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_CONTAINER_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                        (GUPNP_IS_DLNA_CONTAINER_INFORMATION_CLASS (info_class),
+                         GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_variant != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_variant (info);
+}
+
+/**
+ * gupnp_dlna_container_information_get_mime: (skip)
+ * @info: A #GUPnPDLNAContainerInformation object.
+ *
+ * Returns: A MIME type.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_container_information_get_mime (GUPnPDLNAContainerInformation *info)
+{
+        GUPnPDLNAContainerInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_CONTAINER_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_CONTAINER_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                        (GUPNP_IS_DLNA_CONTAINER_INFORMATION_CLASS (info_class),
+                         GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_mime != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_mime (info);
+}
diff --git a/libgupnp-dlna/gupnp-dlna-container-information.h b/libgupnp-dlna/gupnp-dlna-container-information.h
new file mode 100644 (file)
index 0000000..156bfd9
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_CONTAINER_INFORMATION_H__
+#define __GUPNP_DLNA_CONTAINER_INFORMATION_H__
+
+#include <glib-object.h>
+#include <libgupnp-dlna/gupnp-dlna-values.h>
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_CONTAINER_INFORMATION \
+        (gupnp_dlna_container_information_get_type())
+
+#define GUPNP_DLNA_CONTAINER_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_CONTAINER_INFORMATION, \
+                                     GUPnPDLNAContainerInformation))
+
+#define GUPNP_DLNA_CONTAINER_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_CONTAINER_INFORMATION, \
+                                  GUPnPDLNAContainerInformationClass))
+
+#define GUPNP_IS_DLNA_CONTAINER_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_CONTAINER_INFORMATION))
+
+#define GUPNP_IS_DLNA_CONTAINER_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_CONTAINER_INFORMATION))
+
+#define GUPNP_DLNA_CONTAINER_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_CONTAINER_INFORMATION, \
+                                    GUPnPDLNAContainerInformationClass))
+
+typedef struct _GUPnPDLNAContainerInformationPrivate
+                GUPnPDLNAContainerInformationPrivate;
+
+typedef struct {
+        GObject parent;
+
+        GUPnPDLNAContainerInformationPrivate *priv;
+} GUPnPDLNAContainerInformation;
+
+/**
+ * GUPnPDLNAContainerInformationClass:
+ * @parent_class: Parent class.
+ * @get_mpeg_version: This is called by #GUPnPDLNAProfileGuesser to
+ * get an MPEG version.
+ * @get_packet_size: This is called by #GUPnPDLNAProfileGuesser to get
+ * a packet size.
+ * @get_profile: This is called by #GUPnPDLNAProfileGuesser to get a
+ * profile.
+ * @is_system_stream: This is called by #GUPnPDLNAProfileGuesser to
+ * get whether it is a system stream
+ * @get_variant: This is called by #GUPnPDLNAProfileGuesser to get a
+ * variant.
+ * @get_mime: This is called by #GUPnPDLNAProfileGuesser to get a MIME
+ * type.
+ * @_reserved: Padding. Ignore it.
+ */
+typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAIntValue
+        (* get_mpeg_version) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_packet_size) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_profile) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNABoolValue
+        (* is_system_stream) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_variant) (GUPnPDLNAContainerInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_mime) (GUPnPDLNAContainerInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAContainerInformationClass;
+
+GType
+gupnp_dlna_container_information_get_type (void);
+
+GUPnPDLNAIntValue
+gupnp_dlna_container_information_get_mpeg_version
+                                        (GUPnPDLNAContainerInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_container_information_get_packet_size
+                                        (GUPnPDLNAContainerInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_container_information_get_profile
+                                        (GUPnPDLNAContainerInformation *info);
+
+GUPnPDLNABoolValue
+gupnp_dlna_container_information_is_system_stream
+                                        (GUPnPDLNAContainerInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_container_information_get_variant
+                                        (GUPnPDLNAContainerInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_container_information_get_mime (GUPnPDLNAContainerInformation *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_CONTAINER_INFORMATION_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-discoverer.c b/libgupnp-dlna/gupnp-dlna-discoverer.c
deleted file mode 100644 (file)
index faf21ff..0000000
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- * Copyright (C) 2010 Nokia Corporation.
- *
- * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "gupnp-dlna-discoverer.h"
-#include "gupnp-dlna-marshal.h"
-#include "profile-loading.h"
-
-/**
- * SECTION:gupnp-dlna-discoverer
- * @short_description: Utility API for discovering DLNA profile/mime type and
- * other metadata for given media.
- *
- * The GUPnPDLNADiscoverer object provides a light-weight wrapper over the
- * #GstDiscoverer API. The latter provides a simple interface to discover
- * media metadata given a URI. GUPnPDLNADiscoverer extends this API to also
- * provide a DLNA profile name and mime type for the media.
- *
- * The API provided corresponds very closely to the API provided by
- * #GstDiscoverer - both synchronous and asynchronous discovery of metadata
- * are possible.
- *
- * The asynchronous mode requires a running #GMainLoop in the default
- * #GMainContext, where one connects to the various signals, appends the
- * URIs to be processed and then asks for the discovery to begin.
- */
-enum {
-        DONE,
-        SIGNAL_LAST
-};
-
-static guint signals[SIGNAL_LAST];
-
-
-G_DEFINE_TYPE (GUPnPDLNADiscoverer, gupnp_dlna_discoverer, GST_TYPE_DISCOVERER)
-
-#define GET_PRIVATE(o)                                                  \
-        (G_TYPE_INSTANCE_GET_PRIVATE ((o),                              \
-                                      GUPNP_TYPE_DLNA_DISCOVERER,       \
-                                      GUPnPDLNADiscovererPrivate))
-
-typedef struct _GUPnPDLNADiscovererPrivate GUPnPDLNADiscovererPrivate;
-
-struct _GUPnPDLNADiscovererPrivate {
-        gboolean  relaxed_mode;
-        gboolean  extended_mode;
-};
-
-enum {
-        PROP_0,
-        PROP_DLNA_RELAXED_MODE,
-        PROP_DLNA_EXTENDED_MODE,
-};
-
-static void
-gupnp_dlna_discoverer_set_property (GObject      *object,
-                                    guint        property_id,
-                                    const GValue *value,
-                                    GParamSpec   *pspec)
-{
-        GUPnPDLNADiscoverer *self = GUPNP_DLNA_DISCOVERER (object);
-        GUPnPDLNADiscovererPrivate *priv = GET_PRIVATE (self);
-
-        switch (property_id) {
-                case PROP_DLNA_RELAXED_MODE:
-                        priv->relaxed_mode = g_value_get_boolean (value);
-                        break;
-
-                case PROP_DLNA_EXTENDED_MODE:
-                        priv->extended_mode = g_value_get_boolean (value);
-                        break;
-
-                default:
-                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
-                                                           property_id,
-                                                           pspec);
-                        break;
-        }
-}
-
-static void
-gupnp_dlna_discoverer_get_property (GObject    *object,
-                                    guint      property_id,
-                                    GValue     *value,
-                                    GParamSpec *pspec)
-{
-        GUPnPDLNADiscoverer *self = GUPNP_DLNA_DISCOVERER (object);
-        GUPnPDLNADiscovererPrivate *priv = GET_PRIVATE (self);
-
-        switch (property_id) {
-                case PROP_DLNA_RELAXED_MODE:
-                        g_value_set_boolean (value, priv->relaxed_mode);
-                        break;
-
-                case PROP_DLNA_EXTENDED_MODE:
-                        g_value_set_boolean (value, priv->extended_mode);
-                        break;
-
-                default:
-                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
-                                                           property_id,
-                                                           pspec);
-                        break;
-        }
-}
-
-static void
-gupnp_dlna_discoverer_dispose (GObject *object)
-{
-        G_OBJECT_CLASS (gupnp_dlna_discoverer_parent_class)->dispose (object);
-}
-
-static void
-gupnp_dlna_discoverer_finalize (GObject *object)
-{
-        G_OBJECT_CLASS (gupnp_dlna_discoverer_parent_class)->finalize (object);
-}
-
-static void
-gupnp_dlna_discovered_cb (GstDiscoverer     *discoverer,
-                          GstDiscovererInfo *info,
-                          GError            *err)
-{
-        GUPnPDLNAInformation *dlna = NULL;
-        GUPnPDLNADiscovererClass *klass =
-                GUPNP_DLNA_DISCOVERER_GET_CLASS (discoverer);
-        GUPnPDLNADiscovererPrivate *priv =
-                GET_PRIVATE (GUPNP_DLNA_DISCOVERER (discoverer));
-        gboolean relaxed = priv->relaxed_mode;
-        gboolean extended = priv->extended_mode;
-
-        if (info)
-                dlna = gupnp_dlna_information_new_from_discoverer_info
-                                        (info,
-                                         klass->profiles_list
-                                                  [relaxed][extended]);
-
-        g_signal_emit (GUPNP_DLNA_DISCOVERER (discoverer),
-                       signals[DONE], 0, dlna, err);
-
-        if (dlna)
-                g_object_unref (dlna);
-}
-
-static void
-gupnp_dlna_discoverer_class_init (GUPnPDLNADiscovererClass *klass)
-{
-        GObjectClass *object_class = G_OBJECT_CLASS (klass);
-        GParamSpec *pspec;
-
-        g_type_class_add_private (klass, sizeof (GUPnPDLNADiscovererPrivate));
-
-        object_class->get_property = gupnp_dlna_discoverer_get_property;
-        object_class->set_property = gupnp_dlna_discoverer_set_property;
-        object_class->dispose = gupnp_dlna_discoverer_dispose;
-        object_class->finalize = gupnp_dlna_discoverer_finalize;
-
-        /**
-         * GUPnPDLNADiscoverer::relaxed-mode:
-         * @relaxed_mode: setting to true will enable relaxed mode
-         *
-         * The current release does not support relaxed mode yet
-         */
-        pspec = g_param_spec_boolean ("relaxed-mode",
-                                      "Relaxed mode property",
-                                      "Indicates that profile matching should"
-                                      "be strictly compliant with the DLNA "
-                                      "specification",
-                                      FALSE,
-                                      G_PARAM_READWRITE |
-                                      G_PARAM_CONSTRUCT_ONLY);
-        g_object_class_install_property (object_class,
-                                         PROP_DLNA_RELAXED_MODE,
-                                         pspec);
-
-        /**
-         * GUPnPDLNADiscoverer::extended-mode:
-         * @extended: setting true will enable extended profile support
-         *
-         * The current release does not support extended mode yet
-         */
-        pspec = g_param_spec_boolean ("extended-mode",
-                                      "Extended mode property",
-                                      "Indicates support for profiles that are "
-                                      "not part of the DLNA specification",
-                                      FALSE,
-                                      G_PARAM_READWRITE |
-                                      G_PARAM_CONSTRUCT_ONLY);
-        g_object_class_install_property (object_class,
-                                         PROP_DLNA_EXTENDED_MODE,
-                                         pspec);
-
-        /**
-         * GUPnPDLNADiscoverer::done:
-         * @discoverer: the #GUPnPDLNADiscoverer
-         * @dlna: the results as #GUPnPDLNAInformation
-         * @err: contains details of the error if discovery fails, else is NULL
-         *
-         * Will be emitted when all information on a URI could be discovered.
-         *
-         * The reciever must unref @dlna with when done using it.
-         */
-        signals[DONE] =
-                g_signal_new ("done", G_TYPE_FROM_CLASS (klass),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (GUPnPDLNADiscovererClass, done),
-                              NULL, NULL,
-                              gupnp_dlna_marshal_VOID__OBJECT_BOXED,
-                              G_TYPE_NONE, 2, GUPNP_TYPE_DLNA_INFORMATION,
-                              GST_TYPE_G_ERROR);
-
-        /* Load DLNA profiles from disk */
-        if (g_type_from_name ("GstElement")) {
-                klass->profiles_list [0][0]
-                        = gupnp_dlna_load_profiles_from_disk (FALSE,
-                                                              FALSE);
-                klass->profiles_list [0][1]
-                        = gupnp_dlna_load_profiles_from_disk (FALSE,
-                                                              TRUE);
-                klass->profiles_list [1][0]
-                        = gupnp_dlna_load_profiles_from_disk (TRUE,
-                                                              FALSE);
-                klass->profiles_list [1][1]
-                        = gupnp_dlna_load_profiles_from_disk (TRUE,
-                                                              TRUE);
-        } else {
-                klass->profiles_list [0][0] = NULL;
-                klass->profiles_list [0][1] = NULL;
-                klass->profiles_list [1][0] = NULL;
-                klass->profiles_list [1][1] = NULL;
-                g_warning ("GStreamer has not yet been initialised. You need "
-                           "to call gst_init()/gst_init_check() for discovery "
-                           "to work.");
-        }
-}
-
-static void
-gupnp_dlna_discoverer_init (GUPnPDLNADiscoverer *self)
-{
-        g_signal_connect (&self->parent,
-                          "discovered",
-                          G_CALLBACK (gupnp_dlna_discovered_cb),
-                          NULL);
-}
-
-/**
- * gupnp_dlna_discoverer_new:
- * @timeout: default discovery timeout, in nanoseconds
- * @relaxed_mode: set to TRUE, to enable relaxed mode support. FALSE otherwise
- * @extended_mode: set to TRUE, to enable extended mode support. FALSE otherwise
- *
- * Creates a new #GUPnPDLNADiscoverer object with the given default timeout
- * value.
- *
- * Returns: A new #GUPnPDLNADiscoverer object.
- */
-GUPnPDLNADiscoverer*
-gupnp_dlna_discoverer_new (GstClockTime timeout,
-                           gboolean     relaxed_mode,
-                           gboolean     extended_mode)
-{
-        return g_object_new (GUPNP_TYPE_DLNA_DISCOVERER,
-                             "timeout", timeout,
-                             "relaxed-mode", relaxed_mode,
-                             "extended-mode", extended_mode,
-                             NULL);
-}
-
-/* Asynchronous API */
-
-/**
- * gupnp_dlna_discoverer_start:
- * @discoverer: #GUPnPDLNADiscoverer object to start discovery on
- *
- * Allows asynchronous discovery of URIs to begin.
- */
-
-/**
- * gupnp_dlna_discoverer_stop:
- * @discoverer: #GUPnPDLNADiscoverer object to stop discovery on
- *
- * Stops asynchronous discovery of URIs.
- */
-
-/**
- * gupnp_dlna_discoverer_discover_uri:
- * @discoverer: #GUPnPDLNADiscoverer object to use for discovery
- * @uri: URI to gather metadata for
- *
- * Queues @uri for metadata discovery. When discovery is completed, the
- * "discovered" signal is emitted on @discoverer.
- *
- * Returns: TRUE if @uri was successfully queued, FALSE otherwise.
- */
-gboolean
-gupnp_dlna_discoverer_discover_uri (GUPnPDLNADiscoverer *discoverer,
-                                    const gchar         *uri)
-{
-        return gst_discoverer_discover_uri_async (GST_DISCOVERER (discoverer),
-                                                  uri);
-}
-
-/* Synchronous API */
-
-/**
- * gupnp_dlna_discoverer_discover_uri_sync:
- * @discoverer: #GUPnPDLNADiscoverer object to use for discovery
- * @uri: URI to gather metadata for
- * @err: contains details of the error if discovery fails, else is NULL
- *
- * Synchronously gathers metadata for @uri.
- *
- * Returns: (transfer full): a #GUPnPDLNAInformation with the metadata for @uri
- *          on success, NULL otherwise
- */
-GUPnPDLNAInformation *
-gupnp_dlna_discoverer_discover_uri_sync (GUPnPDLNADiscoverer *discoverer,
-                                         const gchar         *uri,
-                                         GError              **err)
-{
-        GstDiscovererInfo *info;
-        GUPnPDLNADiscovererClass *klass =
-                GUPNP_DLNA_DISCOVERER_GET_CLASS (discoverer);
-        GUPnPDLNADiscovererPrivate *priv = GET_PRIVATE (discoverer);
-        gboolean relaxed = priv->relaxed_mode;
-        gboolean extended = priv->extended_mode;
-
-        info = gst_discoverer_discover_uri (GST_DISCOVERER (discoverer),
-                                            uri,
-                                            err);
-
-        if (info)
-                return gupnp_dlna_information_new_from_discoverer_info
-                        (info, klass->profiles_list [relaxed][extended]);
-
-        return NULL;
-}
-
-/**
- * gupnp_dlna_discoverer_get_profile:
- * @self: The #GUPnPDLNADiscoverer object
- * @name: The name of the DLNA profile to be retrieved
- *
- * Given @name, this finds the corresponding DLNA profile information (stored
- * as a #GUPnPDLNAProfile).
- *
- * Returns: (transfer full): a #GUPnPDLNAProfile on success, NULL otherwise.
- **/
-GUPnPDLNAProfile *
-gupnp_dlna_discoverer_get_profile (GUPnPDLNADiscoverer *self,
-                                   const gchar         *name)
-{
-        GList *i;
-        GUPnPDLNADiscovererClass *klass;
-        GUPnPDLNADiscovererPrivate *priv = GET_PRIVATE (self);
-        gboolean relaxed = priv->relaxed_mode;
-        gboolean extended = priv->extended_mode;
-
-        g_return_val_if_fail (self != NULL, NULL);
-        klass = GUPNP_DLNA_DISCOVERER_GET_CLASS (self);
-
-        for (i = klass->profiles_list [relaxed][extended];
-             i != NULL;
-             i = i->next) {
-                GUPnPDLNAProfile *profile = (GUPnPDLNAProfile *) i->data;
-
-                if (g_str_equal (gupnp_dlna_profile_get_name (profile), name)) {
-                        g_object_ref (profile);
-                        return profile;
-                }
-        }
-
-        return NULL;
-}
-
-/**
- * gupnp_dlna_discoverer_list_profiles:
- * @self: The #GUPnPDLNADiscoverer whose profile list is required
- *
- * Retuns a list of the all the DLNA profiles supported by @self.
- *
- * Returns: (transfer none) (element-type GUPnPDLNAProfile*): a #GList of
- *          #GUPnPDLNAProfile on success, NULL otherwise.
- **/
-const GList *
-gupnp_dlna_discoverer_list_profiles (GUPnPDLNADiscoverer *self)
-{
-        GUPnPDLNADiscovererClass *klass;
-        GUPnPDLNADiscovererPrivate *priv = GET_PRIVATE (self);
-        gboolean relaxed = priv->relaxed_mode;
-        gboolean extended = priv->extended_mode;
-
-        g_return_val_if_fail (self != NULL, NULL);
-
-        klass = GUPNP_DLNA_DISCOVERER_GET_CLASS (self);
-
-        return klass->profiles_list [relaxed][extended];
-}
-
-/**
- * gupnp_dlna_discoverer_get_relaxed_mode:
- * @self: The #GUPnPDLNADiscoverer object
- *
- * Returns: true if relaxed mode is set and false otherwise
- */
-gboolean
-gupnp_dlna_discoverer_get_relaxed_mode (GUPnPDLNADiscoverer *self)
-{
-        GUPnPDLNADiscovererPrivate *priv = GET_PRIVATE (self);
-
-        return priv->relaxed_mode;
-}
-
-/**
- * gupnp_dlna_discoverer_get_extended_mode:
- * @self: The #GUPnPDLNADiscoverer object
- *
- * Returns: true if application is using extended mode and false otherwise
- */
-gboolean
-gupnp_dlna_discoverer_get_extended_mode (GUPnPDLNADiscoverer *self)
-{
-        GUPnPDLNADiscovererPrivate *priv = GET_PRIVATE (self);
-
-        return priv->extended_mode;
-}
diff --git a/libgupnp-dlna/gupnp-dlna-discoverer.h b/libgupnp-dlna/gupnp-dlna-discoverer.h
deleted file mode 100644 (file)
index bdf9e45..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 Nokia Corporation.
- *
- * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef _GUPNP_DLNA_DISCOVERER
-#define _GUPNP_DLNA_DISCOVERER
-
-#include <glib-object.h>
-#include <gst/pbutils/pbutils.h>
-#include "gupnp-dlna-information.h"
-#include "gupnp-dlna-profile.h"
-
-G_BEGIN_DECLS
-
-#define GUPNP_TYPE_DLNA_DISCOVERER gupnp_dlna_discoverer_get_type()
-
-#define GUPNP_DLNA_DISCOVERER(obj)                                      \
-        (G_TYPE_CHECK_INSTANCE_CAST ((obj),                             \
-                                     GUPNP_TYPE_DLNA_DISCOVERER,        \
-                                     GUPnPDLNADiscoverer))
-
-#define GUPNP_DLNA_DISCOVERER_CLASS(klass)                      \
-        (G_TYPE_CHECK_CLASS_CAST ((klass),                      \
-                                  GUPNP_TYPE_DLNA_DISCOVERER,   \
-                                  GUPnPDLNADiscovererClass))
-
-#define GUPNP_IS_DLNA_DISCOVERER(obj)                                   \
-        (G_TYPE_CHECK_INSTANCE_TYPE ((obj),                             \
-                                     GUPNP_TYPE_DLNA_DISCOVERER))
-
-#define GUPNP_IS_DLNA_DISCOVERER_CLASS(klass)                   \
-        (G_TYPE_CHECK_CLASS_TYPE ((klass),                      \
-                                  GUPNP_TYPE_DLNA_DISCOVERER))
-
-#define GUPNP_DLNA_DISCOVERER_GET_CLASS(obj)                    \
-        (G_TYPE_INSTANCE_GET_CLASS ((obj),                      \
-                                    GUPNP_TYPE_DLNA_DISCOVERER, \
-                                    GUPnPDLNADiscovererClass))
-
-/**
- * GUPnPDLNADiscoverer:
- *
- * The top-level object used to for metadata extraction.
- */
-typedef struct {
-        GstDiscoverer parent;
-} GUPnPDLNADiscoverer;
-
-typedef struct {
-        GstDiscovererClass parent_class;
-
-        /*< signals >*/
-        void (*done) (GUPnPDLNADiscoverer *discoverer,
-                      GUPnPDLNAInformation *dlna,
-                      GError *err);
-
-        /*< private >*/
-        GList *profiles_list[2][2];
-
-} GUPnPDLNADiscovererClass;
-
-GType gupnp_dlna_discoverer_get_type (void);
-
-GUPnPDLNADiscoverer *
-gupnp_dlna_discoverer_new (GstClockTime timeout,
-                           gboolean     relaxed_mode,
-                           gboolean     extended_mode);
-
-/* Asynchronous API */
-#define gupnp_dlna_discoverer_start(discoverer) \
-        gst_discoverer_start(GST_DISCOVERER((discoverer)))
-#define gupnp_dlna_discoverer_stop(discoverer) \
-        gst_discoverer_stop(GST_DISCOVERER((discoverer)))
-gboolean
-gupnp_dlna_discoverer_discover_uri (GUPnPDLNADiscoverer *discoverer,
-                                    const gchar         *uri);
-
-/* Synchronous API */
-GUPnPDLNAInformation *
-gupnp_dlna_discoverer_discover_uri_sync (GUPnPDLNADiscoverer *discoverer,
-                                         const gchar         *uri,
-                                         GError              **err);
-
-/* Get a GUPnPDLNAProfile by name */
-GUPnPDLNAProfile *
-gupnp_dlna_discoverer_get_profile (GUPnPDLNADiscoverer *self,
-                                   const gchar         *name);
-
-/* API to list all available profiles */
-const GList *
-gupnp_dlna_discoverer_list_profiles (GUPnPDLNADiscoverer *self);
-gboolean
-gupnp_dlna_discoverer_get_relaxed_mode (GUPnPDLNADiscoverer *self);
-gboolean
-gupnp_dlna_discoverer_get_extended_mode (GUPnPDLNADiscoverer *self);
-
-G_END_DECLS
-
-#endif /* _GUPNP_DLNA_DISCOVERER */
diff --git a/libgupnp-dlna/gupnp-dlna-field-value.c b/libgupnp-dlna/gupnp-dlna-field-value.c
new file mode 100644 (file)
index 0000000..c5fe8ca
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-field-value.h"
+
+GUPnPDLNAFieldValue *
+gupnp_dlna_field_value_new_single (gchar *single)
+{
+        GUPnPDLNAFieldValue *value = g_slice_new (GUPnPDLNAFieldValue);
+
+        value->type = GUPNP_DLNA_FIELD_VALUE_TYPE_SINGLE;
+        value->value.single = g_strdup (single);
+
+        return value;
+}
+
+GUPnPDLNAFieldValue *
+gupnp_dlna_field_value_new_range (gchar *min,
+                                  gchar *max)
+{
+        GUPnPDLNAFieldValue *value = g_slice_new (GUPnPDLNAFieldValue);
+
+        value->type = GUPNP_DLNA_FIELD_VALUE_TYPE_RANGE;
+        value->value.range.min = g_strdup (min);
+        value->value.range.max = g_strdup (max);
+
+        return value;
+}
+
+void
+gupnp_dlna_field_value_free (GUPnPDLNAFieldValue *value)
+{
+        if (!value)
+                return;
+
+        switch (value->type) {
+        case GUPNP_DLNA_FIELD_VALUE_TYPE_SINGLE:
+                g_free (value->value.single);
+
+                break;
+        case GUPNP_DLNA_FIELD_VALUE_TYPE_RANGE:
+                g_free (value->value.range.min);
+                g_free (value->value.range.max);
+
+                break;
+        default:
+                g_warning ("Unknown field value type.");
+        }
+
+        g_slice_free (GUPnPDLNAFieldValue, value);
+}
diff --git a/libgupnp-dlna/gupnp-dlna-field-value.h b/libgupnp-dlna/gupnp-dlna-field-value.h
new file mode 100644 (file)
index 0000000..7066d75
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_FIELD_VALUE_H__
+#define __GUPNP_DLNA_FIELD_VALUE_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef enum {
+        GUPNP_DLNA_FIELD_VALUE_TYPE_RANGE,
+        GUPNP_DLNA_FIELD_VALUE_TYPE_SINGLE
+} GUPnPDLNAFieldValueType;
+
+typedef struct {
+        GUPnPDLNAFieldValueType type;
+        union {
+                struct {
+                        gchar *min;
+                        gchar *max;
+                } range;
+                gchar *single;
+        } value;
+} GUPnPDLNAFieldValue;
+
+GUPnPDLNAFieldValue *
+gupnp_dlna_field_value_new_single (gchar *single);
+
+GUPnPDLNAFieldValue *
+gupnp_dlna_field_value_new_range (gchar *min,
+                                  gchar *max);
+
+void
+gupnp_dlna_field_value_free (GUPnPDLNAFieldValue *value);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_FIELD_VALUE_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-g-values-private.h b/libgupnp-dlna/gupnp-dlna-g-values-private.h
new file mode 100644 (file)
index 0000000..9be8c31
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_G_VALUES_PRIVATE_H__
+#define __GUPNP_DLNA_G_VALUES_PRIVATE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "gupnp-dlna-g-values.h"
+
+G_BEGIN_DECLS
+
+struct _GUPnPDLNAFraction
+{
+        gint numerator;
+        gint denominator;
+};
+
+struct _GUPnPDLNAFractionRange
+{
+        GUPnPDLNAFraction *min;
+        GUPnPDLNAFraction *max;
+};
+
+struct _GUPnPDLNAIntRange
+{
+        gint min;
+        gint max;
+};
+
+GUPnPDLNAFractionRange *
+gupnp_dlna_fraction_range_new_take (GUPnPDLNAFraction *min,
+                                    GUPnPDLNAFraction *max);
+
+GUPnPDLNAIntRange *
+gupnp_dlna_int_range_new (gint min,
+                          gint max);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_G_VALUES_PRIVATE_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-g-values.c b/libgupnp-dlna/gupnp-dlna-g-values.c
new file mode 100644 (file)
index 0000000..d2238a7
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-g-values-private.h"
+
+G_DEFINE_BOXED_TYPE (GUPnPDLNAFraction,
+                     gupnp_dlna_fraction,
+                     gupnp_dlna_fraction_copy,
+                     gupnp_dlna_fraction_free)
+
+G_DEFINE_BOXED_TYPE (GUPnPDLNAFractionRange,
+                     gupnp_dlna_fraction_range,
+                     gupnp_dlna_fraction_range_copy,
+                     gupnp_dlna_fraction_range_free)
+
+G_DEFINE_BOXED_TYPE (GUPnPDLNAIntRange,
+                     gupnp_dlna_int_range,
+                     gupnp_dlna_int_range_copy,
+                     gupnp_dlna_int_range_free)
+
+GUPnPDLNAFractionRange *
+gupnp_dlna_fraction_range_new_take (GUPnPDLNAFraction *min,
+                                    GUPnPDLNAFraction *max)
+{
+        GUPnPDLNAFractionRange *range;
+
+        g_return_val_if_fail (min != NULL, NULL);
+        g_return_val_if_fail (max != NULL, NULL);
+
+        range = g_slice_new (GUPnPDLNAFractionRange);
+        range->min = min;
+        range->max = max;
+
+        return range;
+}
+
+GUPnPDLNAIntRange *
+gupnp_dlna_int_range_new (gint min,
+                          gint max)
+{
+        GUPnPDLNAIntRange *range;
+
+        g_return_val_if_fail (min <= max, NULL);
+
+        range = g_slice_new (GUPnPDLNAIntRange);
+        range->min = min;
+        range->max = max;
+
+        return range;
+}
+
+/**
+ * gupnp_dlna_fraction_copy:
+ * @fraction: (transfer none): A fraction to copy.
+ *
+ * Returns: (transfer full): A copy of @fraction.
+ */
+GUPnPDLNAFraction *
+gupnp_dlna_fraction_copy (GUPnPDLNAFraction *fraction)
+{
+        GUPnPDLNAFraction *dup;
+
+        if (fraction == NULL)
+                return NULL;
+
+        dup = g_slice_new (GUPnPDLNAFraction);
+        dup->numerator = fraction->numerator;
+        dup->denominator = fraction->denominator;
+
+        return dup;
+}
+
+/**
+ * gupnp_dlna_fraction_free:
+ * @fraction: A fraction to free.
+ *
+ * Frees @fraction.
+ */
+void
+gupnp_dlna_fraction_free (GUPnPDLNAFraction *fraction)
+{
+        if (fraction == NULL)
+                return;
+
+        g_slice_free (GUPnPDLNAFraction, fraction);
+}
+
+/**
+ * gupnp_dlna_fraction_get_numerator:
+ * @fraction: A fraction.
+ *
+ * Returns: @fraction's numerator.
+ */
+gint
+gupnp_dlna_fraction_get_numerator (GUPnPDLNAFraction *fraction)
+{
+        g_return_val_if_fail (fraction != NULL, 0);
+
+        return fraction->numerator;
+}
+
+/**
+ * gupnp_dlna_fraction_get_denominator:
+ * @fraction: A fraction.
+ *
+ * Returns: @fraction's denominator.
+ */
+gint
+gupnp_dlna_fraction_get_denominator (GUPnPDLNAFraction *fraction)
+{
+        g_return_val_if_fail (fraction != NULL, 0);
+
+        return fraction->denominator;
+}
+
+/**
+ * gupnp_dlna_fraction_range_copy:
+ * @range: (transfer none): A range to copy.
+ *
+ * Returns: (transfer full): A copy of @range.
+ */
+GUPnPDLNAFractionRange *
+gupnp_dlna_fraction_range_copy (GUPnPDLNAFractionRange *range)
+{
+        if (range == NULL)
+                return NULL;
+
+        return gupnp_dlna_fraction_range_new_take
+                                        (gupnp_dlna_fraction_copy (range->min),
+                                         gupnp_dlna_fraction_copy (range->max));
+}
+
+/**
+ * gupnp_dlna_fraction_range_free:
+ * @range: A range to free.
+ *
+ * Frees @range.
+ */
+void
+gupnp_dlna_fraction_range_free (GUPnPDLNAFractionRange *range)
+{
+        if (range == NULL)
+                return;
+
+        gupnp_dlna_fraction_free (range->min);
+        gupnp_dlna_fraction_free (range->max);
+        g_slice_free (GUPnPDLNAFractionRange, range);
+}
+
+/**
+ * gupnp_dlna_fraction_range_get_min:
+ * @range: A range.
+ *
+ * Returns: (transfer none): Minimum value of @range.
+ */
+GUPnPDLNAFraction *
+gupnp_dlna_fraction_range_get_min (GUPnPDLNAFractionRange *range)
+{
+        g_return_val_if_fail (range != NULL, NULL);
+
+        return range->min;
+}
+
+/**
+ * gupnp_dlna_fraction_range_get_max:
+ * @range: A range.
+ *
+ * Returns: (transfer none): Maximum value of @range.
+ */
+GUPnPDLNAFraction *
+gupnp_dlna_fraction_range_get_max (GUPnPDLNAFractionRange *range)
+{
+        g_return_val_if_fail (range != NULL, NULL);
+
+        return range->max;
+}
+
+/**
+ * gupnp_dlna_int_range_copy:
+ * @range: (transfer none): A range to copy.
+ *
+ * Returns: (transfer full): A copy of @range.
+ */
+GUPnPDLNAIntRange *
+gupnp_dlna_int_range_copy (GUPnPDLNAIntRange *range)
+{
+        if (range == NULL)
+                return NULL;
+
+        return gupnp_dlna_int_range_new (range->min, range->max);
+}
+
+/**
+ * gupnp_dlna_int_range_free:
+ * @range: A range to free.
+ *
+ * Frees @range.
+ */
+void
+gupnp_dlna_int_range_free (GUPnPDLNAIntRange *range)
+{
+        if (range == NULL)
+                return;
+
+        g_slice_free (GUPnPDLNAIntRange, range);
+}
+
+/**
+ * gupnp_dlna_int_range_get_min:
+ * @range: A range.
+ *
+ * Returns: Minimum value of @range.
+ */
+gint
+gupnp_dlna_int_range_get_min (GUPnPDLNAIntRange *range)
+{
+        g_return_val_if_fail (range != NULL, 0);
+
+        return range->min;
+}
+
+/**
+ * gupnp_dlna_int_range_get_max:
+ * @range: A range.
+ *
+ * Returns: Maximum value of @range.
+ */
+gint
+gupnp_dlna_int_range_get_max (GUPnPDLNAIntRange *range)
+{
+        g_return_val_if_fail (range != NULL, 0);
+
+        return range->max;
+}
diff --git a/libgupnp-dlna/gupnp-dlna-g-values.h b/libgupnp-dlna/gupnp-dlna-g-values.h
new file mode 100644 (file)
index 0000000..6f0a031
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_G_VALUES_H__
+#define __GUPNP_DLNA_G_VALUES_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GUPnPDLNAFraction GUPnPDLNAFraction;
+typedef struct _GUPnPDLNAFractionRange GUPnPDLNAFractionRange;
+typedef struct _GUPnPDLNAIntRange GUPnPDLNAIntRange;
+
+#define GUPNP_DLNA_FRACTION(x) \
+        ((GUPnPDLNAFraction *) x)
+
+#define GUPNP_DLNA_FRACTION_RANGE(x) \
+        ((GUPnPDLNAFractionRange *) x)
+
+#define GUPNP_DLNA_INT_RANGE(x) \
+        ((GUPnPDLNAIntRange *) x)
+
+/**
+ * GUPNP_TYPE_DLNA_FRACTION:
+ *
+ * The #GType for #GUPnPDLNAFraction.
+ */
+#define GUPNP_TYPE_DLNA_FRACTION (gupnp_dlna_fraction_get_type ())
+
+/**
+ * GUPNP_TYPE_DLNA_FRACTION_RANGE:
+ *
+ * The #GType for #GUPnPDLNAFractionRange.
+ */
+#define GUPNP_TYPE_DLNA_FRACTION_RANGE (gupnp_dlna_fraction_range_get_type ())
+
+/**
+ * GUPNP_TYPE_DLNA_INT_RANGE:
+ *
+ * The #GType for #GUPnPDLNAIntRange.
+ */
+#define GUPNP_TYPE_DLNA_INT_RANGE (gupnp_dlna_int_range_get_type ())
+
+GType
+gupnp_dlna_fraction_get_type (void) G_GNUC_CONST;
+
+GType
+gupnp_dlna_fraction_range_get_type (void) G_GNUC_CONST;
+
+GType
+gupnp_dlna_int_range_get_type (void) G_GNUC_CONST;
+
+GUPnPDLNAFraction *
+gupnp_dlna_fraction_copy (GUPnPDLNAFraction *fraction);
+
+void
+gupnp_dlna_fraction_free (GUPnPDLNAFraction *fraction);
+
+gint
+gupnp_dlna_fraction_get_numerator (GUPnPDLNAFraction *fraction);
+
+gint
+gupnp_dlna_fraction_get_denominator (GUPnPDLNAFraction *fraction);
+
+GUPnPDLNAFractionRange *
+gupnp_dlna_fraction_range_copy (GUPnPDLNAFractionRange *range);
+
+void
+gupnp_dlna_fraction_range_free (GUPnPDLNAFractionRange *range);
+
+GUPnPDLNAFraction *
+gupnp_dlna_fraction_range_get_min (GUPnPDLNAFractionRange *range);
+
+GUPnPDLNAFraction *
+gupnp_dlna_fraction_range_get_max (GUPnPDLNAFractionRange *range);
+
+GUPnPDLNAIntRange *
+gupnp_dlna_int_range_copy (GUPnPDLNAIntRange *range);
+
+void
+gupnp_dlna_int_range_free (GUPnPDLNAIntRange *range);
+
+gint
+gupnp_dlna_int_range_get_min (GUPnPDLNAIntRange *range);
+
+gint
+gupnp_dlna_int_range_get_max (GUPnPDLNAIntRange *range);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_G_VALUES_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-image-information.c b/libgupnp-dlna/gupnp-dlna-image-information.c
new file mode 100644 (file)
index 0000000..9d23038
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gupnp-dlna-image-information
+ * @short_description: Base class representing image metadata needed
+ * for DLNA profiles matching.
+ * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
+ *
+ * #GUPnPDLNAImageInformation holds all image metadatas important for
+ * matching profiles. Note that it does not mean all data should be
+ * provided for every image file as in some cases it does not make
+ * sense.
+ *
+ * For metadata attributes that do not exist in current image file an
+ * unset value should be returned. For metadata attributes that do
+ * exist a set value with proper underlying value should be
+ * returned. In case metadata extractor has completely no clue how to
+ * extract some metadata attribute at all, an unsupported value should
+ * be returned. Note that unsupported values should be a temporary
+ * mean before fixing the multimedia framework to be able to extract
+ * such attribute.
+ *
+ * Note that gupnp_dlna_image_information_get_mime() should always
+ * return a set value. Otherwise it is highly probably that the file
+ * will not match against any DLNA profile.
+ */
+
+#include "gupnp-dlna-image-information.h"
+
+G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAImageInformation,
+                        gupnp_dlna_image_information,
+                        G_TYPE_OBJECT)
+
+struct _GUPnPDLNAImageInformationPrivate {
+        gpointer placeholder;
+};
+
+static void
+gupnp_dlna_image_information_class_init
+                                    (GUPnPDLNAImageInformationClass *info_class)
+{
+        info_class->get_depth = NULL;
+        info_class->get_height = NULL;
+        info_class->get_width = NULL;
+        info_class->get_mime = NULL;
+
+        g_type_class_add_private (info_class,
+                                  sizeof (GUPnPDLNAImageInformationPrivate));
+}
+
+static void
+gupnp_dlna_image_information_init (GUPnPDLNAImageInformation *info)
+{
+        GUPnPDLNAImageInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (info,
+                                         GUPNP_TYPE_DLNA_IMAGE_INFORMATION,
+                                         GUPnPDLNAImageInformationPrivate);
+
+        info->priv = priv;
+}
+
+/**
+ * gupnp_dlna_image_information_get_depth: (skip)
+ * @info: A #GUPnPDLNAImageInformation object.
+ *
+ * Returns: A depth of an image.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_image_information_get_depth (GUPnPDLNAImageInformation *info)
+{
+        GUPnPDLNAImageInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_IMAGE_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_IMAGE_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_IMAGE_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_depth != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_depth (info);
+}
+
+/**
+ * gupnp_dlna_image_information_get_height: (skip)
+ * @info: A #GUPnPDLNAImageInformation object.
+ *
+ * Returns: A height of an image.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_image_information_get_height (GUPnPDLNAImageInformation *info)
+{
+        GUPnPDLNAImageInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_IMAGE_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_IMAGE_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_IMAGE_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_height != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_height (info);
+}
+
+/**
+ * gupnp_dlna_image_information_get_width: (skip)
+ * @info: A #GUPnPDLNAImageInformation object.
+ *
+ * Returns: A width of an image.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_image_information_get_width (GUPnPDLNAImageInformation *info)
+{
+        GUPnPDLNAImageInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_IMAGE_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_IMAGE_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_IMAGE_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_width != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_width (info);
+}
+
+/**
+ * gupnp_dlna_image_information_get_mime: (skip)
+ * @info: A #GUPnPDLNAImageInformation object.
+ *
+ * Returns: A MIME type of an image.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_image_information_get_mime (GUPnPDLNAImageInformation *info)
+{
+        GUPnPDLNAImageInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_IMAGE_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_IMAGE_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_IMAGE_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_mime != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_mime (info);
+}
diff --git a/libgupnp-dlna/gupnp-dlna-image-information.h b/libgupnp-dlna/gupnp-dlna-image-information.h
new file mode 100644 (file)
index 0000000..56b39c3
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_IMAGE_INFORMATION_H__
+#define __GUPNP_DLNA_IMAGE_INFORMATION_H__
+
+#include <glib-object.h>
+#include <libgupnp-dlna/gupnp-dlna-values.h>
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_IMAGE_INFORMATION \
+        (gupnp_dlna_image_information_get_type())
+
+#define GUPNP_DLNA_IMAGE_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_IMAGE_INFORMATION, \
+                                     GUPnPDLNAImageInformation))
+
+#define GUPNP_DLNA_IMAGE_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_IMAGE_INFORMATION, \
+                                  GUPnPDLNAImageInformationClass))
+
+#define GUPNP_IS_DLNA_IMAGE_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_IMAGE_INFORMATION))
+
+#define GUPNP_IS_DLNA_IMAGE_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_IMAGE_INFORMATION))
+
+#define GUPNP_DLNA_IMAGE_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_IMAGE_INFORMATION, \
+                                    GUPnPDLNAImageInformationClass))
+
+typedef struct _GUPnPDLNAImageInformationPrivate
+                GUPnPDLNAImageInformationPrivate;
+
+typedef struct {
+        GObject parent;
+
+        GUPnPDLNAImageInformationPrivate *priv;
+} GUPnPDLNAImageInformation;
+
+/**
+ * GUPnPDLNAImageInformationClass:
+ * @parent_class: Parent class.
+ * @get_depth: This is called by #GUPnPDLNAProfileGuesser to get a
+ * depth.
+ * @get_height: This is called by #GUPnPDLNAProfileGuesser to get a
+ * height.
+ * @get_width: This is called by #GUPnPDLNAProfileGuesser to get a
+ * width.
+ * @get_mime: This is called by #GUPnPDLNAProfileGuesser to get a MIME
+ * type.
+ * @_reserved: Padding. Ignore it.
+ */
+typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAIntValue
+        (* get_depth) (GUPnPDLNAImageInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_height) (GUPnPDLNAImageInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_width) (GUPnPDLNAImageInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_mime) (GUPnPDLNAImageInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAImageInformationClass;
+
+GType
+gupnp_dlna_image_information_get_type (void);
+
+GUPnPDLNAIntValue
+gupnp_dlna_image_information_get_depth (GUPnPDLNAImageInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_image_information_get_height (GUPnPDLNAImageInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_image_information_get_width (GUPnPDLNAImageInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_image_information_get_mime (GUPnPDLNAImageInformation *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_IMAGE_INFORMATION_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-info-set.c b/libgupnp-dlna/gupnp-dlna-info-set.c
new file mode 100644 (file)
index 0000000..6504623
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <glib.h>
+
+#include "gupnp-dlna-info-set.h"
+#include "gupnp-dlna-info-value.h"
+#include "gupnp-dlna-value-list-private.h"
+
+struct _GUPnPDLNAInfoSet {
+        gchar *mime;
+        GHashTable *entries; /* <gchar *, GUPnPDLNAInfoValue *> */
+};
+
+GUPnPDLNAInfoSet *
+gupnp_dlna_info_set_new (const gchar *mime)
+{
+        GUPnPDLNAInfoSet *info_set;
+
+        g_return_val_if_fail (mime != NULL, NULL);
+
+        info_set = g_slice_new (GUPnPDLNAInfoSet);
+        info_set->mime = g_strdup (mime);
+        info_set->entries = g_hash_table_new_full
+                           (g_str_hash,
+                            g_str_equal,
+                            g_free,
+                            (GDestroyNotify) gupnp_dlna_info_value_free);
+
+        return info_set;
+}
+
+void
+gupnp_dlna_info_set_free (GUPnPDLNAInfoSet *info_set)
+{
+        if (info_set == NULL)
+                return;
+        g_free (info_set->mime);
+        g_hash_table_unref (info_set->entries);
+        g_slice_free (GUPnPDLNAInfoSet, info_set);
+}
+
+static gboolean
+insert_value (GUPnPDLNAInfoSet   *info_set,
+              const gchar        *name,
+              GUPnPDLNAInfoValue *value)
+{
+        if (value == NULL) {
+                g_debug ("Info set: value '%s' is NULL.", name);
+
+                return FALSE;
+        }
+
+        if (g_hash_table_contains (info_set->entries, name)) {
+                g_debug ("Info set: value '%s' already exists.", name);
+                gupnp_dlna_info_value_free (value);
+
+                return FALSE;
+        }
+        g_hash_table_insert (info_set->entries, g_strdup (name), value);
+
+        return TRUE;
+}
+
+gboolean
+gupnp_dlna_info_set_add_bool (GUPnPDLNAInfoSet *info_set,
+                              const gchar      *name,
+                              gboolean          value)
+{
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+
+        return insert_value (info_set,
+                             name,
+                             gupnp_dlna_info_value_new_bool (value));
+}
+
+gboolean
+gupnp_dlna_info_set_add_unsupported_bool (GUPnPDLNAInfoSet *info_set,
+                                          const gchar      *name)
+{
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+
+        return insert_value (info_set,
+                             name,
+                             gupnp_dlna_info_value_new_unsupported_bool ());
+}
+
+gboolean
+gupnp_dlna_info_set_add_fraction (GUPnPDLNAInfoSet *info_set,
+                                  const gchar      *name,
+                                  gint              numerator,
+                                  gint              denominator)
+{
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+
+        return insert_value (info_set,
+                             name,
+                             gupnp_dlna_info_value_new_fraction (numerator,
+                                                                 denominator));
+}
+
+gboolean
+gupnp_dlna_info_set_add_unsupported_fraction (GUPnPDLNAInfoSet *info_set,
+                                              const gchar      *name)
+{
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+
+        return insert_value (info_set,
+                             name,
+                             gupnp_dlna_info_value_new_unsupported_fraction ());
+}
+
+gboolean
+gupnp_dlna_info_set_add_int (GUPnPDLNAInfoSet *info_set,
+                             const gchar      *name,
+                             gint              value)
+{
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+
+        return insert_value (info_set,
+                             name,
+                             gupnp_dlna_info_value_new_int (value));
+}
+
+gboolean
+gupnp_dlna_info_set_add_unsupported_int (GUPnPDLNAInfoSet *info_set,
+                                         const gchar      *name)
+{
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+
+        return insert_value (info_set,
+                             name,
+                             gupnp_dlna_info_value_new_unsupported_int ());
+}
+
+gboolean
+gupnp_dlna_info_set_add_string (GUPnPDLNAInfoSet *info_set,
+                                const gchar      *name,
+                                const gchar      *value)
+{
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+        g_return_val_if_fail (value != NULL, FALSE);
+
+        return insert_value (info_set,
+                             name,
+                             gupnp_dlna_info_value_new_string (value));
+}
+
+gboolean
+gupnp_dlna_info_set_add_unsupported_string (GUPnPDLNAInfoSet *info_set,
+                                            const gchar      *name)
+{
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+
+        return insert_value (info_set,
+                             name,
+                             gupnp_dlna_info_value_new_unsupported_string ());
+}
+
+gboolean
+gupnp_dlna_info_set_fits_restriction (GUPnPDLNAInfoSet     *info_set,
+                                      GUPnPDLNARestriction *restriction)
+{
+        GHashTableIter iter;
+        gpointer key;
+        gpointer value;
+        gboolean unsupported_match;
+
+        g_return_val_if_fail (info_set != NULL, FALSE);
+        g_return_val_if_fail (restriction != NULL, FALSE);
+
+        if (g_strcmp0 (info_set->mime,
+                       gupnp_dlna_restriction_get_mime (restriction)))
+                return FALSE;
+
+        unsupported_match = FALSE;
+        g_hash_table_iter_init (&iter,
+                                gupnp_dlna_restriction_get_entries
+                                        (restriction));
+        while (g_hash_table_iter_next (&iter, &key, &value)) {
+                GUPnPDLNAInfoValue *info_value;
+                GUPnPDLNAValueList *value_list;
+                gboolean unsupported;
+
+                if (!g_hash_table_lookup_extended (info_set->entries,
+                                                   key,
+                                                   NULL,
+                                                   (gpointer *) &info_value))
+                        return FALSE;
+                value_list = (GUPnPDLNAValueList *) value;
+                if (!gupnp_dlna_value_list_is_superset (value_list,
+                                                        info_value,
+                                                        &unsupported))
+                        return FALSE;
+                else if (unsupported)
+                        unsupported_match = TRUE;
+        }
+
+        if (unsupported_match)
+                g_warning ("Info set matched restriction, but it has an "
+                           "unsupported value.");
+
+        return TRUE;
+}
+
+static gboolean
+gupnp_dlna_info_set_is_empty (GUPnPDLNAInfoSet *info_set)
+{
+        g_return_val_if_fail (info_set != NULL, TRUE);
+
+        return (info_set->mime == NULL &&
+                g_hash_table_size (info_set->entries) == 0);
+}
+
+gchar *
+gupnp_dlna_info_set_to_string (GUPnPDLNAInfoSet *info_set)
+{
+        GString *str;
+        GHashTableIter iter;
+        gpointer key;
+        gpointer value;
+
+        g_return_val_if_fail (info_set != NULL, NULL);
+
+        if (gupnp_dlna_info_set_is_empty (info_set))
+                return g_strdup ("EMPTY");
+
+        str = g_string_new (info_set->mime ? info_set->mime : "(null)");
+        g_hash_table_iter_init (&iter, info_set->entries);
+        while (g_hash_table_iter_next (&iter, &key, &value)) {
+                gchar *raw = gupnp_dlna_info_value_to_string (value);
+
+                g_string_append_printf (str, ", %s=%s", (gchar *) key, raw);
+                g_free (raw);
+        }
+
+        return g_string_free (str, FALSE);
+}
+
+const gchar *
+gupnp_dlna_info_set_get_mime (GUPnPDLNAInfoSet *info_set)
+{
+        g_return_val_if_fail (info_set != NULL, NULL);
+
+        return info_set->mime;
+}
diff --git a/libgupnp-dlna/gupnp-dlna-info-set.h b/libgupnp-dlna/gupnp-dlna-info-set.h
new file mode 100644 (file)
index 0000000..3153116
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_INFO_SET_H__
+#define __GUPNP_DLNA_INFO_SET_H__
+
+#include <glib.h>
+#include "gupnp-dlna-restriction.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GUPnPDLNAInfoSet GUPnPDLNAInfoSet;
+
+GUPnPDLNAInfoSet *
+gupnp_dlna_info_set_new (const gchar *mime);
+
+void
+gupnp_dlna_info_set_free (GUPnPDLNAInfoSet *info_set);
+
+gboolean
+gupnp_dlna_info_set_add_bool (GUPnPDLNAInfoSet *info_set,
+                              const gchar      *name,
+                              gboolean          value);
+
+gboolean
+gupnp_dlna_info_set_add_unsupported_bool (GUPnPDLNAInfoSet *info_set,
+                                          const gchar      *name);
+
+gboolean
+gupnp_dlna_info_set_add_fraction (GUPnPDLNAInfoSet *info_set,
+                                  const gchar      *name,
+                                  gint              numerator,
+                                  gint              denominator);
+
+gboolean
+gupnp_dlna_info_set_add_unsupported_fraction (GUPnPDLNAInfoSet *info_set,
+                                              const gchar      *name);
+
+gboolean
+gupnp_dlna_info_set_add_int (GUPnPDLNAInfoSet *info_set,
+                             const gchar      *name,
+                             gint              value);
+
+gboolean
+gupnp_dlna_info_set_add_unsupported_int (GUPnPDLNAInfoSet *info_set,
+                                         const gchar      *name);
+
+gboolean
+gupnp_dlna_info_set_add_string (GUPnPDLNAInfoSet *info_set,
+                                const gchar      *name,
+                                const gchar      *value);
+
+gboolean
+gupnp_dlna_info_set_add_unsupported_string (GUPnPDLNAInfoSet *info_set,
+                                            const gchar      *name);
+
+gboolean
+gupnp_dlna_info_set_fits_restriction (GUPnPDLNAInfoSet     *info_set,
+                                      GUPnPDLNARestriction *restriction);
+
+gchar *
+gupnp_dlna_info_set_to_string (GUPnPDLNAInfoSet *info_set);
+
+const gchar *
+gupnp_dlna_info_set_get_mime (GUPnPDLNAInfoSet *info_set);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_INFO_SET_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-info-value.c b/libgupnp-dlna/gupnp-dlna-info-value.c
new file mode 100644 (file)
index 0000000..10cc487
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <string.h> /* for memset */
+
+#include "gupnp-dlna-info-value.h"
+
+/* private */
+struct _GUPnPDLNAInfoValue {
+        GUPnPDLNAValueType  *type;
+        GUPnPDLNAValueUnion  value;
+        gboolean             unsupported;
+};
+
+static GUPnPDLNAInfoValue *
+value_new (GUPnPDLNAValueType *type,
+           gchar *raw)
+{
+        GUPnPDLNAInfoValue *info_value = g_slice_new (GUPnPDLNAInfoValue);
+
+        info_value->type = type;
+        if (!gupnp_dlna_value_type_init (type, &info_value->value, raw)) {
+                g_slice_free (GUPnPDLNAInfoValue, info_value);
+                info_value = NULL;
+        }
+        else
+                info_value->unsupported = FALSE;
+        g_free (raw);
+
+        return info_value;
+}
+
+static GUPnPDLNAInfoValue *
+value_unsupported (GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAInfoValue *info_value = g_slice_new (GUPnPDLNAInfoValue);
+
+        info_value->type = type;
+        memset (&info_value->value, 0, sizeof (GUPnPDLNAValueUnion));
+        info_value->unsupported = TRUE;
+
+        return info_value;
+}
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_bool (gboolean value)
+{
+        return value_new (gupnp_dlna_value_type_bool (),
+                          g_strdup (value ? "true" : "false"));
+}
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_unsupported_bool (void)
+{
+        return value_unsupported (gupnp_dlna_value_type_bool ());
+}
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_fraction (gint numerator,
+                                    gint denominator)
+{
+        return value_new (gupnp_dlna_value_type_fraction (),
+                          g_strdup_printf ("%d/%d",
+                                           numerator,
+                                           denominator));
+}
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_unsupported_fraction (void)
+{
+        return value_unsupported (gupnp_dlna_value_type_fraction ());
+}
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_int (gint value)
+{
+        return value_new (gupnp_dlna_value_type_int (),
+                          g_strdup_printf ("%d", value));
+}
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_unsupported_int (void)
+{
+        return value_unsupported (gupnp_dlna_value_type_int ());
+}
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_string (const gchar *value)
+{
+        return value_new (gupnp_dlna_value_type_string (),
+                          g_strdup (value));
+}
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_unsupported_string (void)
+{
+        return value_unsupported (gupnp_dlna_value_type_string ());
+}
+
+void
+gupnp_dlna_info_value_free (GUPnPDLNAInfoValue *info_value)
+{
+        if (info_value == NULL)
+                return;
+
+        if (!info_value->unsupported)
+                gupnp_dlna_value_type_clean (info_value->type,
+                                             &info_value->value);
+        g_slice_free (GUPnPDLNAInfoValue, info_value);
+}
+
+GUPnPDLNAValueType *
+gupnp_dlna_info_value_get_type (GUPnPDLNAInfoValue *info_value)
+{
+        g_return_val_if_fail (info_value != NULL, NULL);
+
+        return info_value->type;
+}
+
+GUPnPDLNAValueUnion *
+gupnp_dlna_info_value_get_value (GUPnPDLNAInfoValue *info_value)
+{
+        g_return_val_if_fail (info_value != NULL, NULL);
+
+        if (info_value->unsupported)
+                return NULL;
+        else
+                return &info_value->value;
+}
+
+gchar *
+gupnp_dlna_info_value_to_string (GUPnPDLNAInfoValue *info_value)
+{
+        const gchar *type;
+        gchar *raw;
+        gchar *str;
+
+        g_return_val_if_fail (info_value != NULL, NULL);
+
+        type = gupnp_dlna_value_type_name (info_value->type);
+        if (info_value->unsupported)
+                raw = g_strdup ("<UNSUPPORTED>");
+        else
+                raw = gupnp_dlna_value_type_to_string (info_value->type,
+                                                       &info_value->value);
+        str = g_strdup_printf ("(%s)%s", type, raw);
+        g_free (raw);
+
+        return str;
+}
+
+gboolean
+gupnp_dlna_info_value_is_unsupported (GUPnPDLNAInfoValue *info_value)
+{
+        g_return_val_if_fail (info_value != NULL, FALSE);
+
+        return info_value->unsupported;
+}
diff --git a/libgupnp-dlna/gupnp-dlna-info-value.h b/libgupnp-dlna/gupnp-dlna-info-value.h
new file mode 100644 (file)
index 0000000..e230e4d
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_INFO_VALUE_H__
+#define __GUPNP_DLNA_INFO_VALUE_H__
+
+#include <glib.h>
+
+#include "gupnp-dlna-value-type.h"
+#include "gupnp-dlna-value-union.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GUPnPDLNAInfoValue GUPnPDLNAInfoValue;
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_bool (gboolean value);
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_unsupported_bool (void);
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_fraction (gint numerator,
+                                    gint denominator);
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_unsupported_fraction (void);
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_int (gint value);
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_unsupported_int (void);
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_string (const gchar *value);
+
+GUPnPDLNAInfoValue *
+gupnp_dlna_info_value_new_unsupported_string (void);
+
+void
+gupnp_dlna_info_value_free (GUPnPDLNAInfoValue *info_value);
+
+gchar *
+gupnp_dlna_info_value_to_string (GUPnPDLNAInfoValue *info_value);
+
+gboolean
+gupnp_dlna_info_value_is_unsupported (GUPnPDLNAInfoValue *info_value);
+
+GUPnPDLNAValueType *
+gupnp_dlna_info_value_get_type (GUPnPDLNAInfoValue *info_value);
+
+GUPnPDLNAValueUnion *
+gupnp_dlna_info_value_get_value (GUPnPDLNAInfoValue *info_value);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_INFO_VALUE_H__ */
index 5585893..7d1ea8d 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
  *
- * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
-#include "gupnp-dlna-information.h"
-#include <gst/gstminiobject.h>
-
 /**
  * SECTION:gupnp-dlna-information
- * @short_description: Object containing metadata information returned by the
- * #GUPnPDLNADiscoverer API
+ * @short_description: Base class for storing various types of
+ * metadata informations.
+ *
+ * Subclasses of #GUPnPDLNAInformation should override all virtual
+ * functions provided by this class. The overrides should return a
+ * subclasses of specific information base classes.
  *
- * The GUPnPDLNAInformation object holds metadata information discovered by the
- * GUPnPDiscoverer API. The DLNA profile name and MIME type have their own
- * fields, and other metadata is held in a GstDiscovererInfo structure.
- * All fields are read-only.
+ * When instantiating a subclass of #GUPnPDLNAInformation make sure
+ * that "uri" with a URI to media file is passed to g_object_new().
  */
 
-G_DEFINE_TYPE (GUPnPDLNAInformation, gupnp_dlna_information, G_TYPE_OBJECT)
-
-#define GET_PRIVATE(o)                                                  \
-        (G_TYPE_INSTANCE_GET_PRIVATE ((o),                              \
-                                      GUPNP_TYPE_DLNA_INFORMATION,      \
-                                      GUPnPDLNAInformationPrivate))
+#include "gupnp-dlna-information.h"
 
-typedef struct _GUPnPDLNAInformationPrivate GUPnPDLNAInformationPrivate;
+G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAInformation,
+                        gupnp_dlna_information,
+                        G_TYPE_OBJECT)
 
 struct _GUPnPDLNAInformationPrivate {
-        GstDiscovererInfo *info;
-        gchar             *name;
-        gchar             *mime;
+        gchar* uri;
+        gboolean got_audio_info;
+        gboolean got_container_info;
+        gboolean got_image_info;
+        gboolean got_video_info;
+        GUPnPDLNAAudioInformation *audio_info;
+        GUPnPDLNAContainerInformation *container_info;
+        GUPnPDLNAImageInformation *image_info;
+        GUPnPDLNAVideoInformation *video_info;
 };
 
 enum {
         PROP_0,
-        PROP_DLNA_NAME,
-        PROP_DLNA_MIME,
-        PROP_DISCOVERER_INFO,
+
+        PROP_URI,
+        PROP_AUDIO_INFO,
+        PROP_CONTAINER_INFO,
+        PROP_IMAGE_INFO,
+        PROP_VIDEO_INFO
 };
 
 static void
-gupnp_dlna_information_get_property (GObject    *object,
-                                     guint       property_id,
-                                     GValue     *value,
-                                     GParamSpec *pspec)
+gupnp_dlna_information_dispose (GObject *object)
 {
-        GUPnPDLNAInformation *self = GUPNP_DLNA_INFORMATION (object);
-        GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self);
-
-        switch (property_id) {
-                case PROP_DLNA_NAME:
-                        g_value_set_string (value, priv->name);
-
-                        break;
-
-                case PROP_DLNA_MIME:
-                        g_value_set_string (value, priv->mime);
-
-                        break;
-
-                case PROP_DISCOVERER_INFO:
-                        gst_value_set_mini_object (value,
-                                                   GST_MINI_OBJECT(priv->info));
-
-                        break;
+        GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+        GUPnPDLNAInformationPrivate *priv = info->priv;
+
+        g_clear_object (&priv->audio_info);
+        g_clear_object (&priv->container_info);
+        g_clear_object (&priv->image_info);
+        g_clear_object (&priv->video_info);
+        G_OBJECT_CLASS (gupnp_dlna_information_parent_class)->dispose (object);
+}
 
-                default:
-                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
-                                                           property_id,
-                                                           pspec);
+static void
+gupnp_dlna_information_finalize (GObject *object)
+{
+        GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
 
-                        break;
-        }
+        g_free (info->priv->uri);
+        G_OBJECT_CLASS (gupnp_dlna_information_parent_class)->finalize (object);
 }
 
 static void
@@ -96,170 +88,321 @@ gupnp_dlna_information_set_property (GObject      *object,
                                      const GValue *value,
                                      GParamSpec   *pspec)
 {
-        GUPnPDLNAInformation *self = GUPNP_DLNA_INFORMATION (object);
-        GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self);
+        GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+        GUPnPDLNAInformationPrivate *priv = info->priv;
 
         switch (property_id) {
-                case PROP_DLNA_NAME:
-                        g_free (priv->name);
-                        priv->name = g_value_dup_string (value);
-
-                        break;
-
-                case PROP_DLNA_MIME:
-                        g_free (priv->mime);
-                        priv->mime = g_value_dup_string (value);
-
-                        break;
-
-                case PROP_DISCOVERER_INFO:
-                        if (priv->info)
-                                gst_discoverer_info_unref (priv->info);
-                        priv->info = GST_DISCOVERER_INFO
-                                (gst_value_dup_mini_object (value));
-
-                        break;
-
-                default:
-                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
-                                                           property_id,
-                                                           pspec);
-
-                        break;
+        case PROP_URI:
+                g_free (priv->uri);
+                priv->uri = g_value_dup_string (value);
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
         }
 }
 
-
 static void
-gupnp_dlna_information_finalize (GObject *object)
+gupnp_dlna_information_get_property (GObject    *object,
+                                     guint       property_id,
+                                     GValue     *value,
+                                     GParamSpec *pspec)
 {
-        GUPnPDLNAInformation *self = GUPNP_DLNA_INFORMATION (object);
-        GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self);
-
-        g_free (priv->name);
-        g_free (priv->mime);
-        if (priv->info)
-                gst_discoverer_info_unref (priv->info);
+        GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+        GUPnPDLNAInformationPrivate *priv = info->priv;
 
-        G_OBJECT_CLASS (gupnp_dlna_information_parent_class)->finalize (object);
+        switch (property_id) {
+        case PROP_URI:
+                g_value_set_string (value, priv->uri);
+
+                break;
+        case PROP_AUDIO_INFO:
+                g_value_set_object
+                          (value,
+                           gupnp_dlna_information_get_audio_information (info));
+
+                break;
+        case PROP_CONTAINER_INFO:
+                g_value_set_object
+                      (value,
+                       gupnp_dlna_information_get_container_information (info));
+
+                break;
+        case PROP_IMAGE_INFO:
+                g_value_set_object
+                          (value,
+                           gupnp_dlna_information_get_image_information (info));
+
+                break;
+        case PROP_VIDEO_INFO:
+                g_value_set_object
+                          (value,
+                           gupnp_dlna_information_get_video_information (info));
+
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+
+                break;
+        }
 }
 
 static void
-gupnp_dlna_information_class_init (GUPnPDLNAInformationClass *klass)
+gupnp_dlna_information_class_init (GUPnPDLNAInformationClass *info_class)
 {
-        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+        GObjectClass *object_class = G_OBJECT_CLASS (info_class);
         GParamSpec *pspec;
 
-        g_type_class_add_private (klass, sizeof (GUPnPDLNAInformationPrivate));
-
-        object_class->get_property = gupnp_dlna_information_get_property;
-        object_class->set_property = gupnp_dlna_information_set_property;
+        object_class->dispose = gupnp_dlna_information_dispose;
         object_class->finalize = gupnp_dlna_information_finalize;
-
-        pspec = g_param_spec_string ("name",
-                                     "DLNA profile name",
-                                     "The name of the DLNA profile "
-                                     "corresponding to the strream",
-                                     NULL,
-                                     G_PARAM_READWRITE |
-                                     G_PARAM_CONSTRUCT_ONLY);
-        g_object_class_install_property (object_class, PROP_DLNA_NAME, pspec);
-
-        pspec = g_param_spec_string ("mime",
-                                     "DLNA profile MIME type corresponding "
-                                     "to the stream",
-                                     "The DLNA MIME type of the stream",
+        object_class->set_property = gupnp_dlna_information_set_property;
+        object_class->get_property = gupnp_dlna_information_get_property;
+        info_class->get_container_information = NULL;
+        info_class->get_image_information = NULL;
+        info_class->get_video_information = NULL;
+        info_class->get_audio_information = NULL;
+
+        /**
+         * GUPnPDLNAInformation:uri:
+         *
+         * URI of file which metadata this object stores.
+         */
+        pspec = g_param_spec_string ("uri",
+                                     "uri",
+                                     "URI of file which metadata this object "
+                                     "stores",
                                      NULL,
                                      G_PARAM_READWRITE |
                                      G_PARAM_CONSTRUCT_ONLY);
-        g_object_class_install_property (object_class, PROP_DLNA_MIME, pspec);
-
-        pspec = gst_param_spec_mini_object ("info",
-                                            "Stream metadata",
-                                            "Metadata of the stream in a "
-                                            "GstDiscovererInfo structure",
-                                            GST_TYPE_DISCOVERER_INFO,
-                                            G_PARAM_READWRITE |
-                                            G_PARAM_CONSTRUCT_ONLY);
+        g_object_class_install_property (object_class, PROP_URI, pspec);
+
+        /**
+         * GUPnPDLNAInformation:audio-information:
+         *
+         * Audio information of a file.
+         */
+        pspec = g_param_spec_object ("audio-information",
+                                     "Audio information",
+                                     "Audio information of a file",
+                                     GUPNP_TYPE_DLNA_AUDIO_INFORMATION,
+                                     G_PARAM_READABLE);
+        g_object_class_install_property (object_class, PROP_AUDIO_INFO, pspec);
+
+        /**
+         * GUPnPDLNAInformation:container-information:
+         *
+         * Container information of a file.
+         */
+        pspec = g_param_spec_object ("container-information",
+                                     "Container information",
+                                     "Container information of a file",
+                                     GUPNP_TYPE_DLNA_CONTAINER_INFORMATION,
+                                     G_PARAM_READABLE);
         g_object_class_install_property (object_class,
-                                         PROP_DISCOVERER_INFO,
+                                         PROP_CONTAINER_INFO,
                                          pspec);
+
+        /**
+         * GUPnPDLNAInformation:image-information:
+         *
+         * Image information of a file.
+         */
+        pspec = g_param_spec_object ("image-information",
+                                     "Image information",
+                                     "Image information of a file",
+                                     GUPNP_TYPE_DLNA_IMAGE_INFORMATION,
+                                     G_PARAM_READABLE);
+        g_object_class_install_property (object_class, PROP_IMAGE_INFO, pspec);
+
+        /**
+         * GUPnPDLNAInformation:video-information:
+         *
+         * Video information of a file.
+         */
+        pspec = g_param_spec_object ("video-information",
+                                     "Video information",
+                                     "Video information of a file",
+                                     GUPNP_TYPE_DLNA_VIDEO_INFORMATION,
+                                     G_PARAM_READABLE);
+        g_object_class_install_property (object_class, PROP_VIDEO_INFO, pspec);
+
+        g_type_class_add_private (info_class,
+                                  sizeof (GUPnPDLNAInformationPrivate));
 }
 
 static void
-gupnp_dlna_information_init (GUPnPDLNAInformation *self)
+gupnp_dlna_information_init (GUPnPDLNAInformation *info)
+{
+        GUPnPDLNAInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (info,
+                                         GUPNP_TYPE_DLNA_INFORMATION,
+                                         GUPnPDLNAInformationPrivate);
+
+        priv->uri = NULL;
+        priv->got_audio_info = FALSE;
+        priv->got_container_info = FALSE;
+        priv->got_image_info = FALSE;
+        priv->got_video_info = FALSE;
+        priv->audio_info = NULL;
+        priv->container_info = NULL;
+        priv->image_info = NULL;
+        priv->video_info = NULL;
+        info->priv = priv;
+}
+
+/**
+ * gupnp_dlna_information_get_audio_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an audio information of media file if applicable (e.g. for
+ * video and audio files).
+ *
+ * Returns: (transfer none): A #GUPnPDLNAAudioInformation object or %NULL.
+ */
+GUPnPDLNAAudioInformation *
+gupnp_dlna_information_get_audio_information (GUPnPDLNAInformation *info)
 {
-        GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self);
+        GUPnPDLNAInformationPrivate *priv;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+        priv = info->priv;
+        if (!priv->got_audio_info) {
+                GUPnPDLNAInformationClass *info_class;
+
+                info_class = GUPNP_DLNA_INFORMATION_GET_CLASS (info);
+
+                g_return_val_if_fail
+                                  (GUPNP_IS_DLNA_INFORMATION_CLASS (info_class),
+                                   NULL);
+                g_return_val_if_fail (info_class->get_audio_information != NULL,
+                                      NULL);
 
-        priv->name = NULL;
-        priv->mime = NULL;
-        priv->info = NULL;
+                priv->audio_info = info_class->get_audio_information (info);
+                priv->got_audio_info = TRUE;
+        }
+
+        return priv->audio_info;
 }
 
 /**
- * gupnp_dlna_information_new:
- * @name: DLNA media profile name corresponding to the media
- * @mime: DLNA MIME type for the media
- * @info: #GstDiscovererInfo type with additional metadata about the
- *        stream
+ * gupnp_dlna_information_get_container_information:
+ * @info: A #GUPnPDLNAInformation object.
  *
- * Creates a new #GUPnPDLNAInformation object with the given properties.
+ * Get an container information of media file if applicable (e.g. for
+ * video and audio files).
  *
- * Returns: A newly created #GUPnPDLNAInformation object.
+ * Returns: (transfer none): A #GUPnPDLNAContainerInformation object or %NULL.
  */
-GUPnPDLNAInformation*
-gupnp_dlna_information_new (gchar             *name,
-                            gchar             *mime,
-                            GstDiscovererInfo *info)
+GUPnPDLNAContainerInformation *
+gupnp_dlna_information_get_container_information (GUPnPDLNAInformation *info)
 {
-        return g_object_new (GUPNP_TYPE_DLNA_INFORMATION,
-                             "name", name,
-                             "mime", mime,
-                             "info", info,
-                             NULL);
+        GUPnPDLNAInformationPrivate *priv;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+        priv = info->priv;
+        if (!priv->got_container_info) {
+                GUPnPDLNAInformationClass *info_class;
+
+                info_class = GUPNP_DLNA_INFORMATION_GET_CLASS (info);
+
+                g_return_val_if_fail
+                                  (GUPNP_IS_DLNA_INFORMATION_CLASS (info_class),
+                                   NULL);
+                g_return_val_if_fail
+                                 (info_class->get_container_information != NULL,
+                                  NULL);
+
+                priv->container_info =
+                                   info_class->get_container_information (info);
+                priv->got_container_info = TRUE;
+        }
+
+        return priv->container_info;
 }
 
 /**
- * gupnp_dlna_information_get_name:
- * @self: The #GUPnPDLNAInformation object
+ * gupnp_dlna_information_get_image_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an container information of media file if applicable (e.g. for
+ * image files).
  *
- * Returns: the DLNA profile name of the stream represented by @self. Do not
- *          free this string.
+ * Returns: (transfer none): A #GUPnPDLNAImageInformation object or %NULL.
  */
-const gchar *
-gupnp_dlna_information_get_name (GUPnPDLNAInformation *self)
+GUPnPDLNAImageInformation *
+gupnp_dlna_information_get_image_information (GUPnPDLNAInformation *info)
 {
-        GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self);
+        GUPnPDLNAInformationPrivate *priv;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+        priv = info->priv;
+        if (!priv->got_image_info) {
+                GUPnPDLNAInformationClass *info_class;
+
+                info_class = GUPNP_DLNA_INFORMATION_GET_CLASS (info);
+
+                g_return_val_if_fail
+                                  (GUPNP_IS_DLNA_INFORMATION_CLASS (info_class),
+                                   NULL);
+                g_return_val_if_fail (info_class->get_image_information != NULL,
+                                      NULL);
+
+                priv->image_info = info_class->get_image_information (info);
+                priv->got_image_info = TRUE;
+        }
 
-        return priv->name;
+        return priv->image_info;
 }
 
 /**
- * gupnp_dlna_information_get_mime:
- * @self: The #GUPnPDLNAInformation object
+ * gupnp_dlna_information_get_video_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an container information of media file if applicable (e.g. for
+ * video files).
  *
- * Returns: the DLNA MIME type of the stream represented by @self. Do not
- *          free this string.
+ * Returns: (transfer none): A #GUPnPDLNAVideoInformation object or %NULL.
  */
-const gchar *
-gupnp_dlna_information_get_mime (GUPnPDLNAInformation *self)
+GUPnPDLNAVideoInformation *
+gupnp_dlna_information_get_video_information (GUPnPDLNAInformation *info)
 {
-        GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self);
+        GUPnPDLNAInformationPrivate *priv;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+        priv = info->priv;
+        if (!priv->got_video_info) {
+                GUPnPDLNAInformationClass *info_class;
+
+                info_class = GUPNP_DLNA_INFORMATION_GET_CLASS (info);
 
-        return priv->mime;
+                g_return_val_if_fail
+                                  (GUPNP_IS_DLNA_INFORMATION_CLASS (info_class),
+                                   NULL);
+                g_return_val_if_fail (info_class->get_video_information != NULL,
+                                      NULL);
+
+                priv->video_info = info_class->get_video_information (info);
+                priv->got_video_info = TRUE;
+        }
+
+        return priv->video_info;
 }
 
-/**finalize
- * gupnp_dlna_information_get_info:
- * @self: The #GUPnPDLNAInformation object
+/**
+ * gupnp_dlna_information_get_uri:
+ * @info: A #GUPnPDLNAInformation object.
  *
- * Returns: additional stream metadata for @self in the form of a
- *          #GstDiscovererInfo structure. Do not free this structure.
+ * Returns: (transfer none): An URI of a file.
  */
-const GstDiscovererInfo *
-gupnp_dlna_information_get_info (GUPnPDLNAInformation *self)
+const gchar *
+gupnp_dlna_information_get_uri (GUPnPDLNAInformation *info)
 {
-        GUPnPDLNAInformationPrivate *priv = GET_PRIVATE (self);
+        g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
 
-        return priv->info;
+        return info->priv->uri;
 }
index 5293fc1..88e6736 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
  *
- * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 #ifndef __GUPNP_DLNA_INFORMATION_H__
 #define __GUPNP_DLNA_INFORMATION_H__
 
-#include <gst/pbutils/pbutils.h>
 #include <glib-object.h>
+#include <libgupnp-dlna/gupnp-dlna-audio-information.h>
+#include <libgupnp-dlna/gupnp-dlna-container-information.h>
+#include <libgupnp-dlna/gupnp-dlna-image-information.h>
+#include <libgupnp-dlna/gupnp-dlna-video-information.h>
 
 G_BEGIN_DECLS
 
-#define GUPNP_TYPE_DLNA_INFORMATION gupnp_dlna_information_get_type()
+#define GUPNP_TYPE_DLNA_INFORMATION (gupnp_dlna_information_get_type())
 
-#define GUPNP_DLNA_INFORMATION(obj)                                     \
-        (G_TYPE_CHECK_INSTANCE_CAST ((obj),                             \
-                                     GUPNP_TYPE_DLNA_INFORMATION,       \
+#define GUPNP_DLNA_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_INFORMATION, \
                                      GUPnPDLNAInformation))
 
-#define GUPNP_DLNA_INFORMATION_CLASS(klass)                             \
-        (G_TYPE_CHECK_CLASS_CAST ((klass),                              \
-                                  GUPNP_TYPE_DLNA_INFORMATION,          \
+#define GUPNP_DLNA_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_INFORMATION, \
                                   GUPnPDLNAInformationClass))
 
-#define GUPNP_IS_DLNA_INFORMATION(obj)                                  \
-        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GUPNP_TYPE_DLNA_INFORMATION))
+#define GUPNP_IS_DLNA_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_INFORMATION))
 
-#define GUPNP_IS_DLNA_INFORMATION_CLASS(klass)                          \
-        (G_TYPE_CHECK_CLASS_TYPE ((klass), GUPNP_TYPE_DLNA_INFORMATION))
+#define GUPNP_IS_DLNA_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_INFORMATION))
 
-#define GUPNP_DLNA_INFORMATION_GET_CLASS(obj)                           \
-        (G_TYPE_INSTANCE_GET_CLASS ((obj),                              \
-                                    GUPNP_TYPE_DLNA_INFORMATION,        \
+#define GUPNP_DLNA_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_INFORMATION, \
                                     GUPnPDLNAInformationClass))
 
+typedef struct _GUPnPDLNAInformationPrivate GUPnPDLNAInformationPrivate;
+
 typedef struct {
         GObject parent;
+
+        GUPnPDLNAInformationPrivate *priv;
 } GUPnPDLNAInformation;
 
+/**
+ * GUPnPDLNAInformationClass:
+ * @parent_class: Parent class.
+ * @get_audio_information: This is called by #GUPnPDLNAProfileGuesser
+ * to get an audio information.
+ * @get_container_information: This is called by
+ * #GUPnPDLNAProfileGuesser to get a container information.
+ * @get_image_information: This is called by #GUPnPDLNAProfileGuesser
+ * to get an image information.
+ * @get_video_information: This is called by #GUPnPDLNAProfileGuesser
+ * to get a video information.
+ * @_reserved: Padding. Ignore it.
+ */
 typedef struct {
         GObjectClass parent_class;
+
+        GUPnPDLNAAudioInformation *
+        (* get_audio_information) (GUPnPDLNAInformation *info);
+
+        GUPnPDLNAContainerInformation *
+        (* get_container_information) (GUPnPDLNAInformation *info);
+
+        GUPnPDLNAImageInformation *
+        (* get_image_information) (GUPnPDLNAInformation *info);
+
+        GUPnPDLNAVideoInformation *
+        (* get_video_information) (GUPnPDLNAInformation *info);
+
+        gpointer _reserved[12];
 } GUPnPDLNAInformationClass;
 
-GType gupnp_dlna_information_get_type (void);
+GType
+gupnp_dlna_information_get_type (void);
+
+GUPnPDLNAAudioInformation*
+gupnp_dlna_information_get_audio_information (GUPnPDLNAInformation *info);
 
-GUPnPDLNAInformation*
-gupnp_dlna_information_new (gchar             *name,
-                            gchar             *mime,
-                            GstDiscovererInfo *info);
+GUPnPDLNAContainerInformation*
+gupnp_dlna_information_get_container_information (GUPnPDLNAInformation *info);
 
-const gchar * gupnp_dlna_information_get_name (GUPnPDLNAInformation *self);
-const gchar * gupnp_dlna_information_get_mime (GUPnPDLNAInformation *self);
-const GstDiscovererInfo *
-gupnp_dlna_information_get_info (GUPnPDLNAInformation *self);
+GUPnPDLNAImageInformation*
+gupnp_dlna_information_get_image_information (GUPnPDLNAInformation *info);
 
-G_GNUC_INTERNAL GUPnPDLNAInformation *
-gupnp_dlna_information_new_from_discoverer_info (GstDiscovererInfo *info,
-                                                 GList             *profiles);
+GUPnPDLNAVideoInformation*
+gupnp_dlna_information_get_video_information (GUPnPDLNAInformation *info);
 
+const gchar *
+gupnp_dlna_information_get_uri (GUPnPDLNAInformation *info);
 
 G_END_DECLS
 
diff --git a/libgupnp-dlna/gupnp-dlna-marshal.c b/libgupnp-dlna/gupnp-dlna-marshal.c
deleted file mode 100644 (file)
index 7b5a28e..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-
-#ifndef __gupnp_dlna_marshal_MARSHAL_H__
-#define __gupnp_dlna_marshal_MARSHAL_H__
-
-#include       <glib-object.h>
-
-G_BEGIN_DECLS
-
-#ifdef G_ENABLE_DEBUG
-#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
-#define g_marshal_value_peek_char(v)     g_value_get_schar (v)
-#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
-#define g_marshal_value_peek_int(v)      g_value_get_int (v)
-#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
-#define g_marshal_value_peek_long(v)     g_value_get_long (v)
-#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
-#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
-#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
-#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
-#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
-#define g_marshal_value_peek_float(v)    g_value_get_float (v)
-#define g_marshal_value_peek_double(v)   g_value_get_double (v)
-#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
-#define g_marshal_value_peek_param(v)    g_value_get_param (v)
-#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
-#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
-#define g_marshal_value_peek_object(v)   g_value_get_object (v)
-#define g_marshal_value_peek_variant(v)  g_value_get_variant (v)
-#else /* !G_ENABLE_DEBUG */
-/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
- *          Do not access GValues directly in your code. Instead, use the
- *          g_value_get_*() functions
- */
-#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
-#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
-#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
-#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
-#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
-#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
-#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
-#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
-#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
-#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
-#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
-#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
-#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
-#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
-#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
-#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
-#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
-#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
-#define g_marshal_value_peek_variant(v)  (v)->data[0].v_pointer
-#endif /* !G_ENABLE_DEBUG */
-
-
-/* BOOLEAN:STRING,UINT,STRING,POINTER (./gupnp-dlna-marshal.list:1) */
-extern void gupnp_dlna_marshal_BOOLEAN__STRING_UINT_STRING_POINTER (GClosure     *closure,
-                                                                    GValue       *return_value,
-                                                                    guint         n_param_values,
-                                                                    const GValue *param_values,
-                                                                    gpointer      invocation_hint,
-                                                                    gpointer      marshal_data);
-void
-gupnp_dlna_marshal_BOOLEAN__STRING_UINT_STRING_POINTER (GClosure     *closure,
-                                                        GValue       *return_value G_GNUC_UNUSED,
-                                                        guint         n_param_values,
-                                                        const GValue *param_values,
-                                                        gpointer      invocation_hint G_GNUC_UNUSED,
-                                                        gpointer      marshal_data)
-{
-  typedef gboolean (*GMarshalFunc_BOOLEAN__STRING_UINT_STRING_POINTER) (gpointer     data1,
-                                                                        gpointer     arg_1,
-                                                                        guint        arg_2,
-                                                                        gpointer     arg_3,
-                                                                        gpointer     arg_4,
-                                                                        gpointer     data2);
-  register GMarshalFunc_BOOLEAN__STRING_UINT_STRING_POINTER callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-  gboolean v_return;
-
-  g_return_if_fail (return_value != NULL);
-  g_return_if_fail (n_param_values == 5);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_BOOLEAN__STRING_UINT_STRING_POINTER) (marshal_data ? marshal_data : cc->callback);
-
-  v_return = callback (data1,
-                       g_marshal_value_peek_string (param_values + 1),
-                       g_marshal_value_peek_uint (param_values + 2),
-                       g_marshal_value_peek_string (param_values + 3),
-                       g_marshal_value_peek_pointer (param_values + 4),
-                       data2);
-
-  g_value_set_boolean (return_value, v_return);
-}
-
-/* VOID:OBJECT,BOXED (./gupnp-dlna-marshal.list:2) */
-extern void gupnp_dlna_marshal_VOID__OBJECT_BOXED (GClosure     *closure,
-                                                   GValue       *return_value,
-                                                   guint         n_param_values,
-                                                   const GValue *param_values,
-                                                   gpointer      invocation_hint,
-                                                   gpointer      marshal_data);
-void
-gupnp_dlna_marshal_VOID__OBJECT_BOXED (GClosure     *closure,
-                                       GValue       *return_value G_GNUC_UNUSED,
-                                       guint         n_param_values,
-                                       const GValue *param_values,
-                                       gpointer      invocation_hint G_GNUC_UNUSED,
-                                       gpointer      marshal_data)
-{
-  typedef void (*GMarshalFunc_VOID__OBJECT_BOXED) (gpointer     data1,
-                                                   gpointer     arg_1,
-                                                   gpointer     arg_2,
-                                                   gpointer     data2);
-  register GMarshalFunc_VOID__OBJECT_BOXED callback;
-  register GCClosure *cc = (GCClosure*) closure;
-  register gpointer data1, data2;
-
-  g_return_if_fail (n_param_values == 3);
-
-  if (G_CCLOSURE_SWAP_DATA (closure))
-    {
-      data1 = closure->data;
-      data2 = g_value_peek_pointer (param_values + 0);
-    }
-  else
-    {
-      data1 = g_value_peek_pointer (param_values + 0);
-      data2 = closure->data;
-    }
-  callback = (GMarshalFunc_VOID__OBJECT_BOXED) (marshal_data ? marshal_data : cc->callback);
-
-  callback (data1,
-            g_marshal_value_peek_object (param_values + 1),
-            g_marshal_value_peek_boxed (param_values + 2),
-            data2);
-}
-
-G_END_DECLS
-
-#endif /* __gupnp_dlna_marshal_MARSHAL_H__ */
-
diff --git a/libgupnp-dlna/gupnp-dlna-marshal.h b/libgupnp-dlna/gupnp-dlna-marshal.h
deleted file mode 100644 (file)
index 437e4df..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-
-#ifndef __gupnp_dlna_marshal_MARSHAL_H__
-#define __gupnp_dlna_marshal_MARSHAL_H__
-
-#include       <glib-object.h>
-
-G_BEGIN_DECLS
-
-/* BOOLEAN:STRING,UINT,STRING,POINTER (./gupnp-dlna-marshal.list:1) */
-extern void gupnp_dlna_marshal_BOOLEAN__STRING_UINT_STRING_POINTER (GClosure     *closure,
-                                                                    GValue       *return_value,
-                                                                    guint         n_param_values,
-                                                                    const GValue *param_values,
-                                                                    gpointer      invocation_hint,
-                                                                    gpointer      marshal_data);
-
-/* VOID:OBJECT,BOXED (./gupnp-dlna-marshal.list:2) */
-extern void gupnp_dlna_marshal_VOID__OBJECT_BOXED (GClosure     *closure,
-                                                   GValue       *return_value,
-                                                   guint         n_param_values,
-                                                   const GValue *param_values,
-                                                   gpointer      invocation_hint,
-                                                   gpointer      marshal_data);
-
-G_END_DECLS
-
-#endif /* __gupnp_dlna_marshal_MARSHAL_H__ */
-
diff --git a/libgupnp-dlna/gupnp-dlna-marshal.list b/libgupnp-dlna/gupnp-dlna-marshal.list
deleted file mode 100644 (file)
index c03532c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-BOOLEAN:STRING,UINT,STRING,POINTER
-VOID:OBJECT,BOXED
diff --git a/libgupnp-dlna/gupnp-dlna-metadata-backend.c b/libgupnp-dlna/gupnp-dlna-metadata-backend.c
new file mode 100644 (file)
index 0000000..a19b155
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <gmodule.h>
+#include "gupnp-dlna-metadata-backend.h"
+
+#define GET_DEFAULT_EXTRACTOR_SYMBOL "gupnp_dlna_get_default_extractor"
+
+struct {
+        GModule *module;
+        GUPnPDLNAMetadataExtractor * (* get_default_extractor) (void);
+} metadata_backend;
+
+static gboolean
+load_metadata_backend (void)
+{
+        static gsize backend_chosen = 0;
+
+        if (g_once_init_enter (&backend_chosen)) {
+                gchar **environment = g_get_environ ();
+                const gchar *backend =
+                               g_environ_getenv (environment,
+                                                 "GUPNP_DLNA_METADATA_BACKEND");
+                const gchar *backend_dir =
+                           g_environ_getenv (environment,
+                                             "GUPNP_DLNA_METADATA_BACKEND_DIR");
+                GModule *module;
+                gchar *module_path;
+                gpointer get_default_extractor = NULL;
+                gsize loaded = 0;
+
+                if (!backend)
+                        backend = GUPNP_DLNA_DEFAULT_METADATA_BACKEND;
+                if (!backend_dir)
+                        backend_dir = GUPNP_DLNA_DEFAULT_METADATA_BACKEND_DIR;
+                module_path = g_module_build_path (backend_dir, backend);
+                module = g_module_open (module_path, G_MODULE_BIND_MASK);
+
+                if (!module) {
+                        g_warning ("Could not load open metadata backend '%s'.",
+                                   module_path);
+
+                        goto fail;
+                }
+                if (!g_module_symbol (module,
+                                      GET_DEFAULT_EXTRACTOR_SYMBOL,
+                                      &get_default_extractor)) {
+                        g_warning ("Could not find '"
+                                   GET_DEFAULT_EXTRACTOR_SYMBOL
+                                   "' symbol in '%s'.",
+                                   module_path);
+
+                        goto fail;
+                }
+                if (!get_default_extractor) {
+                        g_warning ("'"
+                                   GET_DEFAULT_EXTRACTOR_SYMBOL
+                                   "' symbol in '%s' is invalid.",
+                                   module_path);
+
+                        goto fail;
+                }
+                g_module_make_resident (module);
+                metadata_backend.module = module;
+                metadata_backend.get_default_extractor = get_default_extractor;
+                module = NULL;
+                loaded = 1;
+        fail:
+                g_free (module_path);
+                if (module)
+                        g_module_close (module);
+                g_strfreev (environment);
+                g_once_init_leave (&backend_chosen, loaded);
+        }
+
+        return (backend_chosen != 0);
+}
+
+GUPnPDLNAMetadataExtractor *
+gupnp_dlna_metadata_backend_get_extractor (void)
+{
+        gboolean metadata_backend_loaded = load_metadata_backend ();
+
+        g_return_val_if_fail (metadata_backend_loaded == TRUE, NULL);
+
+        return metadata_backend.get_default_extractor ();
+}
diff --git a/libgupnp-dlna/gupnp-dlna-metadata-backend.h b/libgupnp-dlna/gupnp-dlna-metadata-backend.h
new file mode 100644 (file)
index 0000000..79690d0
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_METADATA_BACKEND__
+#define __GUPNP_DLNA_METADATA_BACKEND__
+
+#include <glib.h>
+#include "gupnp-dlna-metadata-extractor.h"
+
+G_BEGIN_DECLS
+
+GUPnPDLNAMetadataExtractor *
+gupnp_dlna_metadata_backend_get_extractor (void);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_METADATA_BACKEND__ */
diff --git a/libgupnp-dlna/gupnp-dlna-profile-guesser-impl.c b/libgupnp-dlna/gupnp-dlna-profile-guesser-impl.c
new file mode 100644 (file)
index 0000000..8b6f26a
--- /dev/null
@@ -0,0 +1,631 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <glib.h>
+
+#include "gupnp-dlna-profile.h"
+#include "gupnp-dlna-profile-guesser-impl.h"
+#include "gupnp-dlna-information.h"
+#include "gupnp-dlna-audio-information.h"
+#include "gupnp-dlna-container-information.h"
+#include "gupnp-dlna-image-information.h"
+#include "gupnp-dlna-video-information.h"
+#include "gupnp-dlna-utils.h"
+#include "gupnp-dlna-info-set.h"
+
+static gboolean
+is_video_profile (GUPnPDLNAProfile *profile)
+{
+        GList *container_restrictions =
+                 gupnp_dlna_profile_get_container_restrictions (profile);
+        GList *video_restrictions =
+                     gupnp_dlna_profile_get_video_restrictions (profile);
+
+        return (container_restrictions != NULL && video_restrictions != NULL);
+}
+
+static gboolean
+match_profile (GUPnPDLNAProfile *profile,
+               GUPnPDLNAInfoSet *stream_info_set,
+               GList            *profile_restrictions)
+{
+        const gchar *name = gupnp_dlna_profile_get_name (profile);
+        GList *iter;
+        gchar *stream_dump;
+        gchar *restrictions_dump;
+
+        /* Profiles with an empty name are used only for inheritance
+         * and should not be matched against. */
+        if (name == NULL || name[0] == '\0') {
+                /* TODO: if this warning never happens, then remove
+                 * profile parameter from this function.
+                 */
+                g_warning ("Profiles weren't cleaned up properly?");
+                return FALSE;
+        }
+
+        stream_dump = gupnp_dlna_info_set_to_string (stream_info_set);
+        restrictions_dump = gupnp_dlna_utils_restrictions_list_to_string
+                                        (profile_restrictions);
+        g_debug ("Stream: %s\nRestrictions: %s",
+                 stream_dump,
+                 restrictions_dump);
+        g_free (stream_dump);
+        g_free (restrictions_dump);
+
+        for (iter = profile_restrictions; iter != NULL; iter = iter->next) {
+                GUPnPDLNARestriction *restriction =
+                                        GUPNP_DLNA_RESTRICTION (iter->data);
+
+                if (restriction != NULL &&
+                    gupnp_dlna_info_set_fits_restriction (stream_info_set,
+                                                          restriction))
+                        return TRUE;
+        }
+
+        return FALSE;
+}
+
+static void
+add_bool (GUPnPDLNAInfoSet   *info_set,
+          const gchar        *name,
+          GUPnPDLNABoolValue  value,
+          const gchar        *type)
+{
+        switch (value.state) {
+        case GUPNP_DLNA_VALUE_STATE_SET:
+                if (!gupnp_dlna_info_set_add_bool (info_set, name, value.value))
+                        g_warning ("Failed to add '%s' bool value (%s) to %s "
+                                   "info set.",
+                                   name,
+                                   (value.value ? "true" : "false"),
+                                   type);
+
+                break;
+        case GUPNP_DLNA_VALUE_STATE_UNSET:
+                break;
+        case GUPNP_DLNA_VALUE_STATE_UNSUPPORTED:
+                if (!gupnp_dlna_info_set_add_unsupported_bool (info_set, name))
+                        g_warning ("Failed to add '%s' bool unsupported value"
+                                   " to %s info set.",
+                                   name,
+                                   type);
+
+                break;
+        default:
+                g_critical ("Wrong value state value (%d).", value.state);
+        }
+}
+
+static void
+add_fraction (GUPnPDLNAInfoSet       *info_set,
+              const gchar            *name,
+              GUPnPDLNAFractionValue  value,
+              const gchar            *type)
+{
+        switch (value.state) {
+        case GUPNP_DLNA_VALUE_STATE_SET:
+                if (!gupnp_dlna_info_set_add_fraction (info_set,
+                                                       name,
+                                                       value.numerator,
+                                                       value.denominator))
+                        g_warning ("Failed to add '%s' fraction value (%d/%d)"
+                                   " to %s info set.",
+                                   name,
+                                   value.numerator,
+                                   value.denominator,
+                                   type);
+
+                break;
+        case GUPNP_DLNA_VALUE_STATE_UNSET:
+                break;
+        case GUPNP_DLNA_VALUE_STATE_UNSUPPORTED:
+                if (!gupnp_dlna_info_set_add_unsupported_fraction (info_set,
+                                                                   name))
+                        g_warning ("Failed to add '%s' fraction unsupported"
+                                   " value to %s info set.",
+                                   name,
+                                   type);
+
+                break;
+        default:
+                g_critical ("Wrong value state value (%d).", value.state);
+        }
+}
+
+static void
+add_int (GUPnPDLNAInfoSet   *info_set,
+          const gchar       *name,
+          GUPnPDLNAIntValue  value,
+          const gchar       *type)
+{
+        switch (value.state) {
+        case GUPNP_DLNA_VALUE_STATE_SET:
+                if (!gupnp_dlna_info_set_add_int (info_set, name, value.value))
+                        g_warning ("Failed to add '%s' int value (%d) to %s "
+                                   "info set.",
+                                   name,
+                                   value.value,
+                                   type);
+
+                break;
+        case GUPNP_DLNA_VALUE_STATE_UNSET:
+                break;
+        case GUPNP_DLNA_VALUE_STATE_UNSUPPORTED:
+                if (!gupnp_dlna_info_set_add_unsupported_int (info_set, name))
+                        g_warning ("Failed to add '%s' int unsupported value"
+                                   " to %s info set.",
+                                   name,
+                                   type);
+
+                break;
+        default:
+                g_critical ("Wrong value state value (%d).", value.state);
+        }
+}
+
+static void
+add_string (GUPnPDLNAInfoSet     *info_set,
+            const gchar          *name,
+            GUPnPDLNAStringValue  value,
+            const gchar          *type)
+{
+        switch (value.state) {
+        case GUPNP_DLNA_VALUE_STATE_SET:
+                if (!gupnp_dlna_info_set_add_string (info_set,
+                                                     name,
+                                                     value.value))
+                        g_warning ("Failed to add '%s' int value (%s) to %s "
+                                   "info set.",
+                                   name,
+                                   value.value,
+                                   type);
+                g_free (value.value);
+
+                break;
+        case GUPNP_DLNA_VALUE_STATE_UNSET:
+                break;
+        case GUPNP_DLNA_VALUE_STATE_UNSUPPORTED:
+                if (!gupnp_dlna_info_set_add_unsupported_string (info_set,
+                                                                 name))
+                        g_warning ("Failed to add '%s' string unsupported value"
+                                   " to %s info set.",
+                                   name,
+                                   type);
+
+                break;
+        default:
+                g_critical ("Wrong value state value (%d).", value.state);
+        }
+}
+
+static GUPnPDLNAInfoSet *
+create_info_set (GUPnPDLNAStringValue  value,
+                 const gchar          *type)
+{
+        gchar *mime;
+        gchar *lctype;
+        GUPnPDLNAInfoSet *info_set;
+
+        if (value.state == GUPNP_DLNA_VALUE_STATE_SET) {
+                mime = value.value;
+                lctype = g_ascii_strdown (type, -1);
+        } else {
+                g_warning ("%s information holds no mime type, expect it"
+                           "to match to no DLNA profile.",
+                           type);
+                mime = g_ascii_strdown (type, -1);
+                lctype = g_strdup (mime);
+        }
+
+        info_set = gupnp_dlna_info_set_new (mime);
+        if (info_set == NULL)
+                g_warning ("Failed to create %s info set with mime '%s'.",
+                           lctype,
+                           mime);
+        g_free (mime);
+        g_free (lctype);
+
+        return info_set;
+}
+
+static GUPnPDLNAInfoSet *
+info_set_from_container_information (GUPnPDLNAContainerInformation *info)
+{
+        static const gchar *const type = "container";
+        GUPnPDLNAInfoSet *info_set = create_info_set
+                              (gupnp_dlna_container_information_get_mime (info),
+                               "Container");
+
+        if (info_set == NULL)
+                return NULL;
+
+        add_int (info_set,
+                 "mpegversion",
+                 gupnp_dlna_container_information_get_mpeg_version (info),
+                 type);
+
+        add_int (info_set,
+                 "packetsize",
+                 gupnp_dlna_container_information_get_packet_size (info),
+                 type);
+
+        add_string (info_set,
+                    "profile",
+                    gupnp_dlna_container_information_get_profile (info),
+                    type);
+
+        add_bool (info_set,
+                  "systemstream",
+                  gupnp_dlna_container_information_is_system_stream (info),
+                  type);
+
+        add_string (info_set,
+                    "variant",
+                    gupnp_dlna_container_information_get_variant (info),
+                    type);
+
+        return info_set;
+}
+
+static gboolean
+check_container_profile (GUPnPDLNAInformation *info,
+                         GUPnPDLNAProfile     *profile)
+{
+        GUPnPDLNAContainerInformation *container_info =
+                        gupnp_dlna_information_get_container_information (info);
+        gboolean matched = FALSE;
+        GList *profile_restrictions =
+                 gupnp_dlna_profile_get_container_restrictions (profile);
+
+        if (profile_restrictions != NULL && container_info != NULL) {
+                GUPnPDLNAInfoSet *stream_info_set =
+                           info_set_from_container_information (container_info);
+
+                if (match_profile (profile,
+                                   stream_info_set,
+                                   profile_restrictions))
+                        matched = TRUE;
+                else
+                        g_debug ("Container did not match.");
+                gupnp_dlna_info_set_free (stream_info_set);
+        } else if (profile_restrictions == NULL && container_info == NULL)
+                matched = TRUE;
+
+        return matched;
+}
+
+static GUPnPDLNAInfoSet *
+info_set_from_audio_information (GUPnPDLNAAudioInformation *info)
+{
+        static const gchar *const type = "audio";
+        GUPnPDLNAInfoSet *info_set = create_info_set
+                                  (gupnp_dlna_audio_information_get_mime (info),
+                                   "Audio");
+
+        if (info_set == NULL)
+                return NULL;
+
+        add_int (info_set,
+                 "bitrate",
+                 gupnp_dlna_audio_information_get_bitrate (info),
+                 type);
+
+        add_int (info_set,
+                 "channels",
+                 gupnp_dlna_audio_information_get_channels (info),
+                 type);
+
+        add_int (info_set,
+                 "depth",
+                 gupnp_dlna_audio_information_get_depth (info),
+                 type);
+
+        add_int (info_set,
+                 "layer",
+                 gupnp_dlna_audio_information_get_layer (info),
+                 type);
+
+        add_string (info_set,
+                    "level",
+                    gupnp_dlna_audio_information_get_level (info),
+                    type);
+
+        add_int (info_set,
+                 "mpegaudioversion",
+                 gupnp_dlna_audio_information_get_mpeg_audio_version (info),
+                 type);
+
+        add_int (info_set,
+                 "mpegversion",
+                 gupnp_dlna_audio_information_get_mpeg_version (info),
+                 type);
+
+        add_string (info_set,
+                    "profile",
+                    gupnp_dlna_audio_information_get_profile (info),
+                    type);
+
+        add_int (info_set,
+                 "rate",
+                 gupnp_dlna_audio_information_get_rate (info),
+                 type);
+
+        add_string (info_set,
+                    "stream-format",
+                    gupnp_dlna_audio_information_get_stream_format (info),
+                    type);
+
+        add_int (info_set,
+                 "wmaversion",
+                 gupnp_dlna_audio_information_get_wma_version (info),
+                 type);
+
+        return info_set;
+}
+
+static gboolean
+check_audio_profile (GUPnPDLNAInformation *info,
+                     GUPnPDLNAProfile     *profile)
+{
+        GUPnPDLNAInfoSet *info_set;
+        gboolean matched;
+        GUPnPDLNAAudioInformation *audio_info;
+        GList *restrictions;
+
+        if (is_video_profile (profile))
+                return FALSE;
+
+        matched = FALSE;
+        audio_info = gupnp_dlna_information_get_audio_information (info);
+        info_set = info_set_from_audio_information (audio_info);
+        restrictions = gupnp_dlna_profile_get_audio_restrictions (profile);
+        if (match_profile (profile, info_set, restrictions))
+                matched = TRUE;
+        else
+                g_debug ("Audio did not match.");
+        gupnp_dlna_info_set_free (info_set);
+
+        return matched;
+}
+
+static GUPnPDLNAInfoSet *
+info_set_from_video_information (GUPnPDLNAVideoInformation *info)
+{
+        static const gchar *const type = "video";
+        GUPnPDLNAInfoSet *info_set = create_info_set
+                                  (gupnp_dlna_video_information_get_mime (info),
+                                   "Video");
+
+        if (info_set == NULL)
+                return NULL;
+
+        add_int (info_set,
+                 "bitrate",
+                 gupnp_dlna_video_information_get_bitrate (info),
+                 type);
+
+        add_fraction (info_set,
+                      "framerate",
+                      gupnp_dlna_video_information_get_framerate (info),
+                      type);
+
+        add_int (info_set,
+                 "height",
+                 gupnp_dlna_video_information_get_height (info),
+                 type);
+
+        add_bool (info_set,
+                  "interlaced",
+                  gupnp_dlna_video_information_is_interlaced (info),
+                  type);
+
+        add_string (info_set,
+                    "level",
+                    gupnp_dlna_video_information_get_level (info),
+                    type);
+
+        add_int (info_set,
+                 "mpegversion",
+                 gupnp_dlna_video_information_get_mpeg_version (info),
+                 type);
+
+        add_fraction
+                    (info_set,
+                     "pixel-aspect-ratio",
+                     gupnp_dlna_video_information_get_pixel_aspect_ratio (info),
+                     type);
+
+        add_string (info_set,
+                    "profile",
+                    gupnp_dlna_video_information_get_profile (info),
+                    type);
+
+        add_bool (info_set,
+                  "systemstream",
+                  gupnp_dlna_video_information_is_system_stream (info),
+                  type);
+
+        add_int (info_set,
+                 "width",
+                 gupnp_dlna_video_information_get_width (info),
+                 type);
+
+        return info_set;
+}
+
+static gboolean
+check_video_profile (GUPnPDLNAInformation *info,
+                     GUPnPDLNAProfile     *profile)
+{
+        GUPnPDLNAVideoInformation *video_info =
+                            gupnp_dlna_information_get_video_information (info);
+        GUPnPDLNAAudioInformation *audio_info =
+                            gupnp_dlna_information_get_audio_information (info);
+        GUPnPDLNAInfoSet *info_set = NULL;
+        GList *restrictions;
+        gboolean result = FALSE;
+
+        if (video_info == NULL || audio_info == NULL)
+                goto out;
+
+        restrictions = gupnp_dlna_profile_get_video_restrictions (profile);
+        info_set = info_set_from_video_information (video_info);
+        if (!match_profile (profile, info_set, restrictions)) {
+                g_debug ("Video did not match");
+
+                goto out;
+        }
+        gupnp_dlna_info_set_free (info_set);
+
+        restrictions = gupnp_dlna_profile_get_audio_restrictions (profile);
+        info_set = info_set_from_audio_information (audio_info);
+        if (!match_profile (profile, info_set, restrictions)) {
+                g_debug ("Audio did not match");
+
+                goto out;
+        }
+
+        if (check_container_profile (info, profile))
+                result = TRUE;
+ out:
+        gupnp_dlna_info_set_free (info_set);
+
+        return result;
+}
+
+static GUPnPDLNAInfoSet *
+info_set_from_image_information (GUPnPDLNAImageInformation *info)
+{
+        static const gchar *const type = "image";
+        GUPnPDLNAInfoSet *info_set = create_info_set
+                                  (gupnp_dlna_image_information_get_mime (info),
+                                   "Image");
+
+        if (info_set == NULL)
+                return NULL;
+
+        add_int (info_set,
+                 "depth",
+                 gupnp_dlna_image_information_get_depth (info),
+                 type);
+
+        add_int (info_set,
+                 "height",
+                 gupnp_dlna_image_information_get_height (info),
+                 type);
+
+        add_int (info_set,
+                 "width",
+                 gupnp_dlna_image_information_get_width (info),
+                 type);
+
+        return info_set;
+}
+
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_impl_guess_image_profile
+                                        (GUPnPDLNAInformation *info,
+                                         GList                *profiles)
+{
+        GList *iter;
+        GUPnPDLNAImageInformation *image_info =
+                            gupnp_dlna_information_get_image_information (info);
+        GUPnPDLNAInfoSet *info_set;
+        GUPnPDLNAProfile *found_profile;
+
+        if (!image_info)
+                return NULL;
+
+        info_set = info_set_from_image_information (image_info);
+        found_profile = NULL;
+
+        for (iter = profiles; iter; iter = iter->next) {
+                GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (iter->data);
+                GList *restrictions =
+                            gupnp_dlna_profile_get_image_restrictions (profile);
+
+                g_debug ("Matching image against profile: %s",
+                         gupnp_dlna_profile_get_name (profile));
+
+                if (match_profile (profile, info_set, restrictions)) {
+                        found_profile = profile;
+
+                        break;
+                } else
+                        g_debug ("Image did not match");
+        }
+
+        gupnp_dlna_info_set_free (info_set);
+
+        return found_profile;
+}
+
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_impl_guess_video_profile
+                                        (GUPnPDLNAInformation *info,
+                                         GList                *profiles)
+{
+        GUPnPDLNAProfile *found_profile = NULL;
+        GList *iter;
+
+        for (iter = profiles; iter; iter = iter->next) {
+                GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (iter->data);
+
+                g_debug ("Matching video against profile: %s",
+                         gupnp_dlna_profile_get_name (profile));
+
+                if (check_video_profile (info, profile)) {
+                        found_profile = profile;
+
+                        break;
+                }
+        }
+
+        return found_profile;
+}
+
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_impl_guess_audio_profile
+                                        (GUPnPDLNAInformation *info,
+                                         GList                *profiles)
+{
+        GList *iter;
+        GUPnPDLNAProfile *found_profile = NULL;
+
+        for (iter = profiles; iter != NULL; iter = iter->next) {
+                GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (iter->data);
+
+                g_debug ("Matching audio against profile: %s",
+                         gupnp_dlna_profile_get_name (profile));
+
+                if (check_audio_profile (info, profile) &&
+                    check_container_profile (info, profile)) {
+                        found_profile = profile;
+
+                        break;
+                }
+        }
+
+        return found_profile;
+}
diff --git a/libgupnp-dlna/gupnp-dlna-profile-guesser-impl.h b/libgupnp-dlna/gupnp-dlna-profile-guesser-impl.h
new file mode 100644 (file)
index 0000000..7431be7
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_PROFILE_GUESSER_IMPL_H__
+#define __GUPNP_DLNA_PROFILE_GUESSER_IMPL_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "gupnp-dlna-profile.h"
+#include "gupnp-dlna-information.h"
+
+G_BEGIN_DECLS
+
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_impl_guess_image_profile
+                                        (GUPnPDLNAInformation *info,
+                                         GList                *profiles);
+
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_impl_guess_video_profile
+                                        (GUPnPDLNAInformation *info,
+                                         GList                *profiles);
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_impl_guess_audio_profile
+                                        (GUPnPDLNAInformation *info,
+                                         GList                *profiles);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_PROFILE_GUESSER_IMPL_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-profile-guesser.c b/libgupnp-dlna/gupnp-dlna-profile-guesser.c
new file mode 100644 (file)
index 0000000..b7738d5
--- /dev/null
@@ -0,0 +1,532 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-profile-guesser.h"
+#include "gupnp-dlna-profile-guesser-impl.h"
+#include "gupnp-dlna-profile-loader.h"
+#include "gupnp-dlna-metadata-extractor.h"
+#include "gupnp-dlna-metadata-backend.h"
+
+/**
+ * SECTION:gupnp-dlna-profile-guesser
+ * @short_description: Utility API for discovering DLNA profile for
+ * given media.
+ *
+ * The API provides synchronous and asynchronous guessing of DLNA
+ * profile. The asynchronous mode requires a running #GMainLoop in the
+ * default #GMainContext.
+ */
+enum {
+        DONE,
+        SIGNAL_LAST
+};
+
+static guint signals[SIGNAL_LAST];
+
+G_DEFINE_TYPE (GUPnPDLNAProfileGuesser,
+               gupnp_dlna_profile_guesser,
+               G_TYPE_OBJECT)
+
+struct _GUPnPDLNAProfileGuesserPrivate {
+        gboolean relaxed_mode;
+        gboolean extended_mode;
+};
+
+enum {
+        PROP_0,
+        PROP_DLNA_RELAXED_MODE,
+        PROP_DLNA_EXTENDED_MODE,
+};
+
+static GList *profiles_list[2][2];
+
+static void
+gupnp_dlna_profile_guesser_set_property (GObject      *object,
+                                         guint         property_id,
+                                         const GValue *value,
+                                         GParamSpec   *pspec)
+{
+        GUPnPDLNAProfileGuesser *self = GUPNP_DLNA_PROFILE_GUESSER (object);
+        GUPnPDLNAProfileGuesserPrivate *priv = self->priv;
+
+        switch (property_id) {
+        case PROP_DLNA_RELAXED_MODE:
+                priv->relaxed_mode = g_value_get_boolean (value);
+                break;
+
+        case PROP_DLNA_EXTENDED_MODE:
+                priv->extended_mode = g_value_get_boolean (value);
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
+                                                   property_id,
+                                                   pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_profile_guesser_get_property (GObject    *object,
+                                         guint       property_id,
+                                         GValue     *value,
+                                         GParamSpec *pspec)
+{
+        GUPnPDLNAProfileGuesser *self = GUPNP_DLNA_PROFILE_GUESSER (object);
+        GUPnPDLNAProfileGuesserPrivate *priv = self->priv;
+
+        switch (property_id) {
+        case PROP_DLNA_RELAXED_MODE:
+                g_value_set_boolean (value, priv->relaxed_mode);
+                break;
+
+        case PROP_DLNA_EXTENDED_MODE:
+                g_value_set_boolean (value, priv->extended_mode);
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
+                                                   property_id,
+                                                   pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_profile_guesser_class_init
+                                   (GUPnPDLNAProfileGuesserClass *guesser_class)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (guesser_class);
+        GParamSpec *pspec;
+        guint iter;
+
+        object_class->get_property = gupnp_dlna_profile_guesser_get_property;
+        object_class->set_property = gupnp_dlna_profile_guesser_set_property;
+
+        /**
+         * GUPnPDLNAProfileGuesser:relaxed-mode:
+         *
+         * Whether profile matching should not be strictly compliant
+         * with the DLNA specification.
+         */
+        pspec = g_param_spec_boolean ("relaxed-mode",
+                                      "Relaxed mode property",
+                                      "Indicates that profile matching should"
+                                      "be strictly compliant with the DLNA "
+                                      "specification",
+                                      FALSE,
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY);
+        g_object_class_install_property (object_class,
+                                         PROP_DLNA_RELAXED_MODE,
+                                         pspec);
+
+        /**
+         * GUPnPDLNAProfileGuesser:extended-mode:
+         * @extended: setting true will enable extended profile support
+         *
+         * Whether profile matching should be done also against DLNA
+         * profiles not being a part of DLNA specification.
+         */
+        pspec = g_param_spec_boolean ("extended-mode",
+                                      "Extended mode property",
+                                      "Indicates support for profiles that are "
+                                      "not part of the DLNA specification",
+                                      FALSE,
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY);
+        g_object_class_install_property (object_class,
+                                         PROP_DLNA_EXTENDED_MODE,
+                                         pspec);
+
+        /**
+         * GUPnPDLNAProfileGuesser::done:
+         * @profile_guesser: The #GUPnPDLNAProfileGuesser.
+         * @info: (transfer none): URI metadata as #GUPnPDLNAInformation.
+         * @dlna: (allow-none) (transfer none): The results as #GUPnPDLNAProfile.
+         * @error: (allow-none): Contains details of the error if discovery failed,
+         * else is %NULL.
+         *
+         * Will be emitted when guessing DLNA profile for a URI has finished.
+         */
+        signals[DONE] =
+                g_signal_new ("done",
+                              G_TYPE_FROM_CLASS (guesser_class),
+                              G_SIGNAL_RUN_LAST,
+                              0,
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_generic,
+                              G_TYPE_NONE,
+                              3,
+                              GUPNP_TYPE_DLNA_INFORMATION,
+                              GUPNP_TYPE_DLNA_PROFILE,
+                              G_TYPE_ERROR);
+
+        /* Load DLNA profiles from disk */
+        for (iter = 0; iter < 4; ++iter) {
+                gboolean relaxed = (iter > 1); /* F,F,T,T */
+                gboolean extended = ((iter) % 2 != 0); /* F,T,F,T */
+                guint rel_index = (relaxed ? 1 : 0);
+                guint ext_index = (extended ? 1 : 0);
+                GUPnPDLNAProfileLoader *loader = gupnp_dlna_profile_loader_new
+                                        (relaxed,
+                                         extended);
+
+                profiles_list[rel_index][ext_index] =
+                               gupnp_dlna_profile_loader_get_from_disk (loader);
+                g_object_unref (loader);
+        }
+
+        g_type_class_add_private (guesser_class,
+                                  sizeof (GUPnPDLNAProfileGuesserPrivate));
+}
+
+static void
+gupnp_dlna_profile_guesser_init (GUPnPDLNAProfileGuesser *self)
+{
+        GUPnPDLNAProfileGuesserPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_PROFILE_GUESSER,
+                                         GUPnPDLNAProfileGuesserPrivate);
+
+        priv->relaxed_mode = FALSE;
+        priv->extended_mode = FALSE;
+        self->priv = priv;
+}
+
+/**
+ * gupnp_dlna_profile_guesser_new:
+ * @relaxed_mode: %TRUE to enable relaxed mode support. %FALSE otherwise.
+ * @extended_mode: %TRUE to enable extended mode support. %FALSE otherwise.
+ *
+ * Creates a new guesser that will use specific DLNA profiles for
+ * matching - i.e. which profiles will be used depends on
+ * @relaxed_mode and @extended_mode.
+ *
+ * Returns: A new #GUPnPDLNAProfileGuesser object.
+ */
+GUPnPDLNAProfileGuesser *
+gupnp_dlna_profile_guesser_new (gboolean relaxed_mode,
+                                gboolean extended_mode)
+{
+        return GUPNP_DLNA_PROFILE_GUESSER (g_object_new
+                                           (GUPNP_TYPE_DLNA_PROFILE_GUESSER,
+                                            "relaxed-mode", relaxed_mode,
+                                            "extended-mode", extended_mode,
+                                            NULL));
+}
+
+static gboolean
+unref_extractor_in_idle (GUPnPDLNAMetadataExtractor *extractor)
+{
+        if (extractor)
+                g_object_unref (extractor);
+
+        return FALSE;
+}
+
+static void
+gupnp_dlna_discovered_cb (GUPnPDLNAProfileGuesser *guesser,
+                          GUPnPDLNAInformation    *info,
+                          GError                  *error,
+                          gpointer                 user_data)
+{
+        GUPnPDLNAProfile *profile = NULL;
+        GUPnPDLNAMetadataExtractor *extractor =
+                                      GUPNP_DLNA_METADATA_EXTRACTOR (user_data);
+
+        if (!error) {
+                profile = gupnp_dlna_profile_guesser_guess_profile_from_info
+                                        (guesser,
+                                         info);
+        }
+        g_signal_emit (guesser, signals[DONE], 0, info, profile, error);
+
+        g_idle_add ((GSourceFunc) unref_extractor_in_idle, extractor);
+}
+
+/**
+ * gupnp_dlna_profile_guesser_guess_profile_async:
+ * @guesser: #GUPnPDLNAProfileGuesser object to use for guessing.
+ * @uri: URI of media.
+ * @timeout_in_ms: Timeout of guessing in miliseconds.
+ * @error: #GError object or %NULL.
+ *
+ * Asynchronously guesses DLNA profile for given @uri. When guessing
+ * is done, ::done signal is emitted on @guesser.
+ *
+ * Returns: %TRUE if @uri was successfully queued, %FALSE otherwise.
+ */
+gboolean
+gupnp_dlna_profile_guesser_guess_profile_async
+                                       (GUPnPDLNAProfileGuesser  *guesser,
+                                        const gchar              *uri,
+                                        guint                     timeout_in_ms,
+                                        GError                  **error)
+{
+        GUPnPDLNAMetadataExtractor *extractor;
+        gboolean queued;
+        GError *extractor_error;
+        guint id;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE_GUESSER (guesser), FALSE);
+        g_return_val_if_fail (uri != NULL, FALSE);
+        g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+        extractor = gupnp_dlna_metadata_backend_get_extractor ();
+        extractor_error = NULL;
+        id = g_signal_connect_swapped (extractor,
+                                       "done",
+                                       G_CALLBACK (gupnp_dlna_discovered_cb),
+                                       guesser);
+        queued = gupnp_dlna_metadata_extractor_extract_async (extractor,
+                                                              uri,
+                                                              timeout_in_ms,
+                                                              &extractor_error);
+        if (extractor_error) {
+                g_propagate_error (error, extractor_error);
+                g_signal_handler_disconnect (extractor, id);
+                g_object_unref (extractor);
+        }
+
+        return queued;
+}
+
+/* Synchronous API */
+
+/**
+ * gupnp_dlna_profile_guesser_guess_profile_sync:
+ * @guesser: #GUPnPDLNAProfileGuesser object to use for guessing.
+ * @uri: URI of media.
+ * @timeout_in_ms: Timeout of guessing in miliseconds.
+ * @dlna_info: (allow-none) (transfer full) (out): A place where to
+ * store DLNA information or %NULL.
+ * @error: (allow-none): #GError object or %NULL.
+ *
+ * Synchronously guesses DLNA profile for given @uri.
+ *
+ * Returns: (transfer none): DLNA profile if any had matched, %NULL otherwise.
+ */
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_guess_profile_sync
+                                       (GUPnPDLNAProfileGuesser  *guesser,
+                                        const gchar              *uri,
+                                        guint                     timeout_in_ms,
+                                        GUPnPDLNAInformation    **dlna_info,
+                                        GError                  **error)
+{
+        GError *extraction_error;
+        GUPnPDLNAMetadataExtractor *extractor;
+        GUPnPDLNAInformation *info;
+        GUPnPDLNAProfile *profile;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE_GUESSER (guesser), NULL);
+        g_return_val_if_fail (uri != NULL, NULL);
+        g_return_val_if_fail (dlna_info == NULL || *dlna_info == NULL, NULL);
+        g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+        extraction_error = NULL;
+        extractor = gupnp_dlna_metadata_backend_get_extractor ();
+        info = gupnp_dlna_metadata_extractor_extract_sync (extractor,
+                                                           uri,
+                                                           timeout_in_ms,
+                                                           &extraction_error);
+        profile = NULL;
+
+        if (extraction_error)
+                g_propagate_error (error,
+                                   extraction_error);
+        else
+                profile = gupnp_dlna_profile_guesser_guess_profile_from_info
+                                        (guesser,
+                                         info);
+
+        if (info) {
+                if (dlna_info)
+                        *dlna_info = info;
+                else
+                        g_object_unref (info);
+        }
+        if (extractor)
+                g_object_unref (extractor);
+
+        return profile;
+}
+
+/**
+ * gupnp_dlna_profile_guesser_guess_profile_from_info:
+ * @guesser: The #GUPnPDLNAProfileGuesser object.
+ * @info: The #GUPnPDLNAInformation object.
+ *
+ * Guesses the profile which fits to passed @info.
+ *
+ * Returns: (transfer none): A #GUPnPDLNAProfile object on success,
+ * %NULL otherwise.
+ */
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_guess_profile_from_info
+                                        (GUPnPDLNAProfileGuesser *guesser,
+                                         GUPnPDLNAInformation    *info)
+{
+        GList *profiles;
+        GUPnPDLNAVideoInformation *video_info;
+        GUPnPDLNAAudioInformation *audio_info;
+        GUPnPDLNAImageInformation *image_info;
+        GUPnPDLNAProfile *profile;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE_GUESSER (guesser), NULL);
+        g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+        profiles = gupnp_dlna_profile_guesser_list_profiles (guesser);
+        video_info = gupnp_dlna_information_get_video_information (info);
+        audio_info = gupnp_dlna_information_get_audio_information (info);
+        image_info = gupnp_dlna_information_get_image_information (info);
+
+        if (image_info)
+                profile = gupnp_dlna_profile_guesser_impl_guess_image_profile
+                                        (info,
+                                         profiles);
+        else if (video_info)
+                profile = gupnp_dlna_profile_guesser_impl_guess_video_profile
+                                        (info,
+                                         profiles);
+        else if (audio_info)
+                profile = gupnp_dlna_profile_guesser_impl_guess_audio_profile
+                                        (info,
+                                         profiles);
+        else
+                profile = NULL;
+
+        return profile;
+}
+
+/**
+ * gupnp_dlna_profile_guesser_get_profile:
+ * @guesser: The #GUPnPDLNAProfileGuesser object.
+ * @name: The name of the DLNA profile to be retrieved.
+ *
+ * Lookups for #GUPnPDLNAProfile with given @name.
+ *
+ * Returns: (transfer none): A #GUPnPDLNAProfile object on success,
+ * %NULL otherwise.
+ */
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_get_profile (GUPnPDLNAProfileGuesser *guesser,
+                                        const gchar             *name)
+{
+        // TODO: use a GHashTable for this.
+        GList *iter;
+        GUPnPDLNAProfileGuesserPrivate *priv;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE_GUESSER (guesser), NULL);
+        g_return_val_if_fail (name != NULL, NULL);
+
+        priv = guesser->priv;
+
+        for (iter = profiles_list[priv->relaxed_mode][priv->extended_mode];
+             iter;
+             iter = iter->next) {
+                GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (iter->data);
+
+                if (!g_strcmp0 (gupnp_dlna_profile_get_name (profile), name)) {
+                        return profile;
+                }
+        }
+
+        return NULL;
+}
+
+/**
+ * gupnp_dlna_profile_guesser_list_profiles:
+ * @guesser: The #GUPnPDLNAProfileGuesser whose profile list is required.
+ *
+ * Gets a list of the all DLNA profiles supported by @guesser.
+ *
+ * Returns: (transfer none) (element-type GUPnPDLNAProfile): A #GList
+ * of #GUPnPDLNAProfile on success, %NULL otherwise.
+ */
+GList *
+gupnp_dlna_profile_guesser_list_profiles (GUPnPDLNAProfileGuesser *guesser)
+{
+        GUPnPDLNAProfileGuesserPrivate *priv;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE_GUESSER (guesser), NULL);
+
+        priv = guesser->priv;
+
+        return profiles_list[priv->relaxed_mode][priv->extended_mode];
+}
+
+/**
+ * gupnp_dlna_profile_guesser_get_relaxed_mode:
+ * @guesser: The #GUPnPDLNAProfileGuesser object.
+ *
+ * Returns: %TRUE if @guesser is in relaxed mode, %FALSE otherwise.
+ */
+gboolean
+gupnp_dlna_profile_guesser_get_relaxed_mode (GUPnPDLNAProfileGuesser *guesser)
+{
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE_GUESSER (guesser), FALSE);
+
+        return guesser->priv->relaxed_mode;
+}
+
+/**
+ * gupnp_dlna_profile_guesser_get_extended_mode:
+ * @guesser: The #GUPnPDLNAProfileGuesser object.
+ *
+ * Returns: %TRUE if @guesser is in extended mode, %FALSE otherwise.
+ */
+gboolean
+gupnp_dlna_profile_guesser_get_extended_mode (GUPnPDLNAProfileGuesser *guesser)
+{
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE_GUESSER (guesser), FALSE);
+
+        return guesser->priv->extended_mode;
+}
+
+/**
+ * gupnp_dlna_profile_guesser_cleanup:
+ *
+ * Cleans up the DLNA profiles. Provided to remove Valgrind noise. Not
+ * thread-safe. Do not call it if there is even a slightest chance
+ * that profile guessing will be performed during process
+ * lifetime. The profiles are not reloaded after cleanup.
+ */
+void
+gupnp_dlna_profile_guesser_cleanup (void)
+{
+        guint iter;
+
+        for (iter = 0; iter < 4; ++iter) {
+                gboolean relaxed = (iter > 1); /* F,F,T,T */
+                gboolean extended = ((iter) % 2 != 0); /* F,T,F,T */
+                guint rel_index = (relaxed ? 1 : 0);
+                guint ext_index = (extended ? 1 : 0);
+
+                g_list_free_full (profiles_list[rel_index][ext_index],
+                                  g_object_unref);
+                profiles_list[rel_index][ext_index] = NULL;
+        }
+}
diff --git a/libgupnp-dlna/gupnp-dlna-profile-guesser.h b/libgupnp-dlna/gupnp-dlna-profile-guesser.h
new file mode 100644 (file)
index 0000000..a9a4907
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_PROFILE_GUESSER_H__
+#define __GUPNP_DLNA_PROFILE_GUESSER_H__
+
+#include <glib-object.h>
+#include <libgupnp-dlna/gupnp-dlna-profile.h>
+#include <libgupnp-dlna/gupnp-dlna-information.h>
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_PROFILE_GUESSER (gupnp_dlna_profile_guesser_get_type())
+
+#define GUPNP_DLNA_PROFILE_GUESSER(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_PROFILE_GUESSER, \
+                                     GUPnPDLNAProfileGuesser))
+
+#define GUPNP_DLNA_PROFILE_GUESSER_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_PROFILE_GUESSER, \
+                                  GUPnPDLNAProfileGuesserClass))
+
+#define GUPNP_IS_DLNA_PROFILE_GUESSER(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_PROFILE_GUESSER))
+
+#define GUPNP_IS_DLNA_PROFILE_GUESSER_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_PROFILE_GUESSER))
+
+#define GUPNP_DLNA_PROFILE_GUESSER_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_PROFILE_GUESSER, \
+                                    GUPnPDLNAProfileGuesserClass))
+
+typedef struct _GUPnPDLNAProfileGuesserPrivate GUPnPDLNAProfileGuesserPrivate;
+
+/**
+ * GUPnPDLNAProfileGuesser:
+ *
+ * The top-level object used to for DLNA profile guessing.
+ */
+typedef struct {
+        GObject parent;
+
+        GUPnPDLNAProfileGuesserPrivate *priv;
+} GUPnPDLNAProfileGuesser;
+
+/**
+ * GUPnPDLNAProfileGuesserClass:
+ * @parent_class: A #GObjectClass - parent of this class.
+ */
+typedef struct {
+        GObjectClass parent_class;
+} GUPnPDLNAProfileGuesserClass;
+
+GType
+gupnp_dlna_profile_guesser_get_type (void) G_GNUC_CONST;
+
+GUPnPDLNAProfileGuesser *
+gupnp_dlna_profile_guesser_new (gboolean relaxed_mode,
+                                gboolean extended_mode);
+
+/* Asynchronous API */
+gboolean
+gupnp_dlna_profile_guesser_guess_profile_async
+                                       (GUPnPDLNAProfileGuesser  *guesser,
+                                        const gchar              *uri,
+                                        guint                     timeout_in_ms,
+                                        GError                  **error);
+
+/* Synchronous API */
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_guess_profile_sync
+                                       (GUPnPDLNAProfileGuesser  *guesser,
+                                        const gchar              *uri,
+                                        guint                     timeout_in_ms,
+                                        GUPnPDLNAInformation    **dlna_info,
+                                        GError                  **error);
+
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_guess_profile_from_info
+                                        (GUPnPDLNAProfileGuesser *guesser,
+                                         GUPnPDLNAInformation    *info);
+
+/* Get a GUPnPDLNAProfile by name */
+GUPnPDLNAProfile *
+gupnp_dlna_profile_guesser_get_profile (GUPnPDLNAProfileGuesser *guesser,
+                                        const gchar             *name);
+
+/* API to list all available profiles */
+GList *
+gupnp_dlna_profile_guesser_list_profiles (GUPnPDLNAProfileGuesser *guesser);
+
+gboolean
+gupnp_dlna_profile_guesser_get_relaxed_mode (GUPnPDLNAProfileGuesser *guesser);
+
+gboolean
+gupnp_dlna_profile_guesser_get_extended_mode (GUPnPDLNAProfileGuesser *guesser);
+
+void
+gupnp_dlna_profile_guesser_cleanup (void);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_PROFILE_GUESSER_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-profile-loader.c b/libgupnp-dlna/gupnp-dlna-profile-loader.c
new file mode 100644 (file)
index 0000000..18da2df
--- /dev/null
@@ -0,0 +1,1557 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include <glib/gstdio.h>
+#include <libxml/xmlreader.h>
+#include <libxml/relaxng.h>
+#include "gupnp-dlna-profile-loader.h"
+#include "gupnp-dlna-profile-private.h"
+#include "gupnp-dlna-utils.h"
+#include "gupnp-dlna-value-list-private.h"
+#include "gupnp-dlna-value-type.h"
+#include "gupnp-dlna-restriction-private.h"
+
+G_DEFINE_TYPE (GUPnPDLNAProfileLoader, gupnp_dlna_profile_loader, G_TYPE_OBJECT)
+
+#define DLNA_DATA_DIR DATA_DIR G_DIR_SEPARATOR_S "dlna-profiles"
+#define NODE_TYPE_ELEMENT_START 1
+#define NODE_TYPE_TEXT 3
+#define NODE_TYPE_ELEMENT_END 15
+
+enum {
+        PROP_0,
+
+        PROP_RELAXED_MODE,
+        PROP_EXTENDED_MODE
+};
+
+typedef enum {
+        GUPNP_DLNA_PARSED_ELEMENT_RESTRICTIONS,
+        GUPNP_DLNA_PARSED_ELEMENT_RESTRICTION,
+        GUPNP_DLNA_PARSED_ELEMENT_FIELD,
+        GUPNP_DLNA_PARSED_ELEMENT_PARENT,
+        GUPNP_DLNA_PARSED_ELEMENT_DLNA_PROFILE,
+        GUPNP_DLNA_PARSED_ELEMENT_INVALID
+} GUPnPDLNAParsedElement;
+
+typedef enum {
+        GUPNP_DLNA_RESTRICTION_TYPE_AUDIO,
+        GUPNP_DLNA_RESTRICTION_TYPE_CONTAINER,
+        GUPNP_DLNA_RESTRICTION_TYPE_IMAGE,
+        GUPNP_DLNA_RESTRICTION_TYPE_VIDEO,
+        GUPNP_DLNA_RESTRICTION_TYPE_INVALID
+} GUPnPDLNARestrictionType;
+
+typedef struct {
+        GList *audios;
+        GList *containers;
+        GList *images;
+        GList *videos;
+} GUPnPDLNAProfileData;
+
+typedef struct {
+        gchar              *name;
+        GUPnPDLNAValueList *list;
+} GUPnPDLNANameValueListPair;
+
+typedef struct {
+        GList *name_list_pairs;
+        GList *parents;
+} GUPnPDLNARestrictionData;
+
+typedef struct {
+        GUPnPDLNARestriction     *restriction;
+        GUPnPDLNARestrictionType  type;
+} GUPnPDLNADescription;
+
+struct _GUPnPDLNAProfileLoaderPrivate {
+        /* parser part */
+        GHashTable *restrictions;
+        GHashTable *profile_ids;
+        GHashTable *files_hash;
+        gboolean    relaxed_mode;
+        gboolean    extended_mode;
+        /* loader part */
+        GHashTable *descriptions;
+        GList      *tags_stack;
+        GList      *dlna_profile_data_stack;
+        GList      *restriction_data_stack;
+};
+
+static GUPnPDLNANameValueListPair *
+gupnp_dlna_name_value_list_pair_new (const gchar        *name,
+                                     GUPnPDLNAValueList *list)
+{
+        GUPnPDLNANameValueListPair *pair =
+                                       g_slice_new (GUPnPDLNANameValueListPair);
+
+        pair->name = g_strdup (name);
+        pair->list = list;
+
+        return pair;
+}
+
+static void
+gupnp_dlna_name_value_list_pair_free (GUPnPDLNANameValueListPair *pair)
+{
+        if (pair == NULL)
+                return;
+        g_free (pair->name);
+        gupnp_dlna_value_list_free (pair->list);
+        g_slice_free (GUPnPDLNANameValueListPair, pair);
+}
+
+static GUPnPDLNADescription *
+gupnp_dlna_description_new (GUPnPDLNARestriction     *restriction,
+                            GUPnPDLNARestrictionType  type)
+{
+        GUPnPDLNADescription *description = g_slice_new (GUPnPDLNADescription);
+
+        description->restriction = restriction;
+        description->type = type;
+
+        return description;
+}
+
+static void
+gupnp_dlna_description_free (GUPnPDLNADescription *description)
+{
+        if (description == NULL)
+                return;
+
+        gupnp_dlna_restriction_free (description->restriction);
+        g_slice_free (GUPnPDLNADescription, description);
+}
+
+static GUPnPDLNAProfileData*
+gupnp_dlna_profile_data_new (void)
+{
+        GUPnPDLNAProfileData* data = g_slice_new (GUPnPDLNAProfileData);
+
+        data->audios = NULL;
+        data->containers = NULL;
+        data->images = NULL;
+        data->videos = NULL;
+
+        return data;
+}
+
+static void
+gupnp_dlna_profile_data_free (GUPnPDLNAProfileData *data)
+{
+        if (data == NULL)
+                return;
+
+        gupnp_dlna_utils_free_restrictions (data->audios);
+        gupnp_dlna_utils_free_restrictions (data->containers);
+        gupnp_dlna_utils_free_restrictions (data->images);
+        gupnp_dlna_utils_free_restrictions (data->videos);
+        g_slice_free (GUPnPDLNAProfileData, data);
+}
+
+static GUPnPDLNARestrictionData *
+gupnp_dlna_restriction_data_new (void)
+{
+        GUPnPDLNARestrictionData* data = g_slice_new (GUPnPDLNARestrictionData);
+
+        data->name_list_pairs = NULL;
+        data->parents = NULL;
+
+        return data;
+}
+
+static void
+gupnp_dlna_restriction_data_free (GUPnPDLNARestrictionData *data)
+{
+        if (data == NULL)
+                return;
+
+        if (data->name_list_pairs != NULL)
+                g_list_free_full
+                 (data->name_list_pairs,
+                  (GDestroyNotify) gupnp_dlna_name_value_list_pair_free);
+        if (data->parents != NULL)
+                g_list_free_full (data->parents,
+                                  (GDestroyNotify) gupnp_dlna_restriction_free);
+        g_slice_free (GUPnPDLNARestrictionData, data);
+}
+
+static void
+gupnp_dlna_profile_data_stack_free (GList* stack)
+{
+        g_list_free_full (stack,
+                          (GDestroyNotify) gupnp_dlna_profile_data_free);
+}
+
+static void
+gupnp_dlna_restriction_data_stack_free (GList* stack)
+{
+        g_list_free_full (stack,
+                          (GDestroyNotify) gupnp_dlna_restriction_data_free);
+}
+
+static void
+push_tag (GUPnPDLNAProfileLoader *loader,
+          GUPnPDLNAParsedElement  element)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+        gint raw_element = (gint) element;
+
+        priv->tags_stack = g_list_prepend (priv->tags_stack,
+                                           GINT_TO_POINTER (raw_element));
+}
+
+static void
+pop_tag (GUPnPDLNAProfileLoader *loader)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        priv->tags_stack = g_list_delete_link (priv->tags_stack,
+                                               priv->tags_stack);
+}
+
+static GUPnPDLNAParsedElement
+top_tag (GUPnPDLNAProfileLoader *loader)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        if (priv->tags_stack != NULL) {
+                gint top_raw = GPOINTER_TO_INT (priv->tags_stack->data);
+
+                return (GUPnPDLNAParsedElement) top_raw;
+        }
+
+        return GUPNP_DLNA_PARSED_ELEMENT_INVALID;
+}
+
+static void
+pre_field (GUPnPDLNAProfileLoader *loader)
+{
+        push_tag (loader, GUPNP_DLNA_PARSED_ELEMENT_FIELD);
+}
+
+static GUPnPDLNAValueType *
+value_type_from_string (const gchar *type)
+{
+        if (!g_strcmp0 (type, "boolean"))
+                return gupnp_dlna_value_type_bool ();
+        else if (!g_strcmp0 (type, "float")) {
+                g_warning ("'float' data type is not yet supported.");
+
+                return NULL;
+        } else if (!g_strcmp0 (type, "fourcc")) {
+                g_warning ("'fourcc' data type is not yet supported.");
+
+                return NULL;
+        } else if (!g_strcmp0 (type, "fraction"))
+                return gupnp_dlna_value_type_fraction ();
+        else if (!g_strcmp0 (type, "int"))
+                return gupnp_dlna_value_type_int ();
+        else if (!g_strcmp0 (type, "string"))
+                return gupnp_dlna_value_type_string ();
+        g_critical ("Unknown value type: %s", type);
+
+        return NULL;
+}
+
+static void
+append_value_to_list (GUPnPDLNAFieldValue *value,
+                      GUPnPDLNAValueList  *list)
+{
+        if (value == NULL)
+                return;
+
+        switch (value->type) {
+        case GUPNP_DLNA_FIELD_VALUE_TYPE_RANGE:
+                if (!gupnp_dlna_value_list_add_range (list,
+                                                      value->value.range.min,
+                                                      value->value.range.max))
+                        g_warning ("Failed to add range value (%s, %s).",
+                                   value->value.range.min,
+                                   value->value.range.max);
+                break;
+        case GUPNP_DLNA_FIELD_VALUE_TYPE_SINGLE:
+                if (!gupnp_dlna_value_list_add_single (list,
+                                                       value->value.single))
+                        g_warning ("Failed to add single value (%s).",
+                                   value->value.single);
+
+                break;
+        default:
+                g_critical ("Unknown field value type: %d", (gint) value->type);
+        }
+}
+
+static void
+post_field (GUPnPDLNAProfileLoader *loader,
+            const gchar            *name,
+            const gchar            *type,
+            GList                  *values)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv;
+        GUPnPDLNARestrictionData *restriction_data;
+        GUPnPDLNANameValueListPair *pair;
+        GUPnPDLNAValueList *value_list;
+        GUPnPDLNAValueType* value_type;
+        GList *iter;
+
+        pop_tag (loader);
+
+        if (name == NULL || type == NULL)
+                return;
+
+        value_type = value_type_from_string (type);
+
+        if (value_type == NULL)
+                return;
+
+        priv = loader->priv;
+        restriction_data =
+                (GUPnPDLNARestrictionData *) priv->restriction_data_stack->data;
+        value_list = gupnp_dlna_value_list_new (value_type);
+
+        for (iter = values; iter != NULL; iter = iter->next) {
+                GUPnPDLNAFieldValue *field_value =
+                                        (GUPnPDLNAFieldValue *) iter->data;
+
+                append_value_to_list (field_value, value_list);
+        }
+
+        pair = gupnp_dlna_name_value_list_pair_new (name, value_list);
+        restriction_data->name_list_pairs = g_list_prepend
+                                        (restriction_data->name_list_pairs,
+                                         pair);
+}
+
+static void
+merge_restrictions (GUPnPDLNAProfileLoader *loader,
+                    GUPnPDLNADescription   *description)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+        GUPnPDLNAProfileData* data =
+                   (GUPnPDLNAProfileData *) priv->dlna_profile_data_stack->data;
+        GList **target_list;
+        GUPnPDLNARestriction *copy;
+
+        if (description == NULL || description->restriction == NULL)
+                return;
+
+        switch (description->type) {
+        case GUPNP_DLNA_RESTRICTION_TYPE_AUDIO:
+                target_list = &data->audios;
+
+                break;
+        case GUPNP_DLNA_RESTRICTION_TYPE_CONTAINER:
+                target_list = &data->containers;
+
+                break;
+        case GUPNP_DLNA_RESTRICTION_TYPE_IMAGE:
+                target_list = &data->images;
+
+                break;
+        case GUPNP_DLNA_RESTRICTION_TYPE_VIDEO:
+                target_list = &data->videos;
+
+                break;
+        default:
+                g_assert_not_reached ();
+        }
+
+        copy = gupnp_dlna_restriction_copy (description->restriction);
+        *target_list = g_list_prepend (*target_list, copy);
+}
+
+static void
+merge_restrictions_if_in_dlna_profile (GUPnPDLNAProfileLoader *loader,
+                                       GUPnPDLNADescription   *description)
+{
+        GUPnPDLNAParsedElement element = top_tag (loader);
+
+        if (element == GUPNP_DLNA_PARSED_ELEMENT_DLNA_PROFILE)
+                merge_restrictions (loader, description);
+}
+
+static void
+collect_parents (GUPnPDLNAProfileLoader *loader,
+                 GUPnPDLNADescription   *description)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+        GUPnPDLNARestrictionData *data =
+                (GUPnPDLNARestrictionData *) priv->restriction_data_stack->data;
+
+        if (description != NULL && description->restriction != NULL) {
+                /* Collect parents in a list - we'll
+                 * coalesce them later */
+                GUPnPDLNARestriction *copy =
+                         gupnp_dlna_restriction_copy (description->restriction);
+
+                data->parents = g_list_prepend (data->parents, copy);
+        }
+}
+
+static void
+collect_parents_if_in_restriction (GUPnPDLNAProfileLoader *loader,
+                                   GUPnPDLNADescription   *description)
+{
+        GUPnPDLNAParsedElement element = top_tag (loader);
+
+        if (element == GUPNP_DLNA_PARSED_ELEMENT_RESTRICTION)
+                collect_parents (loader, description);
+}
+
+static void
+pre_parent (GUPnPDLNAProfileLoader *loader)
+{
+        push_tag (loader, GUPNP_DLNA_PARSED_ELEMENT_PARENT);
+}
+
+static void
+post_parent (GUPnPDLNAProfileLoader *loader,
+             const gchar            *parent)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        pop_tag (loader);
+
+        if (parent != NULL) {
+                GUPnPDLNADescription *description = g_hash_table_lookup
+                                        (priv->descriptions,
+                                         parent);
+
+                merge_restrictions_if_in_dlna_profile (loader, description);
+                collect_parents_if_in_restriction (loader, description);
+        }
+}
+
+static void
+pre_restriction (GUPnPDLNAProfileLoader *loader)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+        GUPnPDLNARestrictionData *data = gupnp_dlna_restriction_data_new ();
+
+        push_tag (loader, GUPNP_DLNA_PARSED_ELEMENT_RESTRICTION);
+
+        priv->restriction_data_stack = g_list_prepend
+                                        (priv->restriction_data_stack,
+                                         data);
+}
+
+static GUPnPDLNARestrictionType
+restriction_type_from_string (const gchar *type)
+{
+        if (!g_strcmp0 (type, "audio"))
+                return GUPNP_DLNA_RESTRICTION_TYPE_AUDIO;
+        else if (!g_strcmp0 (type, "container"))
+                return GUPNP_DLNA_RESTRICTION_TYPE_CONTAINER;
+        else if (!g_strcmp0 (type, "image"))
+                return GUPNP_DLNA_RESTRICTION_TYPE_IMAGE;
+        else if (!g_strcmp0 (type, "video"))
+                return GUPNP_DLNA_RESTRICTION_TYPE_VIDEO;
+
+        return GUPNP_DLNA_RESTRICTION_TYPE_INVALID;
+}
+
+static void
+post_restriction (GUPnPDLNAProfileLoader *loader,
+                  const gchar            *restriction_type,
+                  const gchar            *id,
+                  const gchar            *name)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+        GUPnPDLNARestrictionData *data =
+                (GUPnPDLNARestrictionData *) priv->restriction_data_stack->data;
+        GUPnPDLNARestriction *restriction;
+        GUPnPDLNADescription *description;
+        GUPnPDLNARestrictionType type;
+        GList *iter;
+
+        pop_tag (loader);
+
+        /* If this is NULL then it means that 'used' attribute was
+           different from relaxed_mode setting. In this case we just
+           ignore it.
+         */
+        if (restriction_type == NULL)
+                goto out;
+
+        restriction = gupnp_dlna_restriction_new (name);
+
+        for (iter = data->name_list_pairs; iter != NULL; iter = iter->next) {
+                GUPnPDLNANameValueListPair *pair =
+                                      (GUPnPDLNANameValueListPair *) iter->data;
+
+                if (gupnp_dlna_restriction_add_value_list (restriction,
+                                                           pair->name,
+                                                           pair->list))
+                        pair->list = NULL;
+        }
+
+        type = restriction_type_from_string (restriction_type);
+
+        if (type == GUPNP_DLNA_RESTRICTION_TYPE_INVALID) {
+                g_warning ("Support for '%s' restrictions not yet implemented.",
+                           restriction_type);
+                goto out;
+        }
+
+        iter = data->parents = g_list_reverse (data->parents);
+        for (iter = data->parents; iter != NULL; iter = iter->next) {
+                /* Merge all the parent caps. The child overrides parent
+                 * attributes */
+                GUPnPDLNARestriction *parent =
+                                        GUPNP_DLNA_RESTRICTION (iter->data);
+
+                gupnp_dlna_restriction_merge (restriction, parent);
+                iter->data = NULL;
+        }
+
+        description = gupnp_dlna_description_new (restriction, type);
+        merge_restrictions_if_in_dlna_profile (loader, description);
+        if (id != NULL)
+                g_hash_table_replace (priv->descriptions,
+                                      g_strdup (id),
+                                      description);
+        else
+                gupnp_dlna_description_free (description);
+
+ out:
+        gupnp_dlna_restriction_data_free (data);
+        priv->restriction_data_stack = g_list_delete_link
+                                        (priv->restriction_data_stack,
+                                         priv->restriction_data_stack);
+}
+
+static void
+pre_restrictions (GUPnPDLNAProfileLoader *loader)
+{
+        push_tag (loader, GUPNP_DLNA_PARSED_ELEMENT_RESTRICTIONS);
+}
+
+static void
+post_restrictions (GUPnPDLNAProfileLoader *loader)
+{
+        pop_tag (loader);
+}
+
+static void
+pre_dlna_profile (GUPnPDLNAProfileLoader *loader)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+        GUPnPDLNAProfileData* data = gupnp_dlna_profile_data_new ();
+
+        push_tag (loader, GUPNP_DLNA_PARSED_ELEMENT_DLNA_PROFILE);
+        priv->dlna_profile_data_stack = g_list_prepend
+                                        (priv->dlna_profile_data_stack,
+                                         data);
+}
+
+static GList *
+copy_restrictions_list (GList *list)
+{
+        GList *dup = NULL;
+        GList *iter;
+
+        for (iter = list; iter != NULL; iter = iter->next) {
+                GUPnPDLNARestriction *restriction =
+                                        GUPNP_DLNA_RESTRICTION (iter->data);
+                GUPnPDLNARestriction *copy =
+                                      gupnp_dlna_restriction_copy (restriction);
+
+                if (copy)
+                        dup = g_list_prepend (dup, copy);
+        }
+
+        return dup;
+}
+
+static void
+merge_base_restrictions (GUPnPDLNAProfileData *data,
+                         GUPnPDLNAProfile     *profile)
+{
+        GList *audio_restrictions =
+                            gupnp_dlna_profile_get_audio_restrictions (profile);
+        GList *container_restrictions =
+                        gupnp_dlna_profile_get_container_restrictions (profile);
+        GList *image_restrictions =
+                            gupnp_dlna_profile_get_image_restrictions (profile);
+        GList *video_restrictions =
+                            gupnp_dlna_profile_get_video_restrictions (profile);
+
+        if (audio_restrictions != NULL) {
+                GList *copy = copy_restrictions_list (audio_restrictions);
+
+                data->audios = g_list_concat (copy, data->audios);
+        }
+        if (container_restrictions != NULL) {
+                GList *copy = copy_restrictions_list (container_restrictions);
+
+                data->containers = g_list_concat (copy, data->containers);
+        }
+        if (image_restrictions != NULL) {
+                GList *copy = copy_restrictions_list (image_restrictions);
+
+                data->images = g_list_concat (copy, data->images);
+        }
+        if (video_restrictions != NULL) {
+                GList *copy = copy_restrictions_list (video_restrictions);
+
+                data->videos = g_list_concat (copy, data->videos);
+        }
+}
+
+static gboolean
+restrictions_list_is_empty (GList *list)
+{
+        GList *iter;
+
+        for (iter = list; iter != NULL; iter = iter->next) {
+                GUPnPDLNARestriction *restriction =
+                                            GUPNP_DLNA_RESTRICTION (iter->data);
+
+                if (restriction != NULL &&
+                    !gupnp_dlna_restriction_is_empty (restriction))
+                        return FALSE;
+        }
+
+        return TRUE;
+}
+
+static GUPnPDLNAProfile *
+create_profile (GUPnPDLNAProfileLoader *loader,
+                GUPnPDLNAProfile       *base,
+                const gchar            *name,
+                const gchar            *mime,
+                gboolean                extended)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+        GUPnPDLNAProfileData *data =
+                   (GUPnPDLNAProfileData *) priv->dlna_profile_data_stack->data;
+        GList *audio_restrictions = NULL;
+        GList *container_restrictions = NULL;
+        GList *image_restrictions = NULL;
+        GList *video_restrictions = NULL;
+
+        /* Inherit from base profile, if it exists */
+        if (base != NULL)
+                merge_base_restrictions (data, base);
+
+        /* The merged caps will be our new GUPnPDLNAProfile */
+        if (!restrictions_list_is_empty (data->audios)) {
+                audio_restrictions = g_list_reverse (data->audios);
+                data->audios = NULL;
+        }
+        if (!restrictions_list_is_empty (data->containers)) {
+                container_restrictions = g_list_reverse (data->containers);
+                data->containers = NULL;
+        }
+        if (!restrictions_list_is_empty (data->images)) {
+                image_restrictions = g_list_reverse (data->images);
+                data->images = NULL;
+        }
+        if (!restrictions_list_is_empty (data->videos)) {
+                video_restrictions = g_list_reverse (data->videos);
+                data->videos = NULL;
+        }
+
+        return gupnp_dlna_profile_new (name,
+                                       mime,
+                                       audio_restrictions,
+                                       container_restrictions,
+                                       image_restrictions,
+                                       video_restrictions,
+                                       extended);
+}
+
+static void
+post_dlna_profile (GUPnPDLNAProfileLoader *loader)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+        GUPnPDLNAProfileData *data =
+                   (GUPnPDLNAProfileData *) priv->dlna_profile_data_stack->data;
+
+        pop_tag (loader);
+        gupnp_dlna_profile_data_free (data);
+        priv->dlna_profile_data_stack = g_list_delete_link
+                                        (priv->dlna_profile_data_stack,
+                                         priv->dlna_profile_data_stack);
+}
+
+static GList *
+cleanup (GUPnPDLNAProfileLoader *loader G_GNUC_UNUSED,
+         GList *profiles)
+{
+        /* Now that we're done loading profiles, remove all profiles
+         * with no name which are only used for inheritance and not
+         * matching. */
+        GList *iter = profiles;
+
+        while (iter != NULL) {
+                GList *next = iter->next;
+                GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (iter->data);
+                const gchar *name = gupnp_dlna_profile_get_name (profile);
+
+                if (name == NULL || name[0] == '\0') {
+                        profiles = g_list_delete_link (profiles, iter);
+                        g_object_unref (profile);
+                } else {
+                        /* TODO: simplify restrictions in profile if
+                         * possible.
+                         */
+                }
+
+                iter = next;
+        }
+
+        for (iter = profiles; iter != NULL; iter = iter->next) {
+                GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (iter->data);
+                gchar *acaps = gupnp_dlna_utils_restrictions_list_to_string
+                          (gupnp_dlna_profile_get_audio_restrictions (profile));
+                gchar *ccaps = gupnp_dlna_utils_restrictions_list_to_string
+                      (gupnp_dlna_profile_get_container_restrictions (profile));
+                gchar *icaps = gupnp_dlna_utils_restrictions_list_to_string
+                          (gupnp_dlna_profile_get_image_restrictions (profile));
+                gchar *vcaps = gupnp_dlna_utils_restrictions_list_to_string
+                          (gupnp_dlna_profile_get_video_restrictions (profile));
+
+                g_debug ("Loaded profile: %s\nMIME: %s\naudio caps: %s\n"
+                         "container caps: %s\nimage caps: %s\nvideo caps: %s\n",
+                         gupnp_dlna_profile_get_name (profile),
+                         gupnp_dlna_profile_get_mime (profile),
+                         acaps,
+                         ccaps,
+                         icaps,
+                         vcaps);
+                g_free (acaps);
+                g_free (ccaps);
+                g_free (icaps);
+                g_free (vcaps);
+        }
+
+        return profiles;
+}
+
+static void
+gupnp_dlna_profile_loader_get_property (GObject    *object,
+                                        guint       prop_id,
+                                        GValue     *value,
+                                        GParamSpec *pspec)
+{
+        GUPnPDLNAProfileLoader *loader = GUPNP_DLNA_PROFILE_LOADER (object);
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        switch (prop_id) {
+        case PROP_RELAXED_MODE:
+                g_value_set_boolean (value, priv->relaxed_mode);
+                break;
+
+        case PROP_EXTENDED_MODE:
+                g_value_set_boolean (value, priv->extended_mode);
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gupnp_dlna_profile_loader_set_property (GObject      *object,
+                                        guint         prop_id,
+                                        const GValue *value,
+                                        GParamSpec   *pspec)
+{
+        GUPnPDLNAProfileLoader *loader = GUPNP_DLNA_PROFILE_LOADER (object);
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        switch (prop_id) {
+        case PROP_RELAXED_MODE:
+                priv->relaxed_mode = g_value_get_boolean (value);
+                break;
+
+        case PROP_EXTENDED_MODE:
+                priv->extended_mode = g_value_get_boolean (value);
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    }
+}
+
+static void
+gupnp_dlna_profile_loader_dispose (GObject *object)
+{
+        GUPnPDLNAProfileLoader *loader = GUPNP_DLNA_PROFILE_LOADER (object);
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        g_clear_pointer (&priv->restrictions, g_hash_table_unref);
+        g_clear_pointer (&priv->profile_ids, g_hash_table_unref);
+        g_clear_pointer (&priv->files_hash, g_hash_table_unref);
+
+        g_clear_pointer (&priv->descriptions, g_hash_table_unref);
+        g_clear_pointer (&priv->tags_stack, g_list_free);
+        g_clear_pointer (&priv->dlna_profile_data_stack,
+                         gupnp_dlna_profile_data_stack_free);
+        g_clear_pointer (&priv->restriction_data_stack,
+                         gupnp_dlna_restriction_data_stack_free);
+
+        G_OBJECT_CLASS (gupnp_dlna_profile_loader_parent_class)->dispose
+                                        (object);
+}
+
+static void
+gupnp_dlna_profile_loader_class_init (GUPnPDLNAProfileLoaderClass *loader_class)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (loader_class);
+        GParamSpec *spec;
+
+        object_class->get_property = gupnp_dlna_profile_loader_get_property;
+        object_class->set_property = gupnp_dlna_profile_loader_set_property;
+        object_class->dispose = gupnp_dlna_profile_loader_dispose;
+
+        spec = g_param_spec_boolean ("relaxed-mode",
+                                     "Relaxed mode",
+                                     "Whether loader loads relaxed profiles",
+                                     TRUE,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT_ONLY |
+                                     G_PARAM_STATIC_STRINGS);
+
+        g_object_class_install_property (object_class,
+                                         PROP_RELAXED_MODE,
+                                         spec);
+
+        spec = g_param_spec_boolean ("extended-mode",
+                                     "Extended mode",
+                                     "Whether loader loads extended profiles",
+                                     TRUE,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT_ONLY |
+                                     G_PARAM_STATIC_STRINGS);
+
+        g_object_class_install_property (object_class,
+                                         PROP_EXTENDED_MODE,
+                                         spec);
+
+        g_type_class_add_private (loader_class,
+                                  sizeof (GUPnPDLNAProfileLoaderPrivate));
+}
+
+static void
+gupnp_dlna_profile_loader_init (GUPnPDLNAProfileLoader *self)
+{
+        GUPnPDLNAProfileLoaderPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_PROFILE_LOADER,
+                                         GUPnPDLNAProfileLoaderPrivate);
+
+        priv->restrictions = g_hash_table_new_full (g_str_hash,
+                                                    g_str_equal,
+                                                    g_free,
+                                                    NULL);
+        priv->profile_ids = g_hash_table_new_full (g_str_hash,
+                                                   g_str_equal,
+                                                   g_free,
+                                                   g_object_unref);
+        priv->files_hash = g_hash_table_new_full (g_str_hash,
+                                                  g_str_equal,
+                                                  g_free,
+                                                  NULL);
+
+        priv->descriptions = g_hash_table_new_full
+                                 (g_str_hash,
+                                  g_str_equal,
+                                  g_free,
+                                  (GDestroyNotify) gupnp_dlna_description_free);
+        priv->tags_stack = NULL;
+        priv->dlna_profile_data_stack = NULL;
+        priv->restriction_data_stack = NULL;
+
+        self->priv = priv;
+}
+
+static GUPnPDLNAFieldValue *
+get_value (xmlTextReaderPtr reader)
+{
+        GUPnPDLNAFieldValue *value = NULL;
+        xmlChar *curr = xmlTextReaderName (reader);
+        int ret = 1;
+
+        /* This function may be called with reader pointing to a <field> or
+         * the element just below a <field>. In the former case, we move the
+         * cursor forward and then continue processing. */
+        if (xmlStrEqual (curr, BAD_CAST ("field")))
+                ret = xmlTextReaderRead (reader);
+        xmlFree (curr);
+
+        while (ret == 1) {
+                xmlChar *tag = xmlTextReaderName (reader);
+
+                if (xmlTextReaderNodeType (reader) == NODE_TYPE_ELEMENT_START &&
+                    xmlStrEqual (tag, BAD_CAST ("value"))) {
+                        /* <value> */
+                        gint node_type;
+
+                        /* Note: This assumes you won't have a comment in the
+                         *       middle of your text */
+                        do {
+                                ret = xmlTextReaderRead (reader);
+                                node_type = xmlTextReaderNodeType (reader);
+                        } while (ret == 1 &&
+                                 node_type != NODE_TYPE_TEXT &&
+                                 node_type != NODE_TYPE_ELEMENT_END);
+
+                        /* We're now at the real text between a <value> and a
+                         * </value> */
+
+                        if (node_type == NODE_TYPE_TEXT) {
+                                xmlChar *string = xmlTextReaderValue (reader);
+
+                                value = gupnp_dlna_field_value_new_single
+                                                            ((gchar *) string);
+                                if (string)
+                                        xmlFree (string);
+                        }
+                }
+
+                if (xmlTextReaderNodeType (reader) == NODE_TYPE_ELEMENT_END &&
+                    xmlStrEqual (tag, BAD_CAST ("value"))) {
+                        /* </value> */
+                        xmlFree (tag);
+
+                        break;
+                }
+
+                xmlFree (tag);
+                ret = xmlTextReaderRead (reader);
+        }
+
+        if (!value)
+                g_warning ("Empty <value>s are illegal");
+
+        return value;
+}
+
+static GUPnPDLNAFieldValue *
+get_range (xmlTextReaderPtr reader)
+{
+        xmlChar *min = xmlTextReaderGetAttribute (reader, BAD_CAST ("min"));
+        xmlChar *max = xmlTextReaderGetAttribute (reader, BAD_CAST ("max"));
+        GUPnPDLNAFieldValue *value = gupnp_dlna_field_value_new_range
+                                        ((gchar *) min,
+                                         (gchar *) max);
+
+        if (min)
+                xmlFree (min);
+        if (max)
+                xmlFree (max);
+
+        return value;
+}
+
+static void
+process_field (GUPnPDLNAProfileLoader *loader,
+               xmlTextReaderPtr        reader)
+{
+        xmlChar *name = NULL;
+        xmlChar *type = NULL;
+        xmlChar *used;
+        GList *values = NULL;
+        gboolean done = FALSE;
+        gboolean skip = FALSE;
+        GUPnPDLNAFieldValue *value = NULL;
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        pre_field (loader);
+
+        /*
+         * Parse the 'used' attribute and figure out the mode we
+         * need to follow.
+         */
+        used = xmlTextReaderGetAttribute (reader, BAD_CAST ("used"));
+        if (used) {
+                if ((priv->relaxed_mode == FALSE) &&
+                    xmlStrEqual (used, BAD_CAST ("in-relaxed"))) {
+                        skip = TRUE;
+                } else if ((priv->relaxed_mode == TRUE) &&
+                           (xmlStrEqual (used, BAD_CAST ("in-strict")))) {
+                        skip = TRUE;
+                }
+
+                xmlFree (used);
+        }
+
+        if (!skip) {
+                name = xmlTextReaderGetAttribute (reader, BAD_CAST ("name"));
+                type = xmlTextReaderGetAttribute (reader, BAD_CAST ("type"));
+        }
+
+        /* I don't like it - we should check done first, then try to
+         * read next tag. But this is how it was done in original
+         * code, so I am not touching it for now - krnowak.
+         */
+        while ((xmlTextReaderRead (reader) == 1) && !done) {
+                xmlChar *tag = xmlTextReaderName (reader);
+
+                switch (xmlTextReaderNodeType (reader)) {
+                case NODE_TYPE_ELEMENT_START:
+                        if (skip)
+                                break;
+
+                        if (xmlStrEqual (tag, BAD_CAST ("range"))) {
+                                /* <range> */
+                                value = get_range (reader);
+                        } else if (xmlStrEqual (tag, BAD_CAST ("value"))) {
+                                /* <value> */
+                                value = get_value (reader);
+                        }
+
+                        if (value)
+                                values = g_list_prepend (values, value);
+                        break;
+
+                case NODE_TYPE_ELEMENT_END:
+                        if (xmlStrEqual (tag, BAD_CAST ("field")))
+                                /* </field> */
+                                done = TRUE;
+
+                        break;
+
+                default:
+                        break;
+                }
+
+                xmlFree (tag);
+        }
+
+        if (values)
+                values = g_list_reverse (values);
+
+        post_field (loader, (gchar *)name, (gchar *)type, values);
+
+        if (name)
+                xmlFree (name);
+        if (type)
+                xmlFree (type);
+        if (values) {
+                g_list_free_full (values,
+                                  (GDestroyNotify) gupnp_dlna_field_value_free);
+        }
+}
+
+static void
+process_parent (GUPnPDLNAProfileLoader *loader,
+                xmlTextReaderPtr        reader)
+{
+        xmlChar *parent = NULL;
+        xmlChar *used = NULL;
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        pre_parent (loader);
+
+        /*
+         * Check to see if we need to follow any relaxed/strict mode
+         * restrictions.
+         */
+        used = xmlTextReaderGetAttribute (reader, BAD_CAST ("used"));
+        if (used) {
+                gboolean go_out = FALSE;
+
+                if ((priv->relaxed_mode == FALSE) &&
+                    xmlStrEqual (used, BAD_CAST ("in-relaxed"))) {
+                        go_out = TRUE;
+                } else if ((priv->relaxed_mode == TRUE) &&
+                           (xmlStrEqual (used, BAD_CAST ("in-strict")))) {
+                        go_out = TRUE;
+                }
+                xmlFree (used);
+                if (go_out)
+                        goto out;
+        }
+
+        parent = xmlTextReaderGetAttribute (reader, BAD_CAST ("name"));
+
+        if (!g_hash_table_contains (priv->restrictions, parent))
+                g_warning ("Could not find parent restriction: %s", parent);
+
+ out:
+        post_parent (loader, (gchar*) parent);
+
+        if (parent)
+                xmlFree (parent);
+}
+
+static void
+process_restriction (GUPnPDLNAProfileLoader *loader,
+                     xmlTextReaderPtr        reader)
+{
+        xmlChar *used;
+        gboolean done = FALSE;
+        gboolean skip = FALSE;
+        xmlChar *id = NULL;
+        xmlChar *type = NULL;
+        gchar *name = NULL;
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        pre_restriction (loader);
+        /*
+         * First we parse the 'used' attribute and figure out
+         * the mode we need to comply to.
+         */
+        used = xmlTextReaderGetAttribute (reader, BAD_CAST ("used"));
+        if (used) {
+                if ((priv->relaxed_mode == FALSE) &&
+                    xmlStrEqual (used, BAD_CAST ("in-relaxed"))) {
+                        skip = TRUE;
+                } else if ((priv->relaxed_mode == TRUE) &&
+                           (xmlStrEqual (used, BAD_CAST ("in-strict")))) {
+                        skip = TRUE;
+                }
+                xmlFree (used);
+        }
+
+        if (!skip) {
+                id = xmlTextReaderGetAttribute (reader, BAD_CAST ("id"));
+                type = xmlTextReaderGetAttribute (reader, BAD_CAST ("type"));
+        }
+
+        /* I don't like it - we should check done first, then try to
+         * read next tag. But this is how it was done in original
+         * code, so I am not touching it for now - krnowak.
+         */
+        while ((xmlTextReaderRead (reader) == 1) && !done) {
+                xmlChar *tag = xmlTextReaderName (reader);
+
+                switch (xmlTextReaderNodeType (reader)) {
+                case NODE_TYPE_ELEMENT_START:
+                        if (skip)
+                                break;
+
+                        if (xmlStrEqual (tag, BAD_CAST ("field"))) {
+                                /* <field> */
+                                xmlChar *field;
+
+                                field = xmlTextReaderGetAttribute
+                                        (reader,
+                                         BAD_CAST ("name"));
+
+                                if (xmlStrEqual (field, BAD_CAST ("name"))) {
+                                        GUPnPDLNAFieldValue *value = get_value
+                                                (reader);
+
+                                        if (value) {
+                                                /* get_value returns
+                                                   single type
+                                                   value. */
+                                                name =
+                                                 g_strdup (value->value.single);
+                                                gupnp_dlna_field_value_free
+                                                        (value);
+                                        }
+                                } else
+                                        process_field (loader, reader);
+
+                                xmlFree (field);
+                        } else if (xmlStrEqual (tag, BAD_CAST ("parent"))) {
+                                /* <parent> */
+                                process_parent (loader, reader);
+                        }
+
+                        break;
+
+                case NODE_TYPE_ELEMENT_END:
+                        if (xmlStrEqual (tag, BAD_CAST ("restriction")))
+                                /* </restriction> */
+                                done = TRUE;
+
+                        break;
+
+                default:
+                        break;
+                }
+
+                xmlFree (tag);
+        }
+
+        if (skip)
+                goto out;
+
+        if (id)
+                g_hash_table_add (priv->restrictions, g_strdup ((gchar *) id));
+
+out:
+        post_restriction (loader, (gchar *) type, (gchar *) id, name);
+        if (type)
+                xmlFree (type);
+        if (id)
+                xmlFree (id);
+        g_free (name);
+}
+
+static void
+process_restrictions (GUPnPDLNAProfileLoader *loader,
+                      xmlTextReaderPtr        reader)
+{
+        gboolean done = FALSE;
+
+        pre_restrictions (loader);
+
+        while (!done && xmlTextReaderRead (reader) == 1) {
+                xmlChar *tag = xmlTextReaderName (reader);
+
+                switch (xmlTextReaderNodeType (reader)) {
+                case NODE_TYPE_ELEMENT_START:
+                        if (xmlStrEqual (tag, BAD_CAST ("restriction"))) {
+                                /* <restriction> */
+                                process_restriction (loader, reader);
+                        }
+
+                        break;
+
+                case NODE_TYPE_ELEMENT_END:
+                        if (xmlStrEqual (tag, BAD_CAST ("restrictions")))
+                                /* </restrictions> */
+                                done = TRUE;
+
+                default:
+                        break;
+                }
+
+                xmlFree (tag);
+        }
+
+        post_restrictions (loader);
+}
+
+static void
+process_dlna_profile (GUPnPDLNAProfileLoader  *loader,
+                      xmlTextReaderPtr         reader,
+                      GList                  **profiles)
+{
+        GUPnPDLNAProfile *profile = NULL;
+        GUPnPDLNAProfile *base = NULL;
+        xmlChar *name;
+        xmlChar *mime;
+        xmlChar *id;
+        xmlChar *base_profile;
+        xmlChar *extended;
+        gboolean done = FALSE;
+        gboolean is_extended = FALSE;
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        pre_dlna_profile (loader);
+
+        name = xmlTextReaderGetAttribute (reader, BAD_CAST ("name"));
+        mime = xmlTextReaderGetAttribute (reader, BAD_CAST ("mime"));
+        extended = xmlTextReaderGetAttribute (reader, BAD_CAST ("extended"));
+        id = xmlTextReaderGetAttribute (reader, BAD_CAST ("id"));
+        base_profile = xmlTextReaderGetAttribute (reader,
+                                                  BAD_CAST ("base-profile"));
+
+        if (!name) {
+                g_assert (mime == NULL);
+
+                /* We need a non-NULL string to not trigger asserts in the
+                 * places these are used. Profiles without names are used
+                 * only for inheritance, not for actual matching. */
+                name = xmlStrdup (BAD_CAST (""));
+                mime = xmlStrdup (BAD_CAST (""));
+        }
+
+        if (extended && xmlStrEqual (extended, BAD_CAST ("true"))) {
+                /* If we're not in extended mode, skip this profile */
+                if (!priv->extended_mode)
+                        goto out;
+
+                is_extended = TRUE;
+        }
+
+        /* I don't like it - we should check done first, then try to
+         * read next tag. But this is how it was done in original
+         * code, so I am not touching it for now - krnowak.
+         */
+        while ((xmlTextReaderRead (reader) == 1) && !done) {
+                xmlChar *tag = xmlTextReaderName (reader);
+
+                switch (xmlTextReaderNodeType (reader)) {
+                case NODE_TYPE_ELEMENT_START:
+                        if (xmlStrEqual (tag, BAD_CAST ("restriction")))
+                                process_restriction (loader, reader);
+                        else if (xmlStrEqual (tag, BAD_CAST ("parent")))
+                                process_parent (loader, reader);
+                        break;
+
+                case NODE_TYPE_ELEMENT_END:
+                        if (xmlStrEqual (tag, BAD_CAST ("dlna-profile")))
+                                done = TRUE;
+
+                default:
+                        break;
+                }
+
+                xmlFree (tag);
+        }
+
+        if (base_profile) {
+                base = g_hash_table_lookup (priv->profile_ids, base_profile);
+                if (!base)
+                        g_warning ("Invalid base-profile reference");
+        }
+
+
+        profile = create_profile (loader,
+                                  base,
+                                  (gchar *) name,
+                                  (gchar *) mime,
+                                  is_extended);
+
+        *profiles = g_list_prepend (*profiles, profile);
+
+        if (id) {
+                g_hash_table_replace (priv->profile_ids,
+                                      g_strdup ((gchar *) id),
+                                      g_object_ref (profile));
+        }
+
+out:
+        post_dlna_profile (loader);
+
+        if (id)
+                xmlFree (id);
+        if (mime)
+                xmlFree (mime);
+        if (name)
+                xmlFree (name);
+        if (extended)
+                xmlFree (extended);
+        if (base_profile)
+                xmlFree (base_profile);
+}
+
+static void
+gupnp_dlna_profile_loader_get_from_file (GUPnPDLNAProfileLoader  *loader,
+                                         const char              *file_name,
+                                         GList                  **profiles);
+
+static void
+process_include (GUPnPDLNAProfileLoader  *loader,
+                 xmlTextReaderPtr         reader,
+                 GList                  **profiles)
+{
+        xmlChar *path;
+        gchar *g_path;
+
+        path = xmlTextReaderGetAttribute (reader, BAD_CAST ("ref"));
+        g_path = g_strdup ((gchar *) path);
+        if (path)
+                xmlFree (path);
+
+        if (!g_path_is_absolute (g_path)) {
+                gchar *tmp = g_build_filename (DLNA_DATA_DIR,
+                                               g_path,
+                                               NULL);
+                g_free (g_path);
+                g_path = tmp;
+        }
+
+        gupnp_dlna_profile_loader_get_from_file (loader, g_path, profiles);
+        g_free (g_path);
+}
+
+/* This can go away once we have a glib function to canonicalize paths (see
+ * https://bugzilla.gnome.org/show_bug.cgi?id=111848
+ *
+ * The implementation is not generic enough, but sufficient for our use. The
+ * idea is taken from Tristan Van Berkom's comment in the bug mentioned above:
+ *
+ *   1. cd dirname(path)
+ *   2. absdir = $CWD
+ *   3. cd $OLDPWD
+ *   4. abspath = absdir + basename(path)
+ */
+static gchar *
+canonicalize_path_name (const char *path)
+{
+        gchar *dir_name = NULL, *file_name = NULL, *abs_dir = NULL,
+              *old_dir = NULL, *ret = NULL;
+
+        if (g_path_is_absolute (path))
+                return g_strdup (path);
+
+        old_dir = g_get_current_dir ();
+        dir_name = g_path_get_dirname (path);
+
+        if (g_chdir (dir_name) < 0) {
+                ret = g_strdup (path);
+                goto out;
+        }
+
+        abs_dir = g_get_current_dir ();
+        g_chdir (old_dir);
+
+        file_name = g_path_get_basename (path);
+        ret = g_build_filename (abs_dir, file_name, NULL);
+
+out:
+        g_free (dir_name);
+        g_free (file_name);
+        g_free (abs_dir);
+        g_free (old_dir);
+
+        return ret;
+}
+
+static void
+gupnp_dlna_profile_loader_get_from_file (GUPnPDLNAProfileLoader  *loader,
+                                         const char              *file_name,
+                                         GList                  **profiles)
+{
+        gchar *path = canonicalize_path_name (file_name);
+        xmlTextReaderPtr reader = NULL;
+        xmlRelaxNGParserCtxtPtr rngp = NULL;
+        xmlRelaxNGPtr rngs = NULL;
+        GUPnPDLNAProfileLoaderPrivate *priv = loader->priv;
+
+        if (g_hash_table_contains (priv->files_hash, path))
+                goto out;
+        else
+                g_hash_table_add (priv->files_hash, g_strdup (path));
+
+        reader = xmlNewTextReaderFilename (path);
+        if (!reader)
+                goto out;
+
+        /* Load the schema for validation */
+        rngp = xmlRelaxNGNewParserCtxt (DLNA_DATA_DIR
+                                        G_DIR_SEPARATOR_S
+                                        "dlna-profiles.rng");
+        if (!rngp)
+                goto out;
+        rngs = xmlRelaxNGParse (rngp);
+        if (!rngs)
+                goto out;
+        if (xmlTextReaderRelaxNGSetSchema (reader, rngs) < 0)
+                goto out;
+
+        while (xmlTextReaderRead (reader) == 1) {
+                xmlChar *tag = xmlTextReaderName (reader);
+
+                switch (xmlTextReaderNodeType (reader)) {
+                        case NODE_TYPE_ELEMENT_START:
+                                if (xmlStrEqual (tag, BAD_CAST ("include"))) {
+                                        /* <include> */
+                                        process_include (loader,
+                                                         reader,
+                                                         profiles);
+                                } else if (xmlStrEqual (tag,
+                                        BAD_CAST ("restrictions"))) {
+                                        /* <restrictions> */
+                                        process_restrictions (loader,
+                                                              reader);
+                                } else if (xmlStrEqual (tag,
+                                        BAD_CAST ("dlna-profile"))) {
+                                        /* <dlna-profile> */
+                                        process_dlna_profile (loader,
+                                                              reader,
+                                                              profiles);
+
+                                }
+
+                                break;
+
+                        default:
+                                break;
+                }
+
+                xmlFree (tag);
+        }
+
+
+out:
+        g_free (path);
+        if (reader)
+                xmlFreeTextReader (reader);
+        if (rngs)
+                xmlRelaxNGFree (rngs);
+        if (rngp)
+                xmlRelaxNGFreeParserCtxt (rngp);
+}
+
+static GList *
+gupnp_dlna_profile_loader_get_from_dir (GUPnPDLNAProfileLoader *loader,
+                                        gchar                  *profile_dir)
+{
+        GDir *dir;
+        GList *profiles = NULL;
+
+        if ((dir = g_dir_open (profile_dir, 0, NULL))) {
+                const gchar *entry;
+
+                while ((entry = g_dir_read_name (dir))) {
+                        gchar *path = g_build_filename (profile_dir,
+                                                        entry,
+                                                        NULL);
+
+                        if (g_str_has_suffix (entry, ".xml") &&
+                            g_file_test (path, G_FILE_TEST_IS_REGULAR)) {
+                                gupnp_dlna_profile_loader_get_from_file
+                                        (loader,
+                                         path,
+                                         &profiles);
+                        }
+
+                        g_free (path);
+                }
+
+                g_dir_close (dir);
+        }
+
+        return profiles;
+}
+
+GUPnPDLNAProfileLoader *
+gupnp_dlna_profile_loader_new (gboolean relaxed_mode,
+                               gboolean extended_mode)
+{
+        return GUPNP_DLNA_PROFILE_LOADER (g_object_new
+                                        (GUPNP_TYPE_DLNA_PROFILE_LOADER,
+                                         "relaxed-mode", relaxed_mode,
+                                         "extended-mode", extended_mode,
+                                         NULL));
+}
+
+GList *
+gupnp_dlna_profile_loader_get_from_disk (GUPnPDLNAProfileLoader *loader)
+{
+        GList *profiles;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE_LOADER (loader), NULL);
+
+        profiles = gupnp_dlna_profile_loader_get_from_dir (loader,
+                                                           DLNA_DATA_DIR);
+
+        profiles = g_list_reverse (profiles);
+
+        return cleanup (loader, profiles);
+}
diff --git a/libgupnp-dlna/gupnp-dlna-profile-loader.h b/libgupnp-dlna/gupnp-dlna-profile-loader.h
new file mode 100644 (file)
index 0000000..68e72d1
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2009 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Zeeshan Ali <zeeshanak@gnome.org>
+ *                      <zeeshan.ali@nokia.com>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_PROFILE_LOADER_H__
+#define __GUPNP_DLNA_PROFILE_LOADER_H__
+
+#include <glib-object.h>
+#include "gupnp-dlna-profile.h"
+#include "gupnp-dlna-field-value.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_PROFILE_LOADER (gupnp_dlna_profile_loader_get_type ())
+
+#define GUPNP_DLNA_PROFILE_LOADER(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_PROFILE_LOADER, \
+                                     GUPnPDLNAProfileLoader))
+
+#define GUPNP_DLNA_PROFILE_LOADER_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_PROFILE_LOADER, \
+                                  GUPnPDLNAProfileLoaderClass))
+
+#define GUPNP_IS_DLNA_PROFILE_LOADER(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_PROFILE_LOADER))
+
+#define GUPNP_IS_DLNA_PROFILE_LOADER_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_PROFILE_LOADER))
+
+#define GUPNP_DLNA_PROFILE_LOADER_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_PROFILE_LOADER, \
+                                    GUPnPDLNAProfileLoaderClass))
+
+typedef struct _GUPnPDLNAProfileLoaderPrivate GUPnPDLNAProfileLoaderPrivate;
+
+typedef struct {
+        GObject parent;
+
+        GUPnPDLNAProfileLoaderPrivate *priv;
+} GUPnPDLNAProfileLoader;
+
+typedef struct {
+        GObjectClass parent_class;
+} GUPnPDLNAProfileLoaderClass;
+
+GType
+gupnp_dlna_profile_loader_get_type (void);
+
+GUPnPDLNAProfileLoader *
+gupnp_dlna_profile_loader_new (gboolean relaxed_mode,
+                               gboolean extended_mode);
+
+GList *
+gupnp_dlna_profile_loader_get_from_disk (GUPnPDLNAProfileLoader *loader);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_PROFILE_LOADER_H__ */
index 0e1f4ed..f583317 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Copyright (C) 2011 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
  *
- * Authors: Parthasarathi Susarla <partha.susarla@collabora.co.uk>
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
+
 #ifndef __GUPNP_DLNA_PROFILE_PRIVATE_H__
 #define __GUPNP_DLNA_PROFILE_PRIVATE_H__
 
-G_BEGIN_DECLS
-
-GUPnPDLNAProfile * gupnp_dlna_profile_new (gchar     *name,
-                                           gchar     *mime,
-                                           GstCaps   *container_caps,
-                                           GstCaps   *video_caps,
-                                           GstCaps   *audio_caps,
-                                           gboolean  extended);
+#include <glib-object.h>
+#include "gupnp-dlna-profile.h"
 
+G_BEGIN_DECLS
 
-const GstCaps * gupnp_dlna_profile_get_container_caps (GUPnPDLNAProfile *self);
-const GstCaps * gupnp_dlna_profile_get_video_caps (GUPnPDLNAProfile *self);
-const GstCaps * gupnp_dlna_profile_get_audio_caps (GUPnPDLNAProfile *self);
-
-void gupnp_dlna_profile_set_container_caps (GUPnPDLNAProfile *self, GstCaps *caps);
-void gupnp_dlna_profile_set_video_caps (GUPnPDLNAProfile *self, GstCaps *caps);
-void gupnp_dlna_profile_set_audio_caps (GUPnPDLNAProfile *self, GstCaps *caps);
+GUPnPDLNAProfile *
+gupnp_dlna_profile_new (const gchar *name,
+                        const gchar *mime,
+                        GList       *audio_restrictions,
+                        GList       *container_restrictions,
+                        GList       *image_restrictions,
+                        GList       *video_restrictions,
+                        gboolean     extended);
 
 G_END_DECLS
 
index b88fed6..ac338ae 100644 (file)
@@ -1,7 +1,9 @@
 /*
  * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation.
  *
  * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 #include "gupnp-dlna-profile.h"
 #include "gupnp-dlna-profile-private.h"
-#include <gst/gstminiobject.h>
 
 /**
  * SECTION:gupnp-dlna-profile
  * @short_description: Object representing a DLNA profile
  *
- * The #GUPnPDLNADiscoverer object provides a few APIs that return
- * #GUPnPDLNAProfile objects. These represent a single DLNA profile. Each
- * #GUPnPDLNAProfile has a name (the name of the DLNA profile), the
- * corresponding MIME type, and a #GstEncodingProfile which represents the
- * various audio/video/container restrictions specified for that DLNA profile.
+ * The #GUPnPDLNAProfileGuesser object provides a few APIs that return
+ * #GUPnPDLNAProfile objects. These represent a single DLNA
+ * profile. Each #GUPnPDLNAProfile has a name (the name of the DLNA
+ * profile) and the corresponding MIME type.
+ *
+ * Public representation of the various audio/container/image/video
+ * restrictions specified for that DLNA profile is to be added.
  */
 G_DEFINE_TYPE (GUPnPDLNAProfile, gupnp_dlna_profile, G_TYPE_OBJECT)
 
-#define GET_PRIVATE(o)                                          \
-        (G_TYPE_INSTANCE_GET_PRIVATE ((o),                      \
-                                      GUPNP_TYPE_DLNA_PROFILE,  \
-                                      GUPnPDLNAProfilePrivate))
-
-typedef struct _GUPnPDLNAProfilePrivate GUPnPDLNAProfilePrivate;
-
 struct _GUPnPDLNAProfilePrivate {
-        gchar              *name;
-        gchar              *mime;
-        GstCaps            *container_caps;
-        GstCaps            *video_caps;
-        GstCaps            *audio_caps;
-        gboolean           extended;
-        GstEncodingProfile *enc_profile;
+        gchar    *name;
+        gchar    *mime;
+        gboolean  extended;
+        GList    *audio_restrictions;
+        GList    *container_restrictions;
+        GList    *image_restrictions;
+        GList    *video_restrictions;
 };
 
 enum {
         PROP_0,
         PROP_DLNA_NAME,
         PROP_DLNA_MIME,
-        PROP_ENCODING_PROFILE,
         PROP_DLNA_EXTENDED,
+        PROP_AUDIO_RESTRICTIONS,
+        PROP_CONTAINER_RESTRICTIONS,
+        PROP_IMAGE_RESTRICTIONS,
+        PROP_VIDEO_RESTRICTIONS
 };
 
 static void
@@ -66,84 +65,118 @@ gupnp_dlna_profile_get_property (GObject    *object,
                                  GValue     *value,
                                  GParamSpec *pspec)
 {
-        GUPnPDLNAProfile *self = GUPNP_DLNA_PROFILE (object);
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
+        GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (object);
+        GUPnPDLNAProfilePrivate *priv = profile->priv;
 
         switch (property_id) {
-                case PROP_DLNA_NAME:
-                        g_value_set_string (value, priv->name);
-                        break;
-
-                case PROP_DLNA_MIME:
-                        g_value_set_string (value, priv->mime);
-                        break;
-
-                case PROP_ENCODING_PROFILE:
-                        gst_value_set_mini_object (value,
-                                        GST_MINI_OBJECT (priv->enc_profile));
-                        break;
-
-                case PROP_DLNA_EXTENDED:
-                        g_value_set_boolean (value, priv->extended);
-                        break;
-
-                default:
-                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
-                                                           property_id,
-                                                           pspec);
-                        break;
+        case PROP_DLNA_NAME:
+                g_value_set_string (value, priv->name);
+
+                break;
+        case PROP_DLNA_MIME:
+                g_value_set_string (value, priv->mime);
+
+                break;
+        case PROP_DLNA_EXTENDED:
+                g_value_set_boolean (value, priv->extended);
+
+                break;
+        case PROP_AUDIO_RESTRICTIONS:
+                g_value_set_pointer (value, priv->audio_restrictions);
+
+                break;
+        case PROP_CONTAINER_RESTRICTIONS:
+                g_value_set_pointer (value, priv->container_restrictions);
+
+                break;
+        case PROP_IMAGE_RESTRICTIONS:
+                g_value_set_pointer (value, priv->image_restrictions);
+
+                break;
+        case PROP_VIDEO_RESTRICTIONS:
+                g_value_set_pointer (value, priv->video_restrictions);
+
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
+                                                   property_id,
+                                                   pspec);
+                break;
         }
 }
 
 static void
+free_restrictions (GList *list)
+{
+        if (list == NULL)
+                return;
+        g_list_free_full (list,
+                          (GDestroyNotify) gupnp_dlna_restriction_free);
+}
+
+static void
 gupnp_dlna_profile_set_property (GObject      *object,
                                  guint         property_id,
                                  const GValue *value,
                                  GParamSpec   *pspec)
 {
-        GUPnPDLNAProfile *self = GUPNP_DLNA_PROFILE (object);
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
+        GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (object);
+        GUPnPDLNAProfilePrivate *priv = profile->priv;
 
         switch (property_id) {
-                case PROP_DLNA_NAME:
-                        g_free (priv->name);
-                        priv->name = g_value_dup_string (value);
-                        break;
-
-                case PROP_DLNA_MIME:
-                        g_free (priv->mime);
-                        priv->mime = g_value_dup_string (value);
-                        break;
-
-                case PROP_DLNA_EXTENDED:
-                        priv->extended = g_value_get_boolean (value);
-                        break;
-
-                default:
-                        G_OBJECT_WARN_INVALID_PROPERTY_ID
-                                (object, property_id, pspec);
-                        break;
+        case PROP_DLNA_NAME:
+                g_free (priv->name);
+                priv->name = g_value_dup_string (value);
+
+                break;
+        case PROP_DLNA_MIME:
+                g_free (priv->mime);
+                priv->mime = g_value_dup_string (value);
+
+                break;
+        case PROP_DLNA_EXTENDED:
+                priv->extended = g_value_get_boolean (value);
+
+                break;
+        case PROP_AUDIO_RESTRICTIONS:
+                free_restrictions (priv->audio_restrictions);
+                priv->audio_restrictions = g_value_get_pointer (value);
+
+                break;
+        case PROP_CONTAINER_RESTRICTIONS:
+                free_restrictions (priv->container_restrictions);
+                priv->container_restrictions =
+                        g_value_get_pointer (value);
+
+                break;
+        case PROP_IMAGE_RESTRICTIONS:
+                free_restrictions (priv->image_restrictions);
+                priv->image_restrictions = g_value_get_pointer (value);
+
+                break;
+        case PROP_VIDEO_RESTRICTIONS:
+                free_restrictions (priv->video_restrictions);
+                priv->video_restrictions = g_value_get_pointer (value);
+
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
         }
 }
 
 static void
 gupnp_dlna_profile_finalize (GObject *object)
 {
-        GUPnPDLNAProfile *self = GUPNP_DLNA_PROFILE (object);
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
+        GUPnPDLNAProfile *profile = GUPNP_DLNA_PROFILE (object);
+        GUPnPDLNAProfilePrivate *priv = profile->priv;
 
         g_free (priv->name);
         g_free (priv->mime);
-
-        if (priv->container_caps)
-                gst_caps_unref (priv->container_caps);
-        if (priv->audio_caps)
-                gst_caps_unref (priv->audio_caps);
-        if (priv->video_caps)
-                gst_caps_unref (priv->video_caps);
-
-        if (priv->enc_profile)
-                gst_encoding_profile_unref (priv->enc_profile);
+        free_restrictions (priv->audio_restrictions);
+        free_restrictions (priv->container_restrictions);
+        free_restrictions (priv->image_restrictions);
+        free_restrictions (priv->video_restrictions);
 
         G_OBJECT_CLASS (gupnp_dlna_profile_parent_class)->finalize (object);
 }
@@ -154,20 +187,28 @@ gupnp_dlna_profile_class_init (GUPnPDLNAProfileClass *klass)
         GObjectClass *object_class = G_OBJECT_CLASS (klass);
         GParamSpec *pspec;
 
-        g_type_class_add_private (klass, sizeof (GUPnPDLNAProfilePrivate));
-
         object_class->get_property = gupnp_dlna_profile_get_property;
         object_class->set_property = gupnp_dlna_profile_set_property;
         object_class->finalize = gupnp_dlna_profile_finalize;
 
+        /**
+         * GUPnPDLNAProfile:name:
+         *
+         * Name of the DLNA profile.
+         */
         pspec = g_param_spec_string ("name",
                                      "DLNA profile name",
-                                     "The name of the DLNA profile ",
+                                     "The name of the DLNA profile",
                                      NULL,
                                      G_PARAM_READWRITE |
                                      G_PARAM_CONSTRUCT_ONLY);
         g_object_class_install_property (object_class, PROP_DLNA_NAME, pspec);
 
+        /**
+         * GUPnPDLNAProfile:mime:
+         *
+         * MIME type of the DLNA profile.
+         */
         pspec = g_param_spec_string ("mime",
                                      "DLNA profile MIME type",
                                      "The MIME type of the DLNA profile",
@@ -176,17 +217,11 @@ gupnp_dlna_profile_class_init (GUPnPDLNAProfileClass *klass)
                                      G_PARAM_CONSTRUCT_ONLY);
         g_object_class_install_property (object_class, PROP_DLNA_MIME, pspec);
 
-        pspec = gst_param_spec_mini_object ("encoding-profile",
-                                            "Encoding Profile for the "
-                                            "DLNA Profile",
-                                            "GstEncodingProfile object"
-                                            "corresponding to the DLNA profile",
-                                            GST_TYPE_ENCODING_PROFILE,
-                                            G_PARAM_READABLE);
-        g_object_class_install_property (object_class,
-                                         PROP_ENCODING_PROFILE,
-                                         pspec);
-
+        /**
+         * GUPnPDLNAProfile:extended:
+         *
+         * Whether the DLNA profile is not a part of DLNA specification.
+         */
         pspec = g_param_spec_boolean ("extended",
                                       "Extended mode property",
                                       "Indicates that this profile is not "
@@ -197,190 +232,188 @@ gupnp_dlna_profile_class_init (GUPnPDLNAProfileClass *klass)
         g_object_class_install_property (object_class,
                                          PROP_DLNA_EXTENDED,
                                          pspec);
+        pspec = g_param_spec_pointer ("audio-restrictions",
+                                      "Audio restrictions",
+                                      "Audio restrictions for the DLNA Profile",
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY);
+        g_object_class_install_property (object_class,
+                                         PROP_AUDIO_RESTRICTIONS,
+                                         pspec);
+        pspec = g_param_spec_pointer ("container-restrictions",
+                                      "Container restrictions",
+                                      "Container restrictions for the DLNA "
+                                      "Profile",
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY);
+        g_object_class_install_property (object_class,
+                                         PROP_CONTAINER_RESTRICTIONS,
+                                         pspec);
+        pspec = g_param_spec_pointer ("image-restrictions",
+                                      "Image restrictions",
+                                      "Image restrictions for the DLNA Profile",
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY);
+        g_object_class_install_property (object_class,
+                                         PROP_IMAGE_RESTRICTIONS,
+                                         pspec);
+        pspec = g_param_spec_pointer ("video-restrictions",
+                                      "Video restrictions",
+                                      "Video restrictions for the DLNA Profile",
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY);
+        g_object_class_install_property (object_class,
+                                         PROP_VIDEO_RESTRICTIONS,
+                                         pspec);
 
+        g_type_class_add_private (klass, sizeof (GUPnPDLNAProfilePrivate));
 }
 
 static void
-gupnp_dlna_profile_init (GUPnPDLNAProfile *self)
-{
-}
-
-const GstCaps *
-gupnp_dlna_profile_get_container_caps (GUPnPDLNAProfile *self)
-{
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
-        return priv->container_caps;
-}
-
-const GstCaps *
-gupnp_dlna_profile_get_video_caps (GUPnPDLNAProfile *self)
-{
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
-        return priv->video_caps;
-}
-
-const GstCaps *
-gupnp_dlna_profile_get_audio_caps (GUPnPDLNAProfile *self)
+gupnp_dlna_profile_init (GUPnPDLNAProfile *profile)
 {
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
-        return priv->audio_caps;
+        GUPnPDLNAProfilePrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (profile,
+                                                  GUPNP_TYPE_DLNA_PROFILE,
+                                                  GUPnPDLNAProfilePrivate);
+
+        priv->name = NULL;
+        priv->mime = NULL;
+        priv->extended = FALSE;
+        priv->audio_restrictions = NULL;
+        priv->container_restrictions = NULL;
+        priv->image_restrictions = NULL;
+        priv->video_restrictions = NULL;
+        profile->priv = priv;
 }
 
-void
-gupnp_dlna_profile_set_container_caps (GUPnPDLNAProfile *self, GstCaps *caps)
+/**
+ * gupnp_dlna_profile_get_name:
+ * @profile: The #GUPnPDLNAProfile object.
+ *
+ * Returns: The name of the DLNA profile represented by @profile.
+ */
+const gchar *
+gupnp_dlna_profile_get_name (GUPnPDLNAProfile *profile)
 {
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE (profile), NULL);
 
-        if (priv->container_caps)
-                gst_caps_unref (priv->container_caps);
-        priv->container_caps = gst_caps_copy (caps);
+        return profile->priv->name;
 }
 
-void
-gupnp_dlna_profile_set_video_caps (GUPnPDLNAProfile *self, GstCaps *caps)
+/**
+ * gupnp_dlna_profile_get_mime:
+ * @profile: The #GUPnPDLNAProfile object.
+ *
+ * Returns: The DLNA MIME type of the DLNA profile represented by @profile.
+ */
+const gchar *
+gupnp_dlna_profile_get_mime (GUPnPDLNAProfile *profile)
 {
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE (profile), NULL);
 
-        if (priv->video_caps)
-                gst_caps_unref (priv->video_caps);
-        priv->video_caps = gst_caps_copy (caps);
+        return profile->priv->mime;
 }
 
-void
-gupnp_dlna_profile_set_audio_caps (GUPnPDLNAProfile *self, GstCaps *caps)
+/**
+ * gupnp_dlna_profile_get_extended:
+ * @profile: The #GUPnPDLNAProfile object.
+ *
+ * Returns: %TRUE if @profile is extended one and %FALSE otherwise.
+ */
+gboolean
+gupnp_dlna_profile_get_extended (GUPnPDLNAProfile *profile)
 {
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE (profile), FALSE);
 
-        if (priv->audio_caps)
-                gst_caps_unref (priv->audio_caps);
-        priv->audio_caps = gst_caps_copy (caps);
+        return profile->priv->extended;
 }
 
-GUPnPDLNAProfile *
-gupnp_dlna_profile_new (gchar    *name,
-                        gchar    *mime,
-                        GstCaps  *container_caps,
-                        GstCaps  *video_caps,
-                        GstCaps  *audio_caps,
-                        gboolean extended)
+/**
+ * gupnp_dlna_profile_get_audio_restrictions:
+ * @profile: (transfer none): A profile.
+ *
+ * Gets a list of audio restrictions.
+ *
+ * Returns: (transfer none) (element-type GUPnPDLNARestriction): Audio
+ * restrictions. Do not modify.
+ */
+GList *
+gupnp_dlna_profile_get_audio_restrictions (GUPnPDLNAProfile *profile)
 {
-        GUPnPDLNAProfile *prof;
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE (profile), NULL);
 
-        prof =  g_object_new (GUPNP_TYPE_DLNA_PROFILE,
-                              "name", name,
-                              "mime", mime,
-                              "extended", extended,
-                              NULL);
-
-        gupnp_dlna_profile_set_container_caps (prof, container_caps);
-        gupnp_dlna_profile_set_video_caps (prof, video_caps);
-        gupnp_dlna_profile_set_audio_caps (prof, audio_caps);
-
-        return prof;
+        return profile->priv->audio_restrictions;
 }
 
 /**
- * gupnp_dlna_profile_get_name:
- * @self: The #GUPnPDLNAProfile object
+ * gupnp_dlna_profile_get_container_restrictions:
+ * @profile: (transfer none): A profile.
  *
- * Returns: the name of the DLNA profile represented by @self
+ * Gets a list of container restrictions.
+ *
+ * Returns: (transfer none) (element-type GUPnPDLNARestriction):
+ * Container restrictions. Do not modify.
  */
-const gchar *
-gupnp_dlna_profile_get_name (GUPnPDLNAProfile *self)
+GList *
+gupnp_dlna_profile_get_container_restrictions (GUPnPDLNAProfile *profile)
 {
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
-        return priv->name;
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE (profile), NULL);
+
+        return profile->priv->container_restrictions;
 }
 
 /**
- * gupnp_dlna_profile_get_mime:
- * @self: The #GUPnPDLNAProfile object
+ * gupnp_dlna_profile_get_image_restrictions:
+ * @profile: (transfer none): A profile.
+ *
+ * Gets a list of image restrictions.
  *
- * Returns: the DLNA MIME type of the DLNA profile represented by @self
+ * Returns: (transfer none) (element-type GUPnPDLNARestriction): Image
+ * restrictions. Do not modify.
  */
-const gchar *
-gupnp_dlna_profile_get_mime (GUPnPDLNAProfile *self)
+GList *
+gupnp_dlna_profile_get_image_restrictions (GUPnPDLNAProfile *profile)
 {
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
-        return priv->mime;
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE (profile), NULL);
+
+        return profile->priv->image_restrictions;
 }
 
 /**
- * gupnp_dlna_profile_get_encoding_profile:
- * @self: The #GUPnPDLNAProfile object
+ * gupnp_dlna_profile_get_video_restrictions:
+ * @profile: (transfer none): A profile.
  *
- * Returns: (transfer full): a #GstEncodingProfile object that, in a future
- *          version, can be used to transcode a given stream to match the DLNA
- *          profile represented by @self.
- *          The receiver must unref the returned #GstEncodingProfile when done
- *          using it.
+ * Gets a list of video restrictions.
+ *
+ * Returns: (transfer none) (element-type GUPnPDLNARestriction): Video
+ * restrictions. Do not modify.
  */
-GstEncodingProfile *
-gupnp_dlna_profile_get_encoding_profile (GUPnPDLNAProfile *self)
+GList *
+gupnp_dlna_profile_get_video_restrictions (GUPnPDLNAProfile *profile)
 {
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
-
-        /* create an encoding-profile if we don't have one */
-        if (!priv->enc_profile) {
-                GstEncodingContainerProfile *container = NULL;
-                GstEncodingAudioProfile *audio_profile = NULL;
-                GstEncodingVideoProfile *video_profile = NULL;
-
-                if (GST_IS_CAPS (priv->video_caps) &&
-                    !gst_caps_is_empty (priv->video_caps))
-                        video_profile = gst_encoding_video_profile_new
-                                        (priv->video_caps,NULL, NULL, 0);
-
-                if (GST_IS_CAPS (priv->audio_caps) &&
-                    !gst_caps_is_empty (priv->audio_caps))
-                        audio_profile = gst_encoding_audio_profile_new
-                                        (priv->audio_caps,NULL, NULL, 0);
-
-                if (GST_IS_CAPS (priv->container_caps)) {
-                        container = gst_encoding_container_profile_new
-                                        (priv->name,
-                                         priv->mime,
-                                         priv->container_caps,
-                                         NULL);
-
-                        if (video_profile)
-                                gst_encoding_container_profile_add_profile
-                                        (container,
-                                         (GstEncodingProfile *)video_profile);
-
-                        if (audio_profile)
-                                gst_encoding_container_profile_add_profile
-                                        (container,
-                                         (GstEncodingProfile *) audio_profile);
-
-                        priv->enc_profile = (GstEncodingProfile *)container;
-                } else {
-                        if(audio_profile)
-                                /* Container-less audio */
-                                priv->enc_profile =
-                                        (GstEncodingProfile *)audio_profile;
-
-                        if (video_profile)
-                                /* Container-less video isn't a possibility
-                                   yet */
-                                g_assert_not_reached ();
-                }
-        }
-
-        gst_encoding_profile_ref (priv->enc_profile);
+        g_return_val_if_fail (GUPNP_IS_DLNA_PROFILE (profile), NULL);
 
-        return priv->enc_profile;
+        return profile->priv->video_restrictions;
 }
 
-/**
- * gupnp_dlna_profile_get_extended:
- * @self: The #GUPnPDLNAProfile object
- *
- * Returns: true if application is using extended mode and false otherwise
- */
-gboolean
-gupnp_dlna_profile_get_extended (GUPnPDLNAProfile *self)
+GUPnPDLNAProfile *
+gupnp_dlna_profile_new (const gchar *name,
+                        const gchar *mime,
+                        GList       *audio_restrictions,
+                        GList       *container_restrictions,
+                        GList       *image_restrictions,
+                        GList       *video_restrictions,
+                        gboolean     extended)
 {
-        GUPnPDLNAProfilePrivate *priv = GET_PRIVATE (self);
-        return priv->extended;
+        return GUPNP_DLNA_PROFILE
+                             (g_object_new
+                              (GUPNP_TYPE_DLNA_PROFILE,
+                               "name", name,
+                               "mime", mime,
+                               "audio-restrictions", audio_restrictions,
+                               "container-restrictions", container_restrictions,
+                               "image-restrictions", image_restrictions,
+                               "video-restrictions", video_restrictions,
+                               "extended", extended,
+                               NULL));
 }
index 4708a39..7f400ed 100644 (file)
@@ -1,7 +1,9 @@
 /*
  * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
  *
  * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 #ifndef __GUPNP_DLNA_PROFILE_H__
 #define __GUPNP_DLNA_PROFILE_H__
 
-#include <gst/pbutils/pbutils.h>
 #include <glib-object.h>
+#include <libgupnp-dlna/gupnp-dlna-restriction.h>
 
 G_BEGIN_DECLS
 
 #define GUPNP_TYPE_DLNA_PROFILE gupnp_dlna_profile_get_type()
 
-#define GUPNP_DLNA_PROFILE(obj)                               \
-        (G_TYPE_CHECK_INSTANCE_CAST ((obj),                   \
+#define GUPNP_DLNA_PROFILE(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
                                      GUPNP_TYPE_DLNA_PROFILE, \
                                      GUPnPDLNAProfile))
 
-#define GUPNP_DLNA_PROFILE_CLASS(klass)                    \
-        (G_TYPE_CHECK_CLASS_CAST ((klass),                 \
+#define GUPNP_DLNA_PROFILE_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
                                   GUPNP_TYPE_DLNA_PROFILE, \
                                   GUPnPDLNAProfileClass))
 
-#define GUPNP_IS_DLNA_PROFILE(obj)                                   \
-        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GUPNP_TYPE_DLNA_PROFILE))
+#define GUPNP_IS_DLNA_PROFILE(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_PROFILE))
 
-#define GUPNP_IS_DLNA_PROFILE_CLASS(klass)                           \
-        (G_TYPE_CHECK_CLASS_TYPE ((klass), GUPNP_TYPE_DLNA_PROFILE))
+#define GUPNP_IS_DLNA_PROFILE_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_PROFILE))
 
-#define GUPNP_DLNA_PROFILE_GET_CLASS(obj)                    \
-        (G_TYPE_INSTANCE_GET_CLASS ((obj),                   \
+#define GUPNP_DLNA_PROFILE_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
                                     GUPNP_TYPE_DLNA_PROFILE, \
                                     GUPnPDLNAProfileClass))
 
+typedef struct _GUPnPDLNAProfilePrivate GUPnPDLNAProfilePrivate;
+
 /**
  * GUPnPDLNAProfile:
  *
- * The top-level object used for the in-memory representation of the DLNA
- * Profiles.
+ * The top-level object used for the in-memory representation of the
+ * DLNA Profiles.
  */
 typedef struct {
         GObject parent;
+
+        GUPnPDLNAProfilePrivate *priv;
 } GUPnPDLNAProfile;
 
+/**
+ * GUPnPDLNAProfileClass:
+ * @parent_class: A #GObjectClass - parent of this class.
+ */
 typedef struct {
         GObjectClass parent_class;
 } GUPnPDLNAProfileClass;
 
-GType gupnp_dlna_profile_get_type (void);
+GType
+gupnp_dlna_profile_get_type (void);
+
+const gchar *
+gupnp_dlna_profile_get_name (GUPnPDLNAProfile *profile);
+
+const gchar *
+gupnp_dlna_profile_get_mime (GUPnPDLNAProfile *profile);
+
+gboolean
+gupnp_dlna_profile_get_extended (GUPnPDLNAProfile *profile);
+
+GList *
+gupnp_dlna_profile_get_container_restrictions (GUPnPDLNAProfile *profile);
+
+GList *
+gupnp_dlna_profile_get_audio_restrictions (GUPnPDLNAProfile *profile);
+
+GList *
+gupnp_dlna_profile_get_image_restrictions (GUPnPDLNAProfile *profile);
 
-const gchar * gupnp_dlna_profile_get_name (GUPnPDLNAProfile *self);
-const gchar * gupnp_dlna_profile_get_mime (GUPnPDLNAProfile *self);
-GstEncodingProfile *
-gupnp_dlna_profile_get_encoding_profile (GUPnPDLNAProfile *self);
-gboolean gupnp_dlna_profile_get_extended (GUPnPDLNAProfile *self);
+GList *
+gupnp_dlna_profile_get_video_restrictions (GUPnPDLNAProfile *profile);
 
 G_END_DECLS
 
diff --git a/libgupnp-dlna/gupnp-dlna-profiles.c b/libgupnp-dlna/gupnp-dlna-profiles.c
deleted file mode 100644 (file)
index 4207b58..0000000
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Copyright (C) 2010 Nokia Corporation.
- *
- * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <glib.h>
-#include <gst/pbutils/pbutils.h>
-#include "gupnp-dlna-discoverer.h"
-#include "gupnp-dlna-profile.h"
-
-/*
- * This file provides the infrastructure to load DLNA profiles and the
- * corresponding restrictions from an on-disk representation, and use them to
- * map a given stream to its DLNA profile, if possible.
- *
- * Each DLNA profile is represented as a GstEncodingProfile (there might be
- * exceptions where a single DLNA profile is represented by multiple
- * GstEncodingProfiles - right now that's only LPCM).
- *
- * For a GstEncodingProfile "profile", the following fields will be populated:
- *
- *   profile.name = "<DLNA Profile Name>"
- *   profile.format = Muxing format caps (with restrictions) if specified,
- *                    else GST_CAPS_NONE
- *   profile.encodingprofiles = GList of GstStreamEncodingProfiles
- *
- * For each stream of the given profile, "profile.encodingprofiles" will have
- * a GstEncodingProfile representing the restrictions for that stream (for a
- * video format there will be one audio and one video stream, for example).
- *
- *   enc_profile.type = GST_ENCODING_PROFILE_{AUDIO,VIDEO,...} (UNKNOWN for
- *                      container restrictions)
- *   enc_profile.format = GstCaps with all the restrictions for this format
- *   enc_profile.restriction = GST_CAPS_ANY
- *
- * We assume that all DLNA profiles have exactly one audio stream, or one audio
- * stream and one video stream.
- *
- * Things yet to account for:
- *
- *   1. Multiple audio/video streams (we need to pick the "main" one - how?
- *      Possibly get information from the demuxer.)
- *
- *   2. How do we handle discovered metadata which is in tags, but not in caps?
- *      Could potentially move it to caps in a post-discovery, pre-guessing
- *      phase
- */
-
-/* New profile guessing API */
-
-#define GUPNP_DLNA_DEBUG_ENV "GUPNP_DLNA_DEBUG"
-
-#define gupnp_dlna_debug(args...)                               \
-do {                                                            \
-        const gchar *_e = g_getenv (GUPNP_DLNA_DEBUG_ENV);      \
-        if (_e && !g_str_equal (_e, "0"))                       \
-                g_debug (args);                                 \
-} while (0)
-
-static gboolean
-is_video_profile (const GstEncodingProfile *profile)
-{
-        const GList *i, *profiles_list;
-
-        if (GST_IS_ENCODING_CONTAINER_PROFILE (profile)) {
-                profiles_list = gst_encoding_container_profile_get_profiles
-                                     (GST_ENCODING_CONTAINER_PROFILE (profile));
-
-                for (i = profiles_list ; i; i = i->next)
-                        if (GST_IS_ENCODING_VIDEO_PROFILE (i->data))
-                                return TRUE;
-        }
-
-        return FALSE;
-}
-
-static gboolean
-structure_can_intersect (const GstStructure *st1, const GstStructure *st2)
-{
-        /* Since there is no API to intersect GstStructures, we cheat (thanks
-         * for the idea, tpm!) and make caps from the structuresa */
-
-        GstCaps *caps1, *caps2;
-        gboolean ret;
-
-        caps1 = gst_caps_new_full (gst_structure_copy (st1), NULL);
-        caps2 = gst_caps_new_full (gst_structure_copy (st2), NULL);
-
-        ret = gst_caps_can_intersect (caps1, caps2);
-
-        gst_caps_unref (caps1);
-        gst_caps_unref (caps2);
-
-        return ret;
-}
-
-static gboolean
-structure_is_subset (const GstStructure *st1, const GstStructure *st2)
-{
-        int i;
-
-        for (i = 0; i < gst_structure_n_fields (st2); i++) {
-                const gchar *name = gst_structure_nth_field_name (st2, i);
-
-                if (!gst_structure_has_field(st1, name)) {
-                        gupnp_dlna_debug ("    missing field %s", name);
-                        return FALSE;
-                }
-        }
-
-        return TRUE;
-}
-
-/*
- * Returns TRUE if stream_caps and profile_caps can intersect, and the
- * intersecting structure from profile_caps is a subset of stream_caps. Put
- * simply, the condition being met is that stream_caps intersects with
- * profile_caps, and that intersection includes *all* fields specified by
- * profile_caps (viz. all the fields specified by the DLNA profile's
- * restrictions)
- */
-static gboolean
-caps_can_intersect_and_is_subset (GstCaps       *stream_caps,
-                                  const GstCaps *profile_caps)
-{
-        int i;
-        GstStructure *stream_st, *profile_st;
-
-        stream_st = gst_caps_get_structure (stream_caps, 0);
-
-        for (i = 0; i < gst_caps_get_size (profile_caps); i++) {
-                profile_st = gst_caps_get_structure (profile_caps, i);
-
-                if (structure_can_intersect (stream_st, profile_st) &&
-                    structure_is_subset (stream_st, profile_st))
-                        return TRUE;
-        }
-
-        return FALSE;
-}
-
-static gboolean
-match_profile (GstEncodingProfile *profile,
-               GstCaps            *caps,
-               GType              type)
-{
-        const GList *i, *profiles_list;
-        const gchar *name;
-
-        /* Profiles with an empty name are used only for inheritance and should
-         * not be matched against. */
-        name = gst_encoding_profile_get_name (profile);
-        if (name[0] == '\0')
-                return FALSE;
-
-        profiles_list = gst_encoding_container_profile_get_profiles
-                                     (GST_ENCODING_CONTAINER_PROFILE (profile));
-
-        for (i = profiles_list; i; i = i->next){
-                GstEncodingProfile *enc_profile = GST_ENCODING_PROFILE
-                                        (i->data);
-                const GstCaps *format = gst_encoding_profile_get_format
-                                        (enc_profile);
-
-                if (type == G_TYPE_FROM_INSTANCE (enc_profile) &&
-                    caps_can_intersect_and_is_subset (caps, format))
-                        return TRUE;
-        }
-
-        return FALSE;
-}
-
-static gboolean
-check_container (GstDiscovererInfo  *info,
-                 GstEncodingProfile *profile)
-{
-        GstDiscovererStreamInfo *stream_info;
-        GType stream_type;
-        GstCaps *stream_caps;
-        gboolean ret = FALSE;
-
-        const GstCaps *profile_caps = gst_encoding_profile_get_format (profile);
-
-        /* Top-level GstStreamInformation in the topology will be
-         * the container */
-        stream_info = gst_discoverer_info_get_stream_info (info);
-        stream_caps = gst_discoverer_stream_info_get_caps (stream_info);
-        stream_type = G_TYPE_FROM_INSTANCE (stream_info);
-
-        if (stream_type == GST_TYPE_DISCOVERER_CONTAINER_INFO &&
-            gst_caps_can_intersect (stream_caps, profile_caps))
-                ret = TRUE;
-        else if (stream_type != GST_TYPE_DISCOVERER_CONTAINER_INFO &&
-                 gst_caps_is_empty (profile_caps))
-                ret = TRUE;
-
-        gst_discoverer_stream_info_unref (stream_info);
-        gst_caps_unref (stream_caps);
-
-        return ret;
-}
-
-static GstCaps *
-caps_from_audio_stream_info (GstDiscovererStreamInfo *info)
-{
-        GstCaps *temp = gst_discoverer_stream_info_get_caps (info);
-        GstCaps *caps = gst_caps_copy (temp);
-        const GstDiscovererAudioInfo *audio_info =
-                GST_DISCOVERER_AUDIO_INFO(info);
-        guint data;
-
-        gst_caps_unref (temp);
-
-        data = gst_discoverer_audio_info_get_sample_rate (audio_info);
-        if (data)
-                gst_caps_set_simple (caps, "rate", G_TYPE_INT, data, NULL);
-
-        data = gst_discoverer_audio_info_get_channels (audio_info);
-        if (data)
-                gst_caps_set_simple (caps, "channels", G_TYPE_INT, data, NULL);
-
-        data = gst_discoverer_audio_info_get_bitrate (audio_info);
-        if (data)
-                gst_caps_set_simple (caps, "bitrate", G_TYPE_INT, data, NULL);
-
-        data = gst_discoverer_audio_info_get_max_bitrate (audio_info);
-        if (data)
-                gst_caps_set_simple
-                        (caps, "maximum-bitrate", G_TYPE_INT, data, NULL);
-
-        data = gst_discoverer_audio_info_get_depth (audio_info);
-        if (data)
-                gst_caps_set_simple (caps, "depth", G_TYPE_INT, data, NULL);
-
-        return caps;
-}
-
-static gboolean
-check_audio_profile (GstDiscovererInfo  *info,
-                     GstEncodingProfile *profile)
-{
-        GstCaps *caps;
-        GList *i, *stream_list;
-        gboolean found = FALSE;
-
-        /* Optimisation TODO: this can be pre-computed */
-        if (is_video_profile (profile))
-                return FALSE;
-
-        stream_list = gst_discoverer_info_get_stream_list (info);
-
-        for (i = stream_list; !found && i; i = i->next) {
-                GstDiscovererStreamInfo *stream =
-                        GST_DISCOVERER_STREAM_INFO(i->data);
-                GType stream_type = G_TYPE_FROM_INSTANCE (stream);
-
-                if (stream_type != GST_TYPE_DISCOVERER_AUDIO_INFO)
-                        continue;
-
-                caps = caps_from_audio_stream_info (stream);
-
-                if (match_profile (profile,
-                                   caps,
-                                   GST_TYPE_ENCODING_AUDIO_PROFILE)) {
-                        found = TRUE;
-                        break;
-                }
-
-                gst_caps_unref (caps);
-        }
-
-        gst_discoverer_stream_info_list_free (stream_list);
-
-        return found;
-}
-
-static void
-guess_audio_profile (GstDiscovererInfo *info,
-                     gchar             **name,
-                     gchar             **mime,
-                     GList             *profiles)
-{
-        GList *i;
-        GUPnPDLNAProfile *profile;
-        GstEncodingProfile *enc_profile;
-
-        for (i = profiles; i; i = i->next) {
-                profile = (GUPnPDLNAProfile *)(i->data);
-                enc_profile = gupnp_dlna_profile_get_encoding_profile (profile);
-
-                gupnp_dlna_debug ("Checking DLNA profile %s",
-                                  gupnp_dlna_profile_get_name (profile));
-
-                if (!check_audio_profile (info, enc_profile))
-                        gupnp_dlna_debug ("  Audio did not match");
-                else if (!check_container (info, enc_profile))
-                        gupnp_dlna_debug ("  Container did not match");
-                else {
-                        *name = g_strdup
-                                (gupnp_dlna_profile_get_name (profile));
-                        *mime = g_strdup
-                                (gupnp_dlna_profile_get_mime (profile));
-                        break;
-                }
-        }
-}
-
-static GstCaps *
-caps_from_video_stream_info (GstDiscovererStreamInfo *info)
-{
-        GstCaps *temp = gst_discoverer_stream_info_get_caps (info);
-        GstCaps *caps = gst_caps_copy (temp);
-        const GstDiscovererVideoInfo *video_info =
-                GST_DISCOVERER_VIDEO_INFO (info);
-        const GstTagList *stream_tag_list;
-        guint n, d, data;
-        gboolean value;
-
-        gst_caps_unref (temp);
-
-        data = gst_discoverer_video_info_get_height (video_info);
-        if (data)
-                gst_caps_set_simple (caps, "height", G_TYPE_INT, data, NULL);
-
-        data = gst_discoverer_video_info_get_width (video_info);
-        if (data)
-                gst_caps_set_simple (caps, "width", G_TYPE_INT, data, NULL);
-
-        data = gst_discoverer_video_info_get_depth (video_info);
-        if (data)
-                gst_caps_set_simple (caps, "depth", G_TYPE_INT, data, NULL);
-
-        n = gst_discoverer_video_info_get_framerate_num (video_info);
-        d = gst_discoverer_video_info_get_framerate_denom (video_info);
-        if (n && d)
-                gst_caps_set_simple (caps,
-                                     "framerate",
-                                     GST_TYPE_FRACTION, n, d,
-                                     NULL);
-
-        n = gst_discoverer_video_info_get_par_num (video_info);
-        d = gst_discoverer_video_info_get_par_denom (video_info);
-        if (n && d)
-                gst_caps_set_simple (caps,
-                                     "pixel-aspect-ratio",
-                                     GST_TYPE_FRACTION, n, d,
-                                     NULL);
-
-        value = gst_discoverer_video_info_is_interlaced (video_info);
-        if (value)
-                gst_caps_set_simple
-                        (caps, "interlaced", G_TYPE_BOOLEAN, value, NULL);
-
-        stream_tag_list = gst_discoverer_stream_info_get_tags (info);
-        if (stream_tag_list) {
-                guint bitrate;
-                if (gst_tag_list_get_uint (stream_tag_list, "bitrate", &bitrate))
-                        gst_caps_set_simple
-                             (caps, "bitrate", G_TYPE_INT, (int) bitrate, NULL);
-
-                if (gst_tag_list_get_uint (stream_tag_list,
-                                           "maximum-bitrate",
-                                           &bitrate))
-                        gst_caps_set_simple (caps,
-                                             "maximum-bitrate",
-                                             G_TYPE_INT,
-                                             (int) bitrate,
-                                             NULL);
-        }
-
-        return caps;
-}
-
-static gboolean
-check_video_profile (GstDiscovererInfo  *info,
-                     GstEncodingProfile *profile)
-{
-        GList *i, *stream_list;
-        gboolean found_video = FALSE, found_audio = FALSE;;
-
-        stream_list = gst_discoverer_info_get_stream_list (info);
-
-        /* Check video and audio restrictions */
-        for (i = stream_list;
-             i && !(found_video && found_audio);
-             i = i->next) {
-                GstDiscovererStreamInfo *stream;
-                GType stream_type;
-                GstCaps *caps = NULL;
-
-                stream = GST_DISCOVERER_STREAM_INFO(i->data);
-                stream_type = G_TYPE_FROM_INSTANCE (stream);
-
-                if (!found_video &&
-                    stream_type == GST_TYPE_DISCOVERER_VIDEO_INFO) {
-                        caps = caps_from_video_stream_info (stream);
-                        if (match_profile (profile,
-                                           caps,
-                                           GST_TYPE_ENCODING_VIDEO_PROFILE))
-                                found_video = TRUE;
-                        else
-                                gupnp_dlna_debug ("  Video did not match");
-                } else if (!found_audio &&
-                           stream_type == GST_TYPE_DISCOVERER_AUDIO_INFO) {
-                        caps = caps_from_audio_stream_info (stream);
-                        if (match_profile (profile,
-                                           caps,
-                                           GST_TYPE_ENCODING_AUDIO_PROFILE))
-                                found_audio = TRUE;
-                        else
-                                gupnp_dlna_debug ("  Audio did not match");
-                }
-
-                if (caps)
-                        gst_caps_unref (caps);
-        }
-
-        gst_discoverer_stream_info_list_free (stream_list);
-
-        if (!found_video || !found_audio)
-                return FALSE;
-
-        /* Check container restrictions */
-        if (!check_container (info, profile)) {
-                gupnp_dlna_debug ("  Container did not match");
-                return FALSE;
-        }
-
-        return TRUE;
-}
-
-static void
-guess_video_profile (GstDiscovererInfo *info,
-                     gchar             **name,
-                     gchar             **mime,
-                     GList             *profiles)
-{
-        GUPnPDLNAProfile *profile = NULL;
-        GstEncodingProfile *enc_profile;
-        GList *i;
-
-        for (i = profiles; i; i = i->next) {
-                profile = (GUPnPDLNAProfile *)(i->data);
-                enc_profile = gupnp_dlna_profile_get_encoding_profile (profile);
-
-                gupnp_dlna_debug ("Checking DLNA profile %s",
-                                  gupnp_dlna_profile_get_name (profile));
-                if (check_video_profile (info, enc_profile)) {
-                        *name = g_strdup (gupnp_dlna_profile_get_name (profile));
-                        *mime = g_strdup (gupnp_dlna_profile_get_mime (profile));
-                        break;
-                }
-        }
-}
-
-static void
-guess_image_profile (GstDiscovererStreamInfo *info,
-                     gchar                   **name,
-                     gchar                   **mime,
-                     GList                   *profiles)
-{
-        GstCaps *caps;
-        GList *i;
-        gboolean found = FALSE;
-        GUPnPDLNAProfile *profile;
-        GstEncodingProfile *enc_profile;
-        const GstDiscovererVideoInfo *video_info =
-                GST_DISCOVERER_VIDEO_INFO (info);
-
-        if (!info || !gst_discoverer_video_info_is_image (video_info))
-                return;
-
-        caps = caps_from_video_stream_info (info);
-
-        for (i = profiles; !found && i; i = i->next) {
-                profile = (GUPnPDLNAProfile *)(i->data);
-                enc_profile = gupnp_dlna_profile_get_encoding_profile (profile);
-
-                /* Optimisation TODO: this can be pre-computed */
-                if (!is_video_profile (enc_profile))
-                        continue;
-
-                if (match_profile (enc_profile,
-                                   caps,
-                                   GST_TYPE_ENCODING_VIDEO_PROFILE)) {
-                        /* Found a match */
-                        *name = g_strdup (gupnp_dlna_profile_get_name (profile));
-                        *mime = g_strdup (gupnp_dlna_profile_get_mime (profile));
-                        break;
-                }
-        }
-
-        gst_caps_unref (caps);
-}
-
-GUPnPDLNAInformation *
-gupnp_dlna_information_new_from_discoverer_info (GstDiscovererInfo *info,
-                                                 GList             *profiles)
-{
-        GUPnPDLNAInformation *dlna;
-        GList *video_list, *audio_list;
-        gchar *name = NULL, *mime = NULL;
-
-        video_list = gst_discoverer_info_get_video_streams (info);
-        audio_list = gst_discoverer_info_get_audio_streams (info);
-        if (video_list) {
-                if ((g_list_length (video_list) ==1 ) &&
-                    gst_discoverer_video_info_is_image
-                                        (GST_DISCOVERER_VIDEO_INFO
-                                                  (video_list->data))) {
-                        GstDiscovererStreamInfo *stream;
-                        stream = (GstDiscovererStreamInfo *) video_list->data;
-                        guess_image_profile (stream, &name, &mime, profiles);
-                } else
-                        guess_video_profile (info, &name, &mime, profiles);
-        } else if (audio_list)
-                guess_audio_profile (info, &name, &mime, profiles);
-
-        gst_discoverer_stream_info_list_free (audio_list);
-        gst_discoverer_stream_info_list_free (video_list);
-
-        dlna = gupnp_dlna_information_new (name, mime, info);
-
-
-        g_free (name);
-        g_free (mime);
-
-        return dlna;
-}
diff --git a/libgupnp-dlna/gupnp-dlna-restriction-private.h b/libgupnp-dlna/gupnp-dlna-restriction-private.h
new file mode 100644 (file)
index 0000000..30886db
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_RESTRICTION_PRIVATE_H__
+#define __GUPNP_DLNA_RESTRICTION_PRIVATE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include "gupnp-dlna-restriction.h"
+#include "gupnp-dlna-value-list.h"
+
+G_BEGIN_DECLS
+
+GUPnPDLNARestriction *
+gupnp_dlna_restriction_new (const gchar *mime);
+
+gboolean
+gupnp_dlna_restriction_add_value_list (GUPnPDLNARestriction *restriction,
+                                       const gchar          *name,
+                                       GUPnPDLNAValueList   *list);
+
+void
+gupnp_dlna_restriction_merge (GUPnPDLNARestriction *restriction,
+                              GUPnPDLNARestriction *merged);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_RESTRICTION_PRIVATE_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-restriction.c b/libgupnp-dlna/gupnp-dlna-restriction.c
new file mode 100644 (file)
index 0000000..5f67488
--- /dev/null
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <glib.h>
+
+#include "gupnp-dlna-restriction-private.h"
+#include "gupnp-dlna-value-list-private.h"
+
+struct _GUPnPDLNARestriction {
+        gchar *mime;
+        GHashTable *entries; /* <gchar *, GUPnPDLNAValueList *> */
+};
+
+G_DEFINE_BOXED_TYPE (GUPnPDLNARestriction,
+                     gupnp_dlna_restriction,
+                     gupnp_dlna_restriction_copy,
+                     gupnp_dlna_restriction_free)
+
+GUPnPDLNARestriction *
+gupnp_dlna_restriction_new (const gchar *mime)
+{
+        GUPnPDLNARestriction *restriction = g_slice_new (GUPnPDLNARestriction);
+
+        restriction->mime = g_strdup (mime);
+        restriction->entries = g_hash_table_new_full
+                           (g_str_hash,
+                            g_str_equal,
+                            g_free,
+                            (GDestroyNotify) gupnp_dlna_value_list_free);
+
+        return restriction;
+}
+
+/**
+ * gupnp_dlna_restriction_copy:
+ * @restriction: (transfer none): A restriction to copy.
+ *
+ * Returns: (transfer full): A copy of @restriction.
+ */
+GUPnPDLNARestriction *
+gupnp_dlna_restriction_copy (GUPnPDLNARestriction *restriction)
+{
+        GUPnPDLNARestriction *dup;
+        GHashTableIter iter;
+        gpointer key;
+        gpointer value;
+
+        g_return_val_if_fail (restriction != NULL, NULL);
+
+        dup = gupnp_dlna_restriction_new (restriction->mime);
+        g_hash_table_iter_init (&iter, restriction->entries);
+        while (g_hash_table_iter_next (&iter, &key, &value)) {
+                GUPnPDLNAValueList *dup_entry;
+
+                if (key == NULL || value == NULL)
+                        continue;
+                dup_entry = gupnp_dlna_value_list_copy (value);
+
+                if (dup_entry == NULL)
+                        continue;
+                g_hash_table_insert (dup->entries, g_strdup (key), dup_entry);
+        }
+
+        return dup;
+}
+
+/**
+ * gupnp_dlna_restriction_free:
+ * @restriction: A restriction to free.
+ *
+ * Frees @restriction.
+ */
+void
+gupnp_dlna_restriction_free (GUPnPDLNARestriction *restriction)
+{
+        if (restriction == NULL)
+                return;
+        g_free (restriction->mime);
+        g_hash_table_unref (restriction->entries);
+        g_slice_free (GUPnPDLNARestriction, restriction);
+}
+
+gboolean
+gupnp_dlna_restriction_add_value_list (GUPnPDLNARestriction *restriction,
+                                       const gchar          *name,
+                                       GUPnPDLNAValueList   *list)
+{
+        g_return_val_if_fail (restriction != NULL, FALSE);
+        g_return_val_if_fail (name != NULL, FALSE);
+        g_return_val_if_fail (list != NULL, FALSE);
+
+        if (gupnp_dlna_value_list_is_empty (list))
+                return FALSE;
+        if (g_hash_table_contains (restriction->entries, name))
+                return FALSE;
+        gupnp_dlna_value_list_sort_items (list);
+        g_hash_table_insert (restriction->entries, g_strdup (name), list);
+
+        return TRUE;
+}
+
+void
+gupnp_dlna_restriction_merge (GUPnPDLNARestriction *restriction,
+                              GUPnPDLNARestriction *merged)
+{
+        GHashTableIter iter;
+        gpointer name_ptr;
+        gpointer value_list_ptr;
+
+        g_return_if_fail (restriction != NULL);
+        g_return_if_fail (merged != NULL);
+
+        if (restriction->mime == NULL) {
+                restriction->mime = merged->mime;
+                merged->mime = NULL;
+        }
+
+        g_hash_table_iter_init (&iter, merged->entries);
+        while (g_hash_table_iter_next (&iter,
+                                       &name_ptr,
+                                       &value_list_ptr)) {
+                if (!g_hash_table_contains (restriction->entries, name_ptr)) {
+                        g_hash_table_iter_steal (&iter);
+                        g_hash_table_insert (restriction->entries,
+                                             name_ptr,
+                                             value_list_ptr);
+                }
+        }
+        gupnp_dlna_restriction_free (merged);
+}
+
+/**
+ * gupnp_dlna_restriction_is_empty:
+ * @restriction: (transfer none): A restriction.
+ *
+ * Returns: %TRUE if @restriction is empty and has no MIME type,
+ * otherwise %FALSE.
+ */
+gboolean
+gupnp_dlna_restriction_is_empty (GUPnPDLNARestriction *restriction)
+{
+        g_return_val_if_fail (restriction != NULL, TRUE);
+
+        return (restriction->mime == NULL &&
+                g_hash_table_size (restriction->entries) == 0);
+}
+
+/**
+ * gupnp_dlna_restriction_to_string:
+ * @restriction: (transfer none): A restriction.
+ *
+ * Creates a string representation of @restriction.
+ *
+ * Returns: (transfer full): A string representation of
+ * @restriction. Free with g_free() when not needed.
+ */
+gchar *
+gupnp_dlna_restriction_to_string (GUPnPDLNARestriction *restriction)
+{
+        GString *str;
+        GHashTableIter iter;
+        gpointer key;
+        gpointer value;
+
+        g_return_val_if_fail (restriction != NULL, NULL);
+
+        if (gupnp_dlna_restriction_is_empty (restriction))
+                return g_strdup ("EMPTY");
+
+        str = g_string_new (restriction->mime ? restriction->mime : "(null)");
+        g_hash_table_iter_init (&iter, restriction->entries);
+        while (g_hash_table_iter_next (&iter, &key, &value)) {
+                gchar *raw = gupnp_dlna_value_list_to_string (value);
+
+                g_string_append_printf (str, ", %s=%s", (gchar *) key, raw);
+                g_free (raw);
+        }
+
+        return g_string_free (str, FALSE);
+}
+
+/**
+ * gupnp_dlna_restriction_get_mime:
+ * @restriction: (transfer none): A restriction.
+ *
+ * Gets @restriction's MIME type.
+ *
+ * Returns: (transfer none): MIME type. Do not modify.
+ */
+const gchar *
+gupnp_dlna_restriction_get_mime (GUPnPDLNARestriction *restriction)
+{
+        g_return_val_if_fail (restriction != NULL, NULL);
+
+        return restriction->mime;
+}
+
+/**
+ * gupnp_dlna_restriction_get_entries:
+ * @restriction: (transfer none): A restriction.
+ *
+ * Gets @restriction's entries. It is a string to #GUPnPDLNAValueList
+ * mapping.
+ *
+ * Returns: (transfer none) (element-type utf8 GUPnPDLNAValueList):
+ * Entries. Do not modify.
+ */
+GHashTable *
+gupnp_dlna_restriction_get_entries (GUPnPDLNARestriction *restriction)
+{
+        g_return_val_if_fail (restriction != NULL, NULL);
+
+        return restriction->entries;
+}
diff --git a/libgupnp-dlna/gupnp-dlna-restriction.h b/libgupnp-dlna/gupnp-dlna-restriction.h
new file mode 100644 (file)
index 0000000..ee3abcd
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_RESTRICTION_H__
+#define __GUPNP_DLNA_RESTRICTION_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <libgupnp-dlna/gupnp-dlna-value-list.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GUPnPDLNARestriction GUPnPDLNARestriction;
+
+#define GUPNP_DLNA_RESTRICTION(x) \
+        ((GUPnPDLNARestriction *) x)
+
+/**
+ * GUPNP_TYPE_DLNA_RESTRICTION:
+ *
+ * The #GType for #GUPnPDLNARestriction.
+ */
+#define GUPNP_TYPE_DLNA_RESTRICTION (gupnp_dlna_restriction_get_type ())
+
+GType
+gupnp_dlna_restriction_get_type (void) G_GNUC_CONST;
+
+GUPnPDLNARestriction *
+gupnp_dlna_restriction_copy (GUPnPDLNARestriction *restriction);
+
+void
+gupnp_dlna_restriction_free (GUPnPDLNARestriction *restriction);
+
+gboolean
+gupnp_dlna_restriction_is_empty (GUPnPDLNARestriction *restriction);
+
+gchar *
+gupnp_dlna_restriction_to_string (GUPnPDLNARestriction *restriction);
+
+const gchar *
+gupnp_dlna_restriction_get_mime (GUPnPDLNARestriction *restriction);
+
+GHashTable *
+gupnp_dlna_restriction_get_entries (GUPnPDLNARestriction *restriction);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_RESTRICTION_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-utils.c b/libgupnp-dlna/gupnp-dlna-utils.c
new file mode 100644 (file)
index 0000000..26f7c0f
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-utils.h"
+#include "gupnp-dlna-restriction.h"
+
+void
+gupnp_dlna_utils_free_restrictions (GList *list)
+{
+        if (list == NULL)
+                return;
+        g_list_free_full (list, (GDestroyNotify) gupnp_dlna_restriction_free);
+}
+
+gchar *
+gupnp_dlna_utils_restrictions_list_to_string (GList *list)
+{
+        GList *iter;
+        GPtrArray *strings = g_ptr_array_new_with_free_func (g_free);
+        gchar *final_string;
+
+        for (iter = list; iter != NULL; iter = iter->next) {
+                GUPnPDLNARestriction *restriction =
+                                        GUPNP_DLNA_RESTRICTION (iter->data);
+
+                if (restriction)
+                        g_ptr_array_add (strings,
+                                         gupnp_dlna_restriction_to_string
+                                                            (restriction));
+        }
+
+        if (strings->len) {
+                g_ptr_array_add (strings, NULL);
+                final_string = g_strjoinv ("; ", (gchar **) strings->pdata);
+        }
+        else
+                final_string = g_strdup ("EMPTY");
+        g_ptr_array_unref (strings);
+
+        return final_string;
+}
diff --git a/libgupnp-dlna/gupnp-dlna-utils.h b/libgupnp-dlna/gupnp-dlna-utils.h
new file mode 100644 (file)
index 0000000..899ced1
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_UTILS_H__
+#define __GUPNP_DLNA_UTILS_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+void
+gupnp_dlna_utils_free_restrictions (GList *list);
+
+gchar *
+gupnp_dlna_utils_restrictions_list_to_string (GList *list);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_UTILS_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-value-list-private.h b/libgupnp-dlna/gupnp-dlna-value-list-private.h
new file mode 100644 (file)
index 0000000..cd268aa
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_VALUE_LIST_PRIVATE_H__
+#define __GUPNP_DLNA_VALUE_LIST_PRIVATE_H__
+
+#include <glib.h>
+
+#include "gupnp-dlna-info-value.h"
+#include "gupnp-dlna-value-list.h"
+#include "gupnp-dlna-value-type.h"
+
+G_BEGIN_DECLS
+
+GUPnPDLNAValueList *
+gupnp_dlna_value_list_new (GUPnPDLNAValueType *type);
+
+void
+gupnp_dlna_value_list_free (GUPnPDLNAValueList *list);
+
+gboolean
+gupnp_dlna_value_list_add_range (GUPnPDLNAValueList *list,
+                                 const gchar        *min,
+                                 const gchar        *max);
+
+gboolean
+gupnp_dlna_value_list_add_single (GUPnPDLNAValueList *list,
+                                  const gchar        *single);
+
+gboolean
+gupnp_dlna_value_list_is_superset (GUPnPDLNAValueList *list,
+                                   GUPnPDLNAInfoValue *value,
+                                   gboolean           *unsupported);
+
+GList *
+gupnp_dlna_value_list_get_list (GUPnPDLNAValueList *value_list);
+
+void
+gupnp_dlna_value_list_sort_items (GUPnPDLNAValueList *value_list);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_VALUE_LIST_PRIVATE_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-value-list.c b/libgupnp-dlna/gupnp-dlna-value-list.c
new file mode 100644 (file)
index 0000000..0582978
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-value-list-private.h"
+#include "gupnp-dlna-value.h"
+#include "gupnp-dlna-info-value.h"
+
+struct _GUPnPDLNAValueList {
+        GUPnPDLNAValueType *type;
+        GList              *values; /* <GUPnPDLNAValue *> */
+        gboolean            sorted;
+};
+
+G_DEFINE_BOXED_TYPE (GUPnPDLNAValueList,
+                     gupnp_dlna_value_list,
+                     gupnp_dlna_value_list_copy,
+                     gupnp_dlna_value_list_free)
+
+GUPnPDLNAValueList *
+gupnp_dlna_value_list_new (GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAValueList *list;
+
+        g_return_val_if_fail (type != NULL, NULL);
+
+        list = g_slice_new (GUPnPDLNAValueList);
+        list->type = type;
+        list->values = NULL;
+        list->sorted = FALSE;
+
+        return list;
+}
+
+static void
+free_value_list (GUPnPDLNAValueList *list)
+{
+        if (list->values) {
+                g_list_foreach (list->values,
+                                (GFunc) gupnp_dlna_value_free,
+                                list->type);
+                g_list_free (list->values);
+                list->values = NULL;
+        }
+}
+
+/**
+ * gupnp_dlna_value_list_free:
+ * @list: A list to free.
+ *
+ * Frees the value list.
+ */
+void
+gupnp_dlna_value_list_free (GUPnPDLNAValueList *list)
+{
+        if (!list)
+                return;
+
+        free_value_list (list);
+        g_slice_free (GUPnPDLNAValueList, list);
+}
+
+static gint
+value_compare (GUPnPDLNAValue     *a,
+               GUPnPDLNAValue     *b,
+               GUPnPDLNAValueType *type)
+{
+        return gupnp_dlna_value_compare (a, b, type);
+}
+
+static gboolean
+insert_value (GUPnPDLNAValueList *list,
+              GUPnPDLNAValue     *value)
+{
+        if (value) {
+                if (list->sorted)
+                        list->values = g_list_insert_sorted_with_data
+                                        (list->values,
+                                         value,
+                                         (GCompareDataFunc) value_compare,
+                                         list->type);
+                else
+                        list->values = g_list_prepend (list->values, value);
+                return TRUE;
+        }
+
+        return FALSE;
+}
+
+gboolean
+gupnp_dlna_value_list_add_single (GUPnPDLNAValueList *list,
+                                  const gchar        *single)
+{
+        GUPnPDLNAValue *value;
+
+        g_return_val_if_fail (list != NULL, FALSE);
+        g_return_val_if_fail (single != NULL, FALSE);
+
+        value = gupnp_dlna_value_new_single (list->type, single);
+
+        return insert_value (list, value);
+}
+
+gboolean
+gupnp_dlna_value_list_add_range (GUPnPDLNAValueList *list,
+                                 const gchar        *min,
+                                 const gchar        *max)
+{
+        GUPnPDLNAValue *range;
+
+        g_return_val_if_fail (list != NULL, FALSE);
+        g_return_val_if_fail (min != NULL, FALSE);
+        g_return_val_if_fail (max != NULL, FALSE);
+
+        range = gupnp_dlna_value_new_ranged (list->type, min, max);
+
+        if (range) {
+                list->values = g_list_prepend (list->values, range);
+
+                return TRUE;
+        }
+
+        return FALSE;
+}
+
+/**
+ * gupnp_dlna_value_list_copy:
+ * @list: (transfer none): A list to copy.
+ *
+ * Returns: (transfer full): A copy of @list.
+ */
+GUPnPDLNAValueList *
+gupnp_dlna_value_list_copy (GUPnPDLNAValueList *list)
+{
+        GUPnPDLNAValueList *dup;
+
+        if (list) {
+                GList *iter;
+
+                dup = gupnp_dlna_value_list_new (list->type);
+                for (iter = list->values; iter != NULL; iter = iter->next) {
+                        GUPnPDLNAValue *base = (GUPnPDLNAValue *) iter->data;
+                        GUPnPDLNAValue *copy;
+
+                        if (base == NULL)
+                                continue;
+
+                        copy = gupnp_dlna_value_copy (base, list->type);
+                        if (copy != NULL)
+                                dup->values = g_list_prepend (dup->values,
+                                                              copy);
+                }
+                dup->values = g_list_reverse (dup->values);
+        } else {
+                dup = NULL;
+        }
+
+        return dup;
+}
+
+gboolean
+gupnp_dlna_value_list_is_superset (GUPnPDLNAValueList *list,
+                                   GUPnPDLNAInfoValue *value,
+                                   gboolean           *unsupported)
+{
+        GList *iter;
+
+        g_return_val_if_fail (list != NULL, FALSE);
+        g_return_val_if_fail (value != NULL, FALSE);
+        g_return_val_if_fail (unsupported != NULL, FALSE);
+
+        if (list->type != gupnp_dlna_info_value_get_type (value))
+                return FALSE;
+
+        if (gupnp_dlna_info_value_is_unsupported (value)) {
+                *unsupported = TRUE;
+
+                return TRUE;
+        }
+
+        for (iter = list->values; iter != NULL; iter = iter->next) {
+                GUPnPDLNAValue *base = (GUPnPDLNAValue *) iter->data;
+
+                if (gupnp_dlna_value_is_superset (base, value)) {
+                        *unsupported = FALSE;
+
+                        return TRUE;
+                }
+        }
+
+        return FALSE;
+}
+
+/**
+ * gupnp_dlna_value_list_is_empty:
+ * @list: (transfer none): A list.
+ *
+ * Returns: %TRUE if @list is empty, otherwise %FALSE.
+ */
+gboolean
+gupnp_dlna_value_list_is_empty (GUPnPDLNAValueList *value_list)
+{
+        g_return_val_if_fail (value_list != NULL, TRUE);
+
+        return (value_list->values == NULL);
+}
+
+GList *
+gupnp_dlna_value_list_get_list (GUPnPDLNAValueList *value_list)
+{
+        g_return_val_if_fail (value_list != NULL, NULL);
+
+        return value_list->values;
+}
+
+static gchar *
+list_to_string (GUPnPDLNAValueList *value_list)
+{
+        GList *iter;
+        GPtrArray* strings = g_ptr_array_new_with_free_func (g_free);
+        gchar *str;
+
+        for (iter = value_list->values; iter != NULL; iter = iter->next) {
+                GUPnPDLNAValue *value = (GUPnPDLNAValue *) iter->data;
+
+                g_ptr_array_add (strings,
+                                 gupnp_dlna_value_to_string (value,
+                                                             value_list->type));
+        }
+        g_ptr_array_add (strings, NULL);
+
+        str = g_strjoinv (", ", (gchar **) strings->pdata);
+        g_ptr_array_unref (strings);
+
+        return str;
+}
+
+/**
+ * gupnp_dlna_value_list_to_string:
+ * @list: (transfer none): A list.
+ *
+ * Creates a string representation of @list.
+ *
+ * Returns: (transfer full): A string representation of @list. Free
+ * with g_free() when not needed.
+ */
+gchar *
+gupnp_dlna_value_list_to_string (GUPnPDLNAValueList *value_list)
+{
+        GString *str;
+        gchar *val_str;
+
+        g_return_val_if_fail (value_list != NULL, NULL);
+
+        if (value_list->values == NULL)
+                return g_strdup ("");
+
+        str = g_string_new (NULL);
+        g_string_append_printf (str,
+                                "(%s)",
+                                gupnp_dlna_value_type_name (value_list->type));
+        if (value_list->values->next != NULL) {
+                g_string_append (str, "{ ");
+                val_str = list_to_string (value_list);
+                g_string_append (str, val_str);
+                g_string_append (str, " }");
+        } else {
+                val_str = list_to_string (value_list);
+                g_string_append (str, val_str);
+        }
+        g_free (val_str);
+
+        return g_string_free (str, FALSE);
+}
+
+void
+gupnp_dlna_value_list_sort_items (GUPnPDLNAValueList *value_list)
+{
+        g_return_if_fail (value_list != NULL);
+
+        if (!value_list->sorted) {
+                value_list->values = g_list_sort_with_data
+                                        (value_list->values,
+                                         (GCompareDataFunc) value_compare,
+                                         value_list->type);
+                value_list->sorted = TRUE;
+        }
+}
+
+/**
+ * gupnp_dlna_value_list_get_g_values:
+ * @list: (transfer none): A list.
+ *
+ * Gets a list of #GValues. #GValues can be of types #G_TYPE_BOOLEAN,
+ * #G_TYPE_INT, #G_TYPE_STRING, #GUPNP_TYPE_DLNA_FRACTION,
+ * #GUPNP_TYPE_DLNA_FRACTION_RANGE or #GUPNP_TYPE_DLNA_INT_RANGE.
+ *
+ * Returns: (transfer full) (element-type GValue): A list. Free it
+ * with g_list_free_full() with g_free().
+ */
+GList *
+gupnp_dlna_value_list_get_g_values (GUPnPDLNAValueList *list)
+{
+        GList *g_values;
+        GList *iter;
+
+        g_return_val_if_fail (list != NULL, NULL);
+
+        g_values = NULL;
+        for (iter = list->values; iter != NULL; iter = iter->next) {
+                GValue *g_value = gupnp_dlna_value_to_g_value (iter->data,
+                                                               list->type);
+
+                if (g_value)
+                        g_values = g_list_prepend (g_values, g_value);
+        }
+
+        return g_list_reverse (g_values);
+}
diff --git a/libgupnp-dlna/gupnp-dlna-value-list.h b/libgupnp-dlna/gupnp-dlna-value-list.h
new file mode 100644 (file)
index 0000000..16218c4
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_VALUE_LIST_H__
+#define __GUPNP_DLNA_VALUE_LIST_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GUPnPDLNAValueList GUPnPDLNAValueList;
+
+#define GUPNP_DLNA_VALUE_LIST(x) \
+        ((GUPnPDLNAValueList *) x)
+
+/**
+ * GUPNP_TYPE_DLNA_VALUE_LIST:
+ *
+ * The #GType for #GUPnPDLNAValueList.
+ */
+#define GUPNP_TYPE_DLNA_VALUE_LIST (gupnp_dlna_value_list_get_type ())
+
+GType
+gupnp_dlna_value_list_get_type (void) G_GNUC_CONST;
+
+GUPnPDLNAValueList *
+gupnp_dlna_value_list_copy (GUPnPDLNAValueList *list);
+
+void
+gupnp_dlna_value_list_free (GUPnPDLNAValueList *list);
+
+gboolean
+gupnp_dlna_value_list_is_empty (GUPnPDLNAValueList *list);
+
+gchar *
+gupnp_dlna_value_list_to_string (GUPnPDLNAValueList *list);
+
+GList *
+gupnp_dlna_value_list_get_g_values (GUPnPDLNAValueList *list);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_VALUE_LIST_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-value-type.c b/libgupnp-dlna/gupnp-dlna-value-type.c
new file mode 100644 (file)
index 0000000..6055b11
--- /dev/null
@@ -0,0 +1,862 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <stdlib.h>
+
+#include "gupnp-dlna-g-values-private.h"
+#include "gupnp-dlna-value-type.h"
+
+struct _GUPnPDLNAValueType {
+        gboolean
+        (* init) (GUPnPDLNAValueType  *type,
+                  GUPnPDLNAValueUnion *value,
+                  const gchar         *raw);
+
+        gboolean
+        (* copy) (GUPnPDLNAValueType  *type,
+                  GUPnPDLNAValueUnion *from,
+                  GUPnPDLNAValueUnion *to);
+
+        void
+        (* clean) (GUPnPDLNAValueType  *type,
+                   GUPnPDLNAValueUnion *value_union);
+
+        gboolean
+        (* is_equal) (GUPnPDLNAValueType  *type,
+                      GUPnPDLNAValueUnion *first,
+                      GUPnPDLNAValueUnion *second);
+
+        gboolean
+        (* is_in_range) (GUPnPDLNAValueType  *type,
+                         GUPnPDLNAValueUnion *min,
+                         GUPnPDLNAValueUnion *max,
+                         GUPnPDLNAValueUnion *value);
+
+        const gchar *
+        (* name) (GUPnPDLNAValueType *type);
+
+        gboolean
+        (* verify_range) (GUPnPDLNAValueType  *type,
+                          GUPnPDLNAValueUnion *min,
+                          GUPnPDLNAValueUnion *max);
+
+        gchar *
+        (* to_string) (GUPnPDLNAValueType  *type,
+                       GUPnPDLNAValueUnion *value);
+
+        gint
+        (* compare) (GUPnPDLNAValueType  *type,
+                     GUPnPDLNAValueUnion *a,
+                     GUPnPDLNAValueUnion *b);
+
+        GType
+        (* get_g_type) (GUPnPDLNAValueType  *type);
+
+        void
+        (* to_g_value) (GUPnPDLNAValueType  *type,
+                        GUPnPDLNAValueUnion *value,
+                        GValue              *g_value);
+
+        gboolean
+        (* flatten) (GUPnPDLNAValueType *type,
+                     GValue             *target,
+                     GValue             *min,
+                     GValue             *max);
+};
+
+/* utils */
+static gboolean
+get_int (const gchar *raw,
+         gint        *store)
+{
+        char *end;
+        long num;
+
+        g_return_val_if_fail (store != NULL, FALSE);
+
+        end = NULL;
+        num = strtol (raw, &end, 10);
+        if (*end != '\0')
+                return FALSE;
+        *store = (gint) num;
+
+        return TRUE;
+}
+
+/* TODO: replace it with better implementation */
+static void
+equalize_denominators (GUPnPDLNAFraction *first,
+                       GUPnPDLNAFraction *second)
+{
+        gint common;
+
+        if (first->denominator == second->denominator)
+                return;
+
+        common = first->denominator * second->denominator;
+        first->numerator *= second->denominator;
+        second->numerator *= first->denominator;
+        first->denominator = common;
+        second->denominator = common;
+}
+
+static gboolean
+fraction_equal (GUPnPDLNAFraction first,
+                GUPnPDLNAFraction second)
+{
+        equalize_denominators (&first, &second);
+
+        return first.numerator == second.numerator;
+}
+
+static gboolean
+fraction_in_range (GUPnPDLNAFraction min,
+                   GUPnPDLNAFraction max,
+                   GUPnPDLNAFraction value)
+{
+        GUPnPDLNAFraction value_dup = value;
+
+        equalize_denominators (&min, &value);
+        if (min.numerator > value.numerator)
+                return FALSE;
+        equalize_denominators (&max, &value_dup);
+        if (max.numerator < value_dup.numerator)
+                return FALSE;
+
+        return TRUE;
+}
+
+static gint
+int_comparison (gint a,
+                gint b)
+{
+        if (a > b)
+                return 1;
+        else if (a < b)
+                return -1;
+
+        return 0;
+}
+
+static gint
+fraction_comparison (GUPnPDLNAFraction a,
+                     GUPnPDLNAFraction b)
+{
+        equalize_denominators (&a, &b);
+
+        return int_comparison (a.numerator, b.numerator);
+}
+
+static gboolean
+fraction_range_valid (GUPnPDLNAFraction min,
+                      GUPnPDLNAFraction max)
+{
+        equalize_denominators (&min, &max);
+
+        return (min.numerator <= max.numerator);
+}
+
+/* bool */
+static gboolean
+bool_init (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+           GUPnPDLNAValueUnion *value,
+           const gchar         *raw)
+{
+        if (!g_strcmp0 (raw, "true"))
+                value->bool_value = TRUE;
+        else if (!g_strcmp0 (raw, "false"))
+                value->bool_value = FALSE;
+        else
+                return FALSE;
+
+        return TRUE;
+}
+
+static gboolean
+bool_copy (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+           GUPnPDLNAValueUnion *from,
+           GUPnPDLNAValueUnion *to)
+{
+        to->bool_value = from->bool_value;
+
+        return TRUE;
+}
+
+static void
+bool_clean (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+            GUPnPDLNAValueUnion *value_union G_GNUC_UNUSED)
+{
+
+}
+
+static gboolean
+bool_is_equal (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+               GUPnPDLNAValueUnion *first,
+               GUPnPDLNAValueUnion *second)
+{
+        return !!first->bool_value == !!second->bool_value;
+}
+
+static gboolean
+bool_is_in_range (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                  GUPnPDLNAValueUnion *min G_GNUC_UNUSED,
+                  GUPnPDLNAValueUnion *max G_GNUC_UNUSED,
+                  GUPnPDLNAValueUnion *value G_GNUC_UNUSED)
+{
+        /* boolean range? */
+        return FALSE;
+}
+
+static const gchar *
+bool_name (GUPnPDLNAValueType *type G_GNUC_UNUSED)
+{
+        return "boolean";
+}
+
+static gboolean
+bool_verify_range (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                   GUPnPDLNAValueUnion *min G_GNUC_UNUSED,
+                   GUPnPDLNAValueUnion *max G_GNUC_UNUSED)
+{
+        return FALSE;
+}
+
+static gchar *
+bool_to_string (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                GUPnPDLNAValueUnion *value)
+{
+        return g_strdup (value->bool_value ? "true" : "false");
+}
+
+static gint
+bool_compare (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+              GUPnPDLNAValueUnion *a,
+              GUPnPDLNAValueUnion *b)
+{
+        if ((a->bool_value && b->bool_value) ||
+            (!a->bool_value && !b->bool_value))
+                return 0;
+        else if (a->bool_value)
+                return 1;
+        else
+                return -1;
+}
+
+static GType
+bool_get_g_type (GUPnPDLNAValueType *type G_GNUC_UNUSED)
+{
+        return G_TYPE_BOOLEAN;
+}
+
+static void
+bool_to_g_value (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                 GUPnPDLNAValueUnion *value,
+                 GValue              *g_value)
+{
+        g_value_set_boolean (g_value, value->bool_value);
+}
+
+static gboolean
+bool_flatten (GUPnPDLNAValueType *type G_GNUC_UNUSED,
+              GValue             *target G_GNUC_UNUSED,
+              GValue             *from G_GNUC_UNUSED,
+              GValue             *to G_GNUC_UNUSED)
+{
+        return FALSE;
+}
+
+static GUPnPDLNAValueType bool_type_impl = {
+        bool_init,
+        bool_copy,
+        bool_clean,
+        bool_is_equal,
+        bool_is_in_range,
+        bool_name,
+        bool_verify_range,
+        bool_to_string,
+        bool_compare,
+        bool_get_g_type,
+        bool_to_g_value,
+        bool_flatten
+};
+
+/* fraction */
+static gboolean
+fraction_init (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+               GUPnPDLNAValueUnion *value,
+               const gchar         *raw)
+{
+        gchar **tokens = g_strsplit (raw, "/", 2);
+        gboolean result = FALSE;
+        gint numerator;
+        gint denominator;
+
+        if (g_strv_length (tokens) != 2)
+                goto out;
+
+        if (!get_int (tokens[0], &numerator) ||
+            !get_int (tokens[1], &denominator))
+                goto out;
+
+        if (!denominator)
+                goto out;
+
+        value->fraction_value.numerator = numerator;
+        value->fraction_value.denominator = denominator;
+        result = TRUE;
+ out:
+        g_strfreev (tokens);
+
+        return result;
+}
+
+static gboolean
+fraction_copy (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+               GUPnPDLNAValueUnion *from,
+               GUPnPDLNAValueUnion *to)
+{
+        to->fraction_value = from->fraction_value;
+
+        return TRUE;
+}
+
+static void
+fraction_clean (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                GUPnPDLNAValueUnion *value_union G_GNUC_UNUSED)
+{
+
+}
+
+static gboolean
+fraction_is_equal (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                   GUPnPDLNAValueUnion *first,
+                   GUPnPDLNAValueUnion *second)
+{
+        return fraction_equal (first->fraction_value,
+                               second->fraction_value);
+}
+
+static gboolean
+fraction_is_in_range (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                      GUPnPDLNAValueUnion *min,
+                      GUPnPDLNAValueUnion *max,
+                      GUPnPDLNAValueUnion *value)
+{
+        /* fraction range? */
+        return fraction_in_range (min->fraction_value,
+                                  max->fraction_value,
+                                  value->fraction_value);
+}
+
+static const gchar *
+fraction_name (GUPnPDLNAValueType *type G_GNUC_UNUSED)
+{
+        return "fraction";
+}
+
+static gboolean
+fraction_verify_range (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                       GUPnPDLNAValueUnion *min,
+                       GUPnPDLNAValueUnion *max)
+{
+        return fraction_range_valid (min->fraction_value, max->fraction_value);
+}
+
+static gchar *
+fraction_to_string (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                    GUPnPDLNAValueUnion *value)
+{
+        return g_strdup_printf ("%d/%d",
+                                value->fraction_value.numerator,
+                                value->fraction_value.denominator);
+}
+
+static gint
+fraction_compare (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                  GUPnPDLNAValueUnion *a,
+                  GUPnPDLNAValueUnion *b)
+{
+        return fraction_comparison (a->fraction_value, b->fraction_value);
+}
+
+static GType
+fraction_get_g_type (GUPnPDLNAValueType *type G_GNUC_UNUSED)
+{
+        return GUPNP_TYPE_DLNA_FRACTION;
+}
+
+static void
+fraction_to_g_value (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                     GUPnPDLNAValueUnion *value,
+                     GValue              *g_value)
+{
+        g_value_set_boxed (g_value, &value->fraction_value);
+}
+
+static gboolean
+fraction_flatten (GUPnPDLNAValueType *type G_GNUC_UNUSED,
+                  GValue             *target,
+                  GValue             *from,
+                  GValue             *to)
+{
+        GUPnPDLNAFraction *fraction_min =
+                                 GUPNP_DLNA_FRACTION (g_value_get_boxed (from));
+        GUPnPDLNAFraction *fraction_max =
+                                   GUPNP_DLNA_FRACTION (g_value_get_boxed (to));
+
+        g_value_init (target, GUPNP_TYPE_DLNA_FRACTION_RANGE);
+        g_value_take_boxed (target,
+                            gupnp_dlna_fraction_range_new_take (fraction_min,
+                                                                fraction_max));
+
+        return TRUE;
+}
+
+static GUPnPDLNAValueType fraction_type_impl = {
+        fraction_init,
+        fraction_copy,
+        fraction_clean,
+        fraction_is_equal,
+        fraction_is_in_range,
+        fraction_name,
+        fraction_verify_range,
+        fraction_to_string,
+        fraction_compare,
+        fraction_get_g_type,
+        fraction_to_g_value,
+        fraction_flatten
+};
+
+/* int */
+static gboolean
+int_init (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+          GUPnPDLNAValueUnion *value,
+          const gchar         *raw)
+{
+        gint num;
+
+        if (get_int (raw, &num)) {
+                value->int_value = num;
+                return TRUE;
+        }
+
+        return FALSE;
+}
+
+static gboolean
+int_copy (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+          GUPnPDLNAValueUnion *from,
+          GUPnPDLNAValueUnion *to)
+{
+        to->int_value = from->int_value;
+
+        return TRUE;
+}
+
+static void
+int_clean (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+           GUPnPDLNAValueUnion *value_union G_GNUC_UNUSED)
+{
+
+}
+
+static gboolean
+int_is_equal (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+              GUPnPDLNAValueUnion *first,
+              GUPnPDLNAValueUnion *second)
+{
+        return first->int_value == second->int_value;
+}
+
+static gboolean
+int_is_in_range (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                 GUPnPDLNAValueUnion *min,
+                 GUPnPDLNAValueUnion *max,
+                 GUPnPDLNAValueUnion *value)
+{
+        return (min->int_value <= value->int_value &&
+                max->int_value >= value->int_value);
+}
+
+static const gchar *
+int_name (GUPnPDLNAValueType *type G_GNUC_UNUSED)
+{
+        return "int";
+}
+
+static gboolean
+int_verify_range (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                  GUPnPDLNAValueUnion *min,
+                  GUPnPDLNAValueUnion *max)
+{
+        return (min->int_value <= max->int_value);
+}
+
+static gchar *
+int_to_string (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+               GUPnPDLNAValueUnion *value)
+{
+        return g_strdup_printf ("%d", value->int_value);
+}
+
+static gint
+int_compare (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+             GUPnPDLNAValueUnion *a,
+             GUPnPDLNAValueUnion *b)
+{
+        return int_comparison (a->int_value, b->int_value);
+}
+
+static GType
+int_get_g_type (GUPnPDLNAValueType *type G_GNUC_UNUSED)
+{
+        return G_TYPE_INT;
+}
+
+static void
+int_to_g_value (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                GUPnPDLNAValueUnion *value,
+                GValue              *g_value)
+{
+        g_value_set_int (g_value, value->int_value);
+}
+
+static gboolean
+int_flatten (GUPnPDLNAValueType *type G_GNUC_UNUSED,
+             GValue             *target,
+             GValue             *from,
+             GValue             *to)
+{
+        g_value_init (target, GUPNP_TYPE_DLNA_INT_RANGE);
+        g_value_take_boxed (target,
+                            gupnp_dlna_int_range_new (g_value_get_int (from),
+                                                      g_value_get_int (to)));
+
+        return TRUE;
+}
+
+static GUPnPDLNAValueType int_type_impl = {
+        int_init,
+        int_copy,
+        int_clean,
+        int_is_equal,
+        int_is_in_range,
+        int_name,
+        int_verify_range,
+        int_to_string,
+        int_compare,
+        int_get_g_type,
+        int_to_g_value,
+        int_flatten
+};
+
+/* string */
+static gboolean
+string_init (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+             GUPnPDLNAValueUnion *value,
+             const gchar         *raw)
+{
+        value->string_value = g_strdup (raw);
+
+        return TRUE;
+}
+
+static gboolean
+string_copy (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+             GUPnPDLNAValueUnion *from,
+             GUPnPDLNAValueUnion *to)
+{
+        to->string_value = g_strdup (from->string_value);
+
+        return TRUE;
+}
+
+static void
+string_clean (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+              GUPnPDLNAValueUnion *value_union)
+{
+        g_free (value_union->string_value);
+}
+
+static gboolean
+string_is_equal (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                 GUPnPDLNAValueUnion *first,
+                 GUPnPDLNAValueUnion *second)
+{
+        return !g_strcmp0 (first->string_value, second->string_value);
+}
+
+static gboolean
+string_is_in_range (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                    GUPnPDLNAValueUnion *min,
+                    GUPnPDLNAValueUnion *max,
+                    GUPnPDLNAValueUnion *value)
+{
+        /* string range? */
+        return (!g_strcmp0 (min->string_value,
+                            value->string_value) ||
+                !g_strcmp0 (max->string_value,
+                            value->string_value));
+}
+
+static const gchar *
+string_name (GUPnPDLNAValueType *type G_GNUC_UNUSED)
+{
+        return "string";
+}
+
+static gboolean
+string_verify_range (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                     GUPnPDLNAValueUnion *min G_GNUC_UNUSED,
+                     GUPnPDLNAValueUnion *max G_GNUC_UNUSED)
+{
+        return FALSE;
+}
+
+static gchar *
+string_to_string (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                  GUPnPDLNAValueUnion *value)
+{
+        return g_strdup (value->string_value);
+}
+
+static gint
+string_compare (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                GUPnPDLNAValueUnion *a,
+                GUPnPDLNAValueUnion *b)
+{
+        return g_strcmp0 (a->string_value, b->string_value);
+}
+
+static GType
+string_get_g_type (GUPnPDLNAValueType *type G_GNUC_UNUSED)
+{
+        return G_TYPE_STRING;
+}
+
+static void
+string_to_g_value (GUPnPDLNAValueType  *type G_GNUC_UNUSED,
+                   GUPnPDLNAValueUnion *value,
+                   GValue              *g_value)
+{
+        g_value_set_string (g_value, value->string_value);
+}
+
+static gboolean
+string_flatten (GUPnPDLNAValueType *type G_GNUC_UNUSED,
+                GValue             *target G_GNUC_UNUSED,
+                GValue             *from G_GNUC_UNUSED,
+                GValue             *to G_GNUC_UNUSED)
+{
+        return FALSE;
+}
+
+static GUPnPDLNAValueType string_type_impl = {
+        string_init,
+        string_copy,
+        string_clean,
+        string_is_equal,
+        string_is_in_range,
+        string_name,
+        string_verify_range,
+        string_to_string,
+        string_compare,
+        string_get_g_type,
+        string_to_g_value,
+        string_flatten
+};
+
+GUPnPDLNAValueType *
+gupnp_dlna_value_type_bool (void)
+{
+        return &bool_type_impl;
+}
+
+GUPnPDLNAValueType *
+gupnp_dlna_value_type_fraction (void)
+{
+        return &fraction_type_impl;
+}
+
+GUPnPDLNAValueType *
+gupnp_dlna_value_type_int (void)
+{
+        return &int_type_impl;
+}
+
+GUPnPDLNAValueType *
+gupnp_dlna_value_type_string (void)
+{
+        return &string_type_impl;
+}
+
+gboolean
+gupnp_dlna_value_type_init (GUPnPDLNAValueType  *type,
+                            GUPnPDLNAValueUnion *value,
+                            const gchar         *raw)
+{
+        g_return_val_if_fail (type != NULL, FALSE);
+        g_return_val_if_fail (value != NULL, FALSE);
+        g_return_val_if_fail (raw != NULL, FALSE);
+        g_return_val_if_fail (type->init != NULL, FALSE);
+
+        return type->init (type, value, raw);
+}
+
+gboolean
+gupnp_dlna_value_type_copy (GUPnPDLNAValueType  *type,
+                            GUPnPDLNAValueUnion *from,
+                            GUPnPDLNAValueUnion *to)
+{
+        g_return_val_if_fail (type != NULL, FALSE);
+        g_return_val_if_fail (from != NULL, FALSE);
+        g_return_val_if_fail (to != NULL, FALSE);
+        g_return_val_if_fail (type->copy != NULL, FALSE);
+
+        return type->copy (type, from, to);
+}
+
+void
+gupnp_dlna_value_type_clean (GUPnPDLNAValueType  *type,
+                             GUPnPDLNAValueUnion *value)
+{
+        g_return_if_fail (type != NULL);
+        g_return_if_fail (value != NULL);
+        g_return_if_fail (type->clean != NULL);
+
+        type->clean (type, value);
+}
+
+gboolean
+gupnp_dlna_value_type_is_equal (GUPnPDLNAValueType  *type,
+                                GUPnPDLNAValueUnion *first,
+                                GUPnPDLNAValueUnion *second)
+{
+        g_return_val_if_fail (type != NULL, FALSE);
+        g_return_val_if_fail (first != NULL, FALSE);
+        g_return_val_if_fail (second != NULL, FALSE);
+        g_return_val_if_fail (type->is_equal != NULL, FALSE);
+
+        return type->is_equal (type, first, second);
+}
+
+gboolean
+gupnp_dlna_value_type_is_in_range (GUPnPDLNAValueType  *type,
+                                   GUPnPDLNAValueUnion *min,
+                                   GUPnPDLNAValueUnion *max,
+                                   GUPnPDLNAValueUnion *value)
+{
+        g_return_val_if_fail (type != NULL, FALSE);
+        g_return_val_if_fail (min != NULL, FALSE);
+        g_return_val_if_fail (max != NULL, FALSE);
+        g_return_val_if_fail (value != NULL, FALSE);
+        g_return_val_if_fail (type->is_in_range != NULL, FALSE);
+
+        return type->is_in_range (type, min, max, value);
+}
+
+const gchar *
+gupnp_dlna_value_type_name (GUPnPDLNAValueType *type)
+{
+        g_return_val_if_fail (type != NULL, NULL);
+        g_return_val_if_fail (type->name != NULL, NULL);
+
+        return type->name (type);
+}
+
+gboolean
+gupnp_dlna_value_type_verify_range (GUPnPDLNAValueType  *type,
+                                    GUPnPDLNAValueUnion *min,
+                                    GUPnPDLNAValueUnion *max)
+{
+        g_return_val_if_fail (type != NULL, FALSE);
+        g_return_val_if_fail (min != NULL, FALSE);
+        g_return_val_if_fail (max != NULL, FALSE);
+        g_return_val_if_fail (type->verify_range != NULL, FALSE);
+
+        return type->verify_range (type, min, max);
+}
+
+gchar *
+gupnp_dlna_value_type_to_string (GUPnPDLNAValueType  *type,
+                                 GUPnPDLNAValueUnion *value)
+{
+        g_return_val_if_fail (type != NULL, NULL);
+        g_return_val_if_fail (value != NULL, NULL);
+        g_return_val_if_fail (type->to_string != NULL, NULL);
+
+        return type->to_string (type, value);
+}
+
+gint
+gupnp_dlna_value_type_compare (GUPnPDLNAValueType  *type,
+                               GUPnPDLNAValueUnion *a,
+                               GUPnPDLNAValueUnion *b)
+{
+        g_return_val_if_fail (type != NULL, 0);
+        g_return_val_if_fail (a != NULL, 0);
+        g_return_val_if_fail (b != NULL, 0);
+        g_return_val_if_fail (type->compare != NULL, 0);
+
+        return type->compare (type, a, b);
+}
+
+void
+gupnp_dlna_value_type_to_g_value (GUPnPDLNAValueType  *type,
+                                  GUPnPDLNAValueUnion *value,
+                                  GValue              *g_value)
+{
+        g_return_if_fail (type != NULL);
+        g_return_if_fail (value != NULL);
+        g_return_if_fail (g_value != NULL);
+        g_return_if_fail (type->get_g_type != NULL);
+        g_return_if_fail (type->to_g_value != NULL);
+        g_return_if_fail (G_IS_VALUE (g_value) == FALSE);
+
+        g_value_init (g_value, type->get_g_type (type));
+        type->to_g_value (type, value, g_value);
+}
+
+gboolean
+gupnp_dlna_value_type_flatten (GUPnPDLNAValueType *type,
+                               GValue             *target,
+                               GValue             *from,
+                               GValue             *to)
+{
+        GType value_type_g_type;
+
+        g_return_val_if_fail (type != NULL, FALSE);
+        g_return_val_if_fail (target != NULL, FALSE);
+        g_return_val_if_fail (from != NULL, FALSE);
+        g_return_val_if_fail (to != NULL, FALSE);
+        g_return_val_if_fail (type->flatten != NULL, FALSE);
+        g_return_val_if_fail (type->get_g_type != NULL, FALSE);
+        g_return_val_if_fail (G_IS_VALUE (target) == FALSE, FALSE);
+
+        value_type_g_type = type->get_g_type (type);
+
+        g_return_val_if_fail (G_VALUE_HOLDS (from, value_type_g_type),
+                              FALSE);
+        g_return_val_if_fail (G_VALUE_HOLDS (to, value_type_g_type),
+                              FALSE);
+
+        return type->flatten (type, target, from, to);
+}
diff --git a/libgupnp-dlna/gupnp-dlna-value-type.h b/libgupnp-dlna/gupnp-dlna-value-type.h
new file mode 100644 (file)
index 0000000..ac580e9
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_VALUE_TYPE_H__
+#define __GUPNP_DLNA_VALUE_TYPE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "gupnp-dlna-value-union.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GUPnPDLNAValueType GUPnPDLNAValueType;
+
+GUPnPDLNAValueType *
+gupnp_dlna_value_type_bool (void);
+
+GUPnPDLNAValueType *
+gupnp_dlna_value_type_fraction (void);
+
+GUPnPDLNAValueType *
+gupnp_dlna_value_type_int (void);
+
+GUPnPDLNAValueType *
+gupnp_dlna_value_type_string (void);
+
+gboolean
+gupnp_dlna_value_type_init (GUPnPDLNAValueType  *type,
+                            GUPnPDLNAValueUnion *value,
+                            const gchar         *raw);
+
+gboolean
+gupnp_dlna_value_type_copy (GUPnPDLNAValueType  *type,
+                            GUPnPDLNAValueUnion *from,
+                            GUPnPDLNAValueUnion *to);
+
+void
+gupnp_dlna_value_type_clean (GUPnPDLNAValueType  *type,
+                             GUPnPDLNAValueUnion *value_union);
+
+gboolean
+gupnp_dlna_value_type_is_equal (GUPnPDLNAValueType  *type,
+                                GUPnPDLNAValueUnion *first,
+                                GUPnPDLNAValueUnion *second);
+
+gboolean
+gupnp_dlna_value_type_is_in_range (GUPnPDLNAValueType  *type,
+                                   GUPnPDLNAValueUnion *min,
+                                   GUPnPDLNAValueUnion *max,
+                                   GUPnPDLNAValueUnion *value);
+
+const gchar *
+gupnp_dlna_value_type_name (GUPnPDLNAValueType *type);
+
+gboolean
+gupnp_dlna_value_type_verify_range (GUPnPDLNAValueType  *type,
+                                    GUPnPDLNAValueUnion *min,
+                                    GUPnPDLNAValueUnion *max);
+
+gchar *
+gupnp_dlna_value_type_to_string (GUPnPDLNAValueType  *type,
+                                 GUPnPDLNAValueUnion *value);
+
+gint
+gupnp_dlna_value_type_compare (GUPnPDLNAValueType  *type,
+                               GUPnPDLNAValueUnion *a,
+                               GUPnPDLNAValueUnion *b);
+
+void
+gupnp_dlna_value_type_to_g_value (GUPnPDLNAValueType  *type,
+                                  GUPnPDLNAValueUnion *value,
+                                  GValue              *g_value);
+
+gboolean
+gupnp_dlna_value_type_flatten (GUPnPDLNAValueType *type,
+                               GValue             *target,
+                               GValue             *from,
+                               GValue             *to);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_VALUE_TYPE_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-value-union.h b/libgupnp-dlna/gupnp-dlna-value-union.h
new file mode 100644 (file)
index 0000000..200685a
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_VALUE_UNION_H__
+#define __GUPNP_DLNA_VALUE_UNION_H__
+
+#include <glib.h>
+
+#include "gupnp-dlna-g-values-private.h"
+
+G_BEGIN_DECLS
+
+typedef union _GUPnPDLNAValueUnion GUPnPDLNAValueUnion;
+
+union _GUPnPDLNAValueUnion {
+        gboolean bool_value;
+        GUPnPDLNAFraction fraction_value;
+        gint int_value;
+        gchar *string_value;
+};
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_VALUE_UNION_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-value.c b/libgupnp-dlna/gupnp-dlna-value.c
new file mode 100644 (file)
index 0000000..13c3c65
--- /dev/null
@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-value.h"
+#include "gupnp-dlna-value-union.h"
+
+struct _GUPnPDLNAValueVTable {
+        gboolean
+        (* is_superset) (GUPnPDLNAValue     *base,
+                         GUPnPDLNAInfoValue *info);
+
+        GUPnPDLNAValue *
+        (* copy) (GUPnPDLNAValue     *base,
+                  GUPnPDLNAValueType *type);
+
+        void
+        (* free) (GUPnPDLNAValue     *base,
+                  GUPnPDLNAValueType *type);
+
+        gchar *
+        (* to_string) (GUPnPDLNAValue     *base,
+                       GUPnPDLNAValueType *type);
+
+        GUPnPDLNAValueUnion *
+        (* get_sort_value) (GUPnPDLNAValue *base);
+
+        gboolean
+        (* to_g_value) (GUPnPDLNAValue     *base,
+                        GUPnPDLNAValueType *type,
+                        GValue             *g_value);
+};
+
+/* single */
+typedef struct _GUPnPDLNAValueSingle GUPnPDLNAValueSingle;
+
+struct _GUPnPDLNAValueSingle {
+        GUPnPDLNAValue      base;
+        GUPnPDLNAValueUnion value;
+};
+
+static gboolean
+single_is_superset (GUPnPDLNAValue     *base,
+                    GUPnPDLNAInfoValue *info);
+
+static GUPnPDLNAValue *
+single_copy (GUPnPDLNAValue     *base,
+             GUPnPDLNAValueType *type);
+
+static void
+single_free (GUPnPDLNAValue     *base,
+             GUPnPDLNAValueType *type);
+
+static gchar *
+single_to_string (GUPnPDLNAValue     *base,
+                  GUPnPDLNAValueType *type);
+
+static GUPnPDLNAValueUnion *
+single_get_sort_value (GUPnPDLNAValue *base);
+
+static gboolean
+single_to_g_value (GUPnPDLNAValue     *base,
+                   GUPnPDLNAValueType *type,
+                   GValue             *g_value);
+
+static GUPnPDLNAValueVTable single_vtable = {
+        single_is_superset,
+        single_copy,
+        single_free,
+        single_to_string,
+        single_get_sort_value,
+        single_to_g_value
+};
+
+static gboolean
+single_is_superset (GUPnPDLNAValue     *base,
+                    GUPnPDLNAInfoValue *info)
+{
+        GUPnPDLNAValueSingle *value = (GUPnPDLNAValueSingle *) base;
+        GUPnPDLNAValueType *info_type = gupnp_dlna_info_value_get_type (info);
+        GUPnPDLNAValueUnion *info_value =
+                                        gupnp_dlna_info_value_get_value (info);
+
+        return gupnp_dlna_value_type_is_equal (info_type,
+                                               &value->value,
+                                               info_value);
+}
+
+static GUPnPDLNAValue *
+single_copy (GUPnPDLNAValue     *base,
+             GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAValueSingle *value = (GUPnPDLNAValueSingle *) base;
+        GUPnPDLNAValueSingle *dup = g_slice_new (GUPnPDLNAValueSingle);
+
+        dup->base.vtable = &single_vtable;
+        if (!gupnp_dlna_value_type_copy (type, &value->value, &dup->value)) {
+                g_slice_free (GUPnPDLNAValueSingle, dup);
+                dup = NULL;
+        }
+
+        return (GUPnPDLNAValue *) dup;
+}
+
+static void
+single_free (GUPnPDLNAValue     *base,
+             GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAValueSingle *value = (GUPnPDLNAValueSingle *) base;
+
+        gupnp_dlna_value_type_clean (type, &value->value);
+        g_slice_free (GUPnPDLNAValueSingle, value);
+}
+
+static gchar *
+single_to_string (GUPnPDLNAValue     *base,
+                  GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAValueSingle *value = (GUPnPDLNAValueSingle *) base;
+
+        return gupnp_dlna_value_type_to_string (type, &value->value);
+}
+
+static GUPnPDLNAValueUnion *
+single_get_sort_value (GUPnPDLNAValue *base)
+{
+        GUPnPDLNAValueSingle *value = (GUPnPDLNAValueSingle *) base;
+
+        return &value->value;
+}
+
+static gboolean
+single_to_g_value (GUPnPDLNAValue     *base,
+                   GUPnPDLNAValueType *type,
+                   GValue             *g_value)
+{
+        GUPnPDLNAValueSingle *value = (GUPnPDLNAValueSingle *) base;
+
+        gupnp_dlna_value_type_to_g_value (type, &value->value, g_value);
+
+        return TRUE;
+}
+
+/* range */
+typedef struct _GUPnPDLNAValueRange GUPnPDLNAValueRange;
+
+struct _GUPnPDLNAValueRange {
+        GUPnPDLNAValue base;
+        GUPnPDLNAValueUnion min;
+        GUPnPDLNAValueUnion max;
+};
+
+static gboolean
+range_is_superset (GUPnPDLNAValue     *base,
+                   GUPnPDLNAInfoValue *info);
+
+static GUPnPDLNAValue *
+range_copy (GUPnPDLNAValue     *base,
+            GUPnPDLNAValueType *type);
+
+static void
+range_free (GUPnPDLNAValue     *base,
+            GUPnPDLNAValueType *type);
+
+static gchar *
+range_to_string (GUPnPDLNAValue     *base,
+                 GUPnPDLNAValueType *type);
+
+static GUPnPDLNAValueUnion *
+range_get_sort_value (GUPnPDLNAValue *base);
+
+static gboolean
+range_to_g_value (GUPnPDLNAValue     *base,
+                  GUPnPDLNAValueType *type,
+                  GValue             *g_value);
+
+static GUPnPDLNAValueVTable range_vtable = {
+        range_is_superset,
+        range_copy,
+        range_free,
+        range_to_string,
+        range_get_sort_value,
+        range_to_g_value
+};
+
+static gboolean
+range_is_superset (GUPnPDLNAValue     *base,
+                   GUPnPDLNAInfoValue *info)
+{
+        GUPnPDLNAValueRange *range = (GUPnPDLNAValueRange *) base;
+        GUPnPDLNAValueType *info_type = gupnp_dlna_info_value_get_type (info);
+        GUPnPDLNAValueUnion *info_value =
+                                        gupnp_dlna_info_value_get_value (info);
+
+        return gupnp_dlna_value_type_is_in_range (info_type,
+                                                  &range->min,
+                                                  &range->max,
+                                                  info_value);
+}
+
+static GUPnPDLNAValue *
+range_copy (GUPnPDLNAValue     *base,
+            GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAValueRange *range = (GUPnPDLNAValueRange *) base;
+        GUPnPDLNAValueRange *dup = g_slice_new (GUPnPDLNAValueRange);
+
+        dup->base.vtable = &range_vtable;
+        if (!gupnp_dlna_value_type_copy (type, &range->min, &dup->min)) {
+                g_slice_free (GUPnPDLNAValueRange, dup);
+                dup = NULL;
+        }
+        if (dup && !gupnp_dlna_value_type_copy (type,
+                                                &range->max,
+                                                &dup->max)) {
+                gupnp_dlna_value_type_clean (type, &dup->min);
+                g_slice_free (GUPnPDLNAValueRange, dup);
+                dup = NULL;
+        }
+
+        return (GUPnPDLNAValue *) dup;
+}
+
+static void
+range_free (GUPnPDLNAValue     *base,
+            GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAValueRange *range = (GUPnPDLNAValueRange *) base;
+
+        gupnp_dlna_value_type_clean (type, &range->min);
+        gupnp_dlna_value_type_clean (type, &range->max);
+        g_slice_free (GUPnPDLNAValueRange, range);
+}
+
+static gchar *
+range_to_string (GUPnPDLNAValue     *base,
+                 GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAValueRange *range = (GUPnPDLNAValueRange *) base;
+        gchar *str;
+        gchar *min = gupnp_dlna_value_type_to_string (type, &range->min);
+        gchar *max = gupnp_dlna_value_type_to_string (type, &range->max);
+
+        str = g_strdup_printf ("[ %s, %s ]", min, max);
+        g_free (min);
+        g_free (max);
+
+        return str;
+}
+
+static GUPnPDLNAValueUnion *
+range_get_sort_value (GUPnPDLNAValue *base)
+{
+        GUPnPDLNAValueRange *range = (GUPnPDLNAValueRange *) base;
+
+        return &range->min;
+}
+
+static gboolean
+range_to_g_value (GUPnPDLNAValue     *base,
+                  GUPnPDLNAValueType *type,
+                  GValue             *g_value)
+{
+        GValue from = G_VALUE_INIT;
+        GValue to = G_VALUE_INIT;
+        GUPnPDLNAValueRange *range = (GUPnPDLNAValueRange *) base;
+        gboolean result;
+
+        gupnp_dlna_value_type_to_g_value (type, &range->min, &from);
+        gupnp_dlna_value_type_to_g_value (type, &range->max, &to);
+        result = gupnp_dlna_value_type_flatten (type, g_value, &from, &to);
+        g_value_unset (&from);
+        g_value_unset (&to);
+
+        return result;
+}
+
+/* API */
+
+GUPnPDLNAValue *
+gupnp_dlna_value_new_single (GUPnPDLNAValueType *type,
+                             const gchar        *raw)
+{
+        GUPnPDLNAValueSingle *value;
+
+        g_return_val_if_fail (type != NULL, NULL);
+        g_return_val_if_fail (raw != NULL, NULL);
+
+        value = g_slice_new (GUPnPDLNAValueSingle);
+        value->base.vtable = &single_vtable;
+        if (!gupnp_dlna_value_type_init (type, &value->value, raw)) {
+                g_slice_free (GUPnPDLNAValueSingle, value);
+                value = NULL;
+        }
+
+        return (GUPnPDLNAValue *) value;
+}
+
+GUPnPDLNAValue *
+gupnp_dlna_value_new_ranged (GUPnPDLNAValueType *type,
+                             const gchar        *min,
+                             const gchar        *max)
+{
+        GUPnPDLNAValueRange *range;
+
+        g_return_val_if_fail (type != NULL, NULL);
+        g_return_val_if_fail (min != NULL, NULL);
+        g_return_val_if_fail (max != NULL, NULL);
+
+        range = g_slice_new (GUPnPDLNAValueRange);
+        range->base.vtable = &range_vtable;
+        if (!gupnp_dlna_value_type_init (type, &range->min, min)) {
+                g_slice_free (GUPnPDLNAValueRange, range);
+                range = NULL;
+        }
+        if (range && !gupnp_dlna_value_type_init (type, &range->max, max)) {
+                gupnp_dlna_value_type_clean (type, &range->min);
+                g_slice_free (GUPnPDLNAValueRange, range);
+                range = NULL;
+        }
+        if (range && !gupnp_dlna_value_type_verify_range (type,
+                                                          &range->min,
+                                                          &range->max)) {
+                gupnp_dlna_value_type_clean (type, &range->min);
+                gupnp_dlna_value_type_clean (type, &range->max);
+                g_slice_free (GUPnPDLNAValueRange, range);
+                range = NULL;
+        }
+
+        return (GUPnPDLNAValue *) range;
+}
+
+gboolean
+gupnp_dlna_value_is_superset (GUPnPDLNAValue     *base,
+                              GUPnPDLNAInfoValue *single)
+{
+        g_return_val_if_fail (base != NULL, FALSE);
+        g_return_val_if_fail (single != NULL, FALSE);
+        g_return_val_if_fail (base->vtable != NULL, FALSE);
+        g_return_val_if_fail (base->vtable->is_superset != NULL, FALSE);
+
+        return base->vtable->is_superset (base, single);
+}
+
+GUPnPDLNAValue *
+gupnp_dlna_value_copy (GUPnPDLNAValue     *base,
+                       GUPnPDLNAValueType *type)
+{
+        g_return_val_if_fail (base != NULL, NULL);
+        g_return_val_if_fail (type != NULL, NULL);
+        g_return_val_if_fail (base->vtable != NULL, NULL);
+        g_return_val_if_fail (base->vtable->copy != NULL, NULL);
+
+        return base->vtable->copy (base, type);
+}
+
+void
+gupnp_dlna_value_free (GUPnPDLNAValue     *base,
+                       GUPnPDLNAValueType *type)
+{
+        if (base == NULL)
+                return;
+
+        g_return_if_fail (type != NULL);
+        g_return_if_fail (base->vtable != NULL);
+        g_return_if_fail (base->vtable->free != NULL);
+
+        base->vtable->free (base, type);
+}
+
+gchar *
+gupnp_dlna_value_to_string (GUPnPDLNAValue     *base,
+                            GUPnPDLNAValueType *type)
+{
+        g_return_val_if_fail (base != NULL, NULL);
+        g_return_val_if_fail (type != NULL, NULL);
+        g_return_val_if_fail (base->vtable != NULL, NULL);
+        g_return_val_if_fail (base->vtable->to_string != NULL, NULL);
+
+        return base->vtable->to_string (base, type);
+}
+
+static GUPnPDLNAValueUnion *
+gupnp_dlna_value_get_sort_value (GUPnPDLNAValue *base)
+{
+        g_return_val_if_fail (base->vtable != NULL, NULL);
+        g_return_val_if_fail (base->vtable->get_sort_value != NULL, NULL);
+
+        return base->vtable->get_sort_value (base);
+}
+
+gint
+gupnp_dlna_value_compare (GUPnPDLNAValue     *base,
+                          GUPnPDLNAValue     *other,
+                          GUPnPDLNAValueType *type)
+{
+        GUPnPDLNAValueUnion *base_union;
+        GUPnPDLNAValueUnion *other_union;
+
+        g_return_val_if_fail (base != NULL, 0);
+        g_return_val_if_fail (other != NULL, 0);
+        g_return_val_if_fail (type != NULL, 0);
+
+        base_union = gupnp_dlna_value_get_sort_value (base);
+        other_union = gupnp_dlna_value_get_sort_value (other);
+
+        return gupnp_dlna_value_type_compare (type, base_union, other_union);
+}
+
+GValue *
+gupnp_dlna_value_to_g_value (GUPnPDLNAValue     *base,
+                             GUPnPDLNAValueType *type)
+{
+        GValue *g_value;
+
+        g_return_val_if_fail (base->vtable != NULL, NULL);
+        g_return_val_if_fail (base->vtable->to_g_value != NULL, NULL);
+
+        g_value = g_new0 (GValue, 1);
+
+        if (!base->vtable->to_g_value (base, type, g_value)) {
+                g_free (g_value);
+                g_value = NULL;
+        }
+
+        return g_value;
+}
diff --git a/libgupnp-dlna/gupnp-dlna-value.h b/libgupnp-dlna/gupnp-dlna-value.h
new file mode 100644 (file)
index 0000000..7711151
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_VALUE_H__
+#define __GUPNP_DLNA_VALUE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "gupnp-dlna-info-value.h"
+#include "gupnp-dlna-value-type.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GUPnPDLNAValue GUPnPDLNAValue;
+typedef struct _GUPnPDLNAValueVTable GUPnPDLNAValueVTable;
+
+struct _GUPnPDLNAValue {
+        GUPnPDLNAValueVTable *vtable;
+};
+
+GUPnPDLNAValue *
+gupnp_dlna_value_new_single (GUPnPDLNAValueType *type,
+                             const gchar        *single);
+
+GUPnPDLNAValue *
+gupnp_dlna_value_new_ranged (GUPnPDLNAValueType *type,
+                             const gchar        *min,
+                             const gchar        *max);
+
+gboolean
+gupnp_dlna_value_is_superset (GUPnPDLNAValue     *base,
+                              GUPnPDLNAInfoValue *single);
+
+GUPnPDLNAValue *
+gupnp_dlna_value_copy (GUPnPDLNAValue     *base,
+                       GUPnPDLNAValueType *type);
+
+void
+gupnp_dlna_value_free (GUPnPDLNAValue     *base,
+                       GUPnPDLNAValueType *type);
+
+gchar *
+gupnp_dlna_value_to_string (GUPnPDLNAValue     *base,
+                            GUPnPDLNAValueType *type);
+
+gint
+gupnp_dlna_value_compare (GUPnPDLNAValue     *base,
+                          GUPnPDLNAValue     *other,
+                          GUPnPDLNAValueType *type);
+
+GValue *
+gupnp_dlna_value_to_g_value (GUPnPDLNAValue     *base,
+                             GUPnPDLNAValueType *type);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_VALUE_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-values.h b/libgupnp-dlna/gupnp-dlna-values.h
new file mode 100644 (file)
index 0000000..c80dfe0
--- /dev/null
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_VALUES_H__
+#define __GUPNP_DLNA_VALUES_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION:gupnp-dlna-values
+ * @short_description: State values for metadata attributes.
+ * @title: GUPnP DLNA Values
+ *
+ * The #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue and #GUPnPDLNAStringValue hold respectively
+ * boolean, fraction, integer and string values.
+ *
+ * The value can be in one of three possible states - set, unset or
+ * unsupported. When value is in set state it is possible to use the
+ * underlying value it holds. In other states using such value is
+ * undefined.
+ *
+ * Main difference between unset state and unsupported state is that
+ * the former is set when metadata extractor is capable of extracting
+ * some attribute in general, but current media file does not have
+ * such attribute, while the latter means that metadata extractor has
+ * no idea how to extract such attribute at all.
+ *
+ * One note on #GUPnPDLNAStringValue - it holds a string that has to
+ * be allocated with g_malloc() (that is - g_strdup() and others are
+ * fine as well as they use g_malloc() internally). The string is
+ * freed by consumer.
+ */
+
+/**
+ * GUPnPDLNAValueState:
+ * @GUPNP_DLNA_VALUE_STATE_SET: Value is set.
+ * @GUPNP_DLNA_VALUE_STATE_UNSET: Value is unset.
+ * @GUPNP_DLNA_VALUE_STATE_UNSUPPORTED: Value is unsupported.
+ *
+ * Flags describing a state of GUPnP DLNA Value.
+ */
+typedef enum {
+        GUPNP_DLNA_VALUE_STATE_SET,
+        GUPNP_DLNA_VALUE_STATE_UNSET,
+        GUPNP_DLNA_VALUE_STATE_UNSUPPORTED
+} GUPnPDLNAValueState;
+
+/**
+ * GUPnPDLNABoolValue:
+ * @value: The boolean value.
+ * @state: The state of #GUPnPDLNABoolValue.
+ *
+ * GUPnP DLNA Value representing a boolean value of some metadata attribute.
+ */
+typedef struct {
+        gboolean            value;
+        GUPnPDLNAValueState state;
+} GUPnPDLNABoolValue;
+
+/**
+ * GUPNP_DLNA_BOOL_VALUE_UNSET:
+ *
+ * Static initializer for unset #GUPnPDLNABoolValue. Can be used in
+ * two ways:
+ *
+ * |[
+ *   GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSET;
+ * ]|
+ *
+ * or
+ *
+ * |[
+ *   return GUPNP_DLNA_BOOL_VALUE_UNSET;
+ * ]|
+ */
+#define GUPNP_DLNA_BOOL_VALUE_UNSET \
+        ((GUPnPDLNABoolValue) {FALSE, GUPNP_DLNA_VALUE_STATE_UNSET})
+/**
+ * GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED:
+ *
+ * Static initializer for unsupported #GUPnPDLNABoolValue. Can be used
+ * in two ways:
+ *
+ * |[
+ *   GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED;
+ * ]|
+ *
+ * or
+ *
+ * |[
+ *   return GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED;
+ * ]|
+ */
+#define GUPNP_DLNA_BOOL_VALUE_UNSUPPORTED \
+        ((GUPnPDLNABoolValue) {FALSE, GUPNP_DLNA_VALUE_STATE_UNSUPPORTED})
+
+/**
+ * GUPnPDLNAFractionValue:
+ * @numerator: The numerator of fraction.
+ * @denominator: The denominator of fraction.
+ * @state: The state of #GUPnPDLNAFractionValue.
+ *
+ * GUPnP DLNA Value representing a fraction value of some metadata attribute.
+ */
+typedef struct {
+        gint                numerator;
+        gint                denominator;
+        GUPnPDLNAValueState state;
+} GUPnPDLNAFractionValue;
+
+/**
+ * GUPNP_DLNA_FRACTION_VALUE_UNSET:
+ *
+ * Static initializer for unset #GUPnPDLNAFractionValue. Can be used
+ * in two ways:
+ *
+ * |[
+ *   GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+ * ]|
+ *
+ * or
+ *
+ * |[
+ *   return GUPNP_DLNA_FRACTION_VALUE_UNSET;
+ * ]|
+ */
+#define GUPNP_DLNA_FRACTION_VALUE_UNSET \
+        ((GUPnPDLNAFractionValue) {0, 0, GUPNP_DLNA_VALUE_STATE_UNSET})
+/**
+ * GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED:
+ *
+ * Static initializer for unsupported #GUPnPDLNAFractionValue. Can be
+ * used in two ways:
+ *
+ * |[
+ *   GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED;
+ * ]|
+ *
+ * or
+ *
+ * |[
+ *   return GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED;
+ * ]|
+ */
+#define GUPNP_DLNA_FRACTION_VALUE_UNSUPPORTED \
+        ((GUPnPDLNAFractionValue) {0, 0, GUPNP_DLNA_VALUE_STATE_UNSUPPORTED})
+
+/**
+ * GUPnPDLNAIntValue:
+ * @value: The integer value.
+ * @state: The state of #GUPnPDLNAIntValue.
+ *
+ * GUPnP DLNA Value representing an integer value of some metadata attribute.
+ */
+typedef struct {
+        gint                value;
+        GUPnPDLNAValueState state;
+} GUPnPDLNAIntValue;
+
+/**
+ * GUPNP_DLNA_INT_VALUE_UNSET:
+ *
+ * Static initializer for unset #GUPnPDLNAIntValue. Can be used in
+ * two ways:
+ *
+ * |[
+ *   GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+ * ]|
+ *
+ * or
+ *
+ * |[
+ *   return GUPNP_DLNA_INT_VALUE_UNSET;
+ * ]|
+ */
+#define GUPNP_DLNA_INT_VALUE_UNSET \
+        ((GUPnPDLNAIntValue) {0, GUPNP_DLNA_VALUE_STATE_UNSET})
+/**
+ * GUPNP_DLNA_INT_VALUE_UNSUPPORTED:
+ *
+ * Static initializer for unsupported #GUPnPDLNAIntValue. Can be used in
+ * two ways:
+ *
+ * |[
+ *   GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSUPPORTED;
+ * ]|
+ *
+ * or
+ *
+ * |[
+ *   return GUPNP_DLNA_INT_VALUE_UNSUPPORTED;
+ * ]|
+ */
+#define GUPNP_DLNA_INT_VALUE_UNSUPPORTED \
+        ((GUPnPDLNAIntValue) {0, GUPNP_DLNA_VALUE_STATE_UNSUPPORTED})
+
+/**
+ * GUPnPDLNAStringValue:
+ * @value: The string value.
+ * @state: The state of #GUPnPDLNAStringValue.
+ *
+ * GUPnP DLNA Value representing a string value of some metadata
+ * attribute.
+ */
+typedef struct {
+        gchar               *value;
+        GUPnPDLNAValueState  state;
+} GUPnPDLNAStringValue;
+
+/**
+ * GUPNP_DLNA_STRING_VALUE_UNSET:
+ *
+ * Static initializer for unset #GUPnPDLNAStringValue. Can be used in
+ * two ways:
+ *
+ * |[
+ *   GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+ * ]|
+ *
+ * or
+ *
+ * |[
+ *   return GUPNP_DLNA_STRING_VALUE_UNSET;
+ * ]|
+ */
+#define GUPNP_DLNA_STRING_VALUE_UNSET \
+        ((GUPnPDLNAStringValue) {NULL, GUPNP_DLNA_VALUE_STATE_UNSET})
+/**
+ * GUPNP_DLNA_STRING_VALUE_UNSUPPORTED:
+ *
+ * Static initializer for unsupported #GUPnPDLNAStringValue. Can be
+ * used in two ways:
+ *
+ * |[
+ *   GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSUPPORTED;
+ * ]|
+ *
+ * or
+ *
+ * |[
+ *   return GUPNP_DLNA_STRING_VALUE_UNSUPPORTED;
+ * ]|
+ */
+#define GUPNP_DLNA_STRING_VALUE_UNSUPPORTED \
+        ((GUPnPDLNAStringValue) {NULL, GUPNP_DLNA_VALUE_STATE_UNSUPPORTED})
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_VALUES_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna-video-information.c b/libgupnp-dlna/gupnp-dlna-video-information.c
new file mode 100644 (file)
index 0000000..e1d6c06
--- /dev/null
@@ -0,0 +1,364 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gupnp-dlna-video-information
+ * @short_description: Base class representing video metadata needed
+ * for DLNA profiles matching.
+ * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
+ *
+ * #GUPnPDLNAVideoInformation holds all video metadatas important for
+ * matching profiles. Note that it does not mean all data should be
+ * provided for every video file as in some cases it does not make
+ * sense (e.g. MPEG version does not make sense for Quicktime video
+ * files).
+ *
+ * For metadata attributes that do not exist in current video file an
+ * unset value should be returned. For metadata attributes that do
+ * exist a set value with proper underlying value should be
+ * returned. In case metadata extractor has completely no clue how to
+ * extract some metadata attribute at all, an unsupported value should
+ * be returned. Note that unsupported values should be a temporary
+ * mean before fixing the multimedia framework to be able to extract
+ * such attribute.
+ *
+ * Note that gupnp_dlna_video_information_get_mime() should always
+ * return a set value. Otherwise it is highly probably that the file
+ * will not match against any DLNA profile.
+ */
+
+#include "gupnp-dlna-video-information.h"
+
+G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAVideoInformation,
+                        gupnp_dlna_video_information,
+                        G_TYPE_OBJECT)
+
+struct _GUPnPDLNAVideoInformationPrivate {
+        gpointer placeholder;
+};
+
+static void
+gupnp_dlna_video_information_class_init
+                                    (GUPnPDLNAVideoInformationClass *info_class)
+{
+        info_class->get_bitrate = NULL;
+        info_class->get_framerate = NULL;
+        info_class->get_height = NULL;
+        info_class->is_interlaced = NULL;
+        info_class->get_level = NULL;
+        info_class->get_mpeg_version = NULL;
+        info_class->get_pixel_aspect_ratio = NULL;
+        info_class->get_profile = NULL;
+        info_class->is_system_stream = NULL;
+        info_class->get_width = NULL;
+        info_class->get_mime = NULL;
+
+        g_type_class_add_private (info_class,
+                                  sizeof (GUPnPDLNAVideoInformationPrivate));
+}
+
+static void
+gupnp_dlna_video_information_init (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (info,
+                                         GUPNP_TYPE_DLNA_VIDEO_INFORMATION,
+                                         GUPnPDLNAVideoInformationPrivate);
+
+        info->priv = priv;
+}
+
+/**
+ * gupnp_dlna_video_information_get_bitrate: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: A bitrate.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_video_information_get_bitrate (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_bitrate != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_bitrate (info);
+}
+
+/**
+ * gupnp_dlna_video_information_get_framerate: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: A framerate.
+ */
+GUPnPDLNAFractionValue
+gupnp_dlna_video_information_get_framerate (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_FRACTION_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_FRACTION_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_framerate != NULL,
+                              GUPNP_DLNA_FRACTION_VALUE_UNSET);
+
+        return info_class->get_framerate (info);
+}
+
+/**
+ * gupnp_dlna_video_information_get_height: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: A height.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_video_information_get_height (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_height != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_height (info);
+}
+
+/**
+ * gupnp_dlna_video_information_is_interlaced: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: Whether video is interlaced.
+ */
+GUPnPDLNABoolValue
+gupnp_dlna_video_information_is_interlaced (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_BOOL_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_BOOL_VALUE_UNSET);
+        g_return_val_if_fail (info_class->is_interlaced != NULL,
+                              GUPNP_DLNA_BOOL_VALUE_UNSET);
+
+        return info_class->is_interlaced (info);
+}
+
+/**
+ * gupnp_dlna_video_information_get_level: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: A level.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_video_information_get_level (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_level != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_level (info);
+}
+
+/**
+ * gupnp_dlna_video_information_get_mpeg_version: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: An MPEG version.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_video_information_get_mpeg_version (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_mpeg_version != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_mpeg_version (info);
+}
+
+/**
+ * gupnp_dlna_video_information_get_pixel_aspect_ratio: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: A pixel-aspect-ratio.
+ */
+GUPnPDLNAFractionValue
+gupnp_dlna_video_information_get_pixel_aspect_ratio
+                                        (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_FRACTION_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_FRACTION_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_pixel_aspect_ratio != NULL,
+                              GUPNP_DLNA_FRACTION_VALUE_UNSET);
+
+        return info_class->get_pixel_aspect_ratio (info);
+}
+
+/**
+ * gupnp_dlna_video_information_get_profile: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: A profile.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_video_information_get_profile (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_profile != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_profile (info);
+}
+
+/**
+ * gupnp_dlna_video_information_is_system_stream: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: Whether it is a system stream.
+ */
+GUPnPDLNABoolValue
+gupnp_dlna_video_information_is_system_stream (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_BOOL_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_BOOL_VALUE_UNSET);
+        g_return_val_if_fail (info_class->is_system_stream != NULL,
+                              GUPNP_DLNA_BOOL_VALUE_UNSET);
+
+        return info_class->is_system_stream (info);
+}
+
+/**
+ * gupnp_dlna_video_information_get_width: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: A width.
+ */
+GUPnPDLNAIntValue
+gupnp_dlna_video_information_get_width (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_INT_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_width != NULL,
+                              GUPNP_DLNA_INT_VALUE_UNSET);
+
+        return info_class->get_width (info);
+}
+
+/**
+ * gupnp_dlna_video_information_get_mime: (skip)
+ * @info: A #GUPnPDLNAVideoInformation object.
+ *
+ * Returns: A MIME type.
+ */
+GUPnPDLNAStringValue
+gupnp_dlna_video_information_get_mime (GUPnPDLNAVideoInformation *info)
+{
+        GUPnPDLNAVideoInformationClass *info_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_VIDEO_INFORMATION (info),
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        info_class = GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS (info);
+
+        g_return_val_if_fail
+                            (GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS (info_class),
+                             GUPNP_DLNA_STRING_VALUE_UNSET);
+        g_return_val_if_fail (info_class->get_mime != NULL,
+                              GUPNP_DLNA_STRING_VALUE_UNSET);
+
+        return info_class->get_mime (info);
+}
diff --git a/libgupnp-dlna/gupnp-dlna-video-information.h b/libgupnp-dlna/gupnp-dlna-video-information.h
new file mode 100644 (file)
index 0000000..778d631
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_VIDEO_INFORMATION_H__
+#define __GUPNP_DLNA_VIDEO_INFORMATION_H__
+
+#include <glib-object.h>
+#include <libgupnp-dlna/gupnp-dlna-values.h>
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_VIDEO_INFORMATION \
+        (gupnp_dlna_video_information_get_type())
+
+#define GUPNP_DLNA_VIDEO_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_VIDEO_INFORMATION, \
+                                     GUPnPDLNAVideoInformation))
+
+#define GUPNP_DLNA_VIDEO_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_VIDEO_INFORMATION, \
+                                  GUPnPDLNAVideoInformationClass))
+
+#define GUPNP_IS_DLNA_VIDEO_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_VIDEO_INFORMATION))
+
+#define GUPNP_IS_DLNA_VIDEO_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_VIDEO_INFORMATION))
+
+#define GUPNP_DLNA_VIDEO_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_VIDEO_INFORMATION, \
+                                    GUPnPDLNAVideoInformationClass))
+
+typedef struct _GUPnPDLNAVideoInformationPrivate
+                GUPnPDLNAVideoInformationPrivate;
+
+typedef struct {
+        GObject parent;
+
+        GUPnPDLNAVideoInformationPrivate *priv;
+} GUPnPDLNAVideoInformation;
+
+/**
+ * GUPnPDLNAVideoInformationClass:
+ * @parent_class: Parent class.
+ * @get_bitrate: This is called by #GUPnPDLNAProfileGuesser to get a
+ * bitrate.
+ * @get_framerate: This is called by #GUPnPDLNAProfileGuesser to get a
+ * framerate.
+ * @get_height: This is called by #GUPnPDLNAProfileGuesser to get a
+ * height.
+ * @is_interlaced: This is called by #GUPnPDLNAProfileGuesser to get
+ * whether it is interlaced.
+ * @get_level: This is called by #GUPnPDLNAProfileGuesser to get a
+ * level.
+ * @get_mpeg_version: This is called by #GUPnPDLNAProfileGuesser to
+ * get an MPEG version.
+ * @get_pixel_aspect_ratio: This is called by #GUPnPDLNAProfileGuesser
+ * to get a pixel-aspect-ratio.
+ * @get_profile: This is called by #GUPnPDLNAProfileGuesser to get a
+ * profile.
+ * @is_system_stream: This is called by #GUPnPDLNAProfileGuesser to
+ * get whether it is a system stream.
+ * @get_width: This is called by #GUPnPDLNAProfileGuesser to get a
+ * width.
+ * @get_mime: This is called by #GUPnPDLNAProfileGuesser to get a MIME
+ * type.
+ * @_reserved: Padding. Ignore it.
+ */
+typedef struct {
+        GObjectClass parent_class;
+
+        GUPnPDLNAIntValue
+        (* get_bitrate) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAFractionValue
+        (* get_framerate) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_height) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNABoolValue
+        (* is_interlaced) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_level) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_mpeg_version) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAFractionValue
+        (* get_pixel_aspect_ratio) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_profile) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNABoolValue
+        (* is_system_stream) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAIntValue
+        (* get_width) (GUPnPDLNAVideoInformation *info);
+
+        GUPnPDLNAStringValue
+        (* get_mime) (GUPnPDLNAVideoInformation *info);
+
+        gpointer _reserved[12];
+} GUPnPDLNAVideoInformationClass;
+
+GType
+gupnp_dlna_video_information_get_type (void);
+
+GUPnPDLNAIntValue
+gupnp_dlna_video_information_get_bitrate (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNAFractionValue
+gupnp_dlna_video_information_get_framerate (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_video_information_get_height (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNABoolValue
+gupnp_dlna_video_information_is_interlaced (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_video_information_get_level (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_video_information_get_mpeg_version (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNAFractionValue
+gupnp_dlna_video_information_get_pixel_aspect_ratio
+                                        (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_video_information_get_profile (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNABoolValue
+gupnp_dlna_video_information_is_system_stream (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNAIntValue
+gupnp_dlna_video_information_get_width (GUPnPDLNAVideoInformation *info);
+
+GUPnPDLNAStringValue
+gupnp_dlna_video_information_get_mime (GUPnPDLNAVideoInformation *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_VIDEO_INFORMATION_H__ */
diff --git a/libgupnp-dlna/gupnp-dlna.h b/libgupnp-dlna/gupnp-dlna.h
new file mode 100644 (file)
index 0000000..258c297
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 Intel Corporation.
+ *
+ * Authors: Jens Georg <jensg@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-profile-guesser.h"
+#include "gupnp-dlna-profile.h"
+#include "gupnp-dlna-restriction.h"
+#include "gupnp-dlna-value-list.h"
+#include "gupnp-dlna-g-values.h"
+#include "gupnp-dlna-audio-information.h"
+#include "gupnp-dlna-container-information.h"
+#include "gupnp-dlna-image-information.h"
+#include "gupnp-dlna-video-information.h"
+#include "gupnp-dlna-information.h"
+#include "gupnp-dlna-values.h"
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gstreamer.am b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gstreamer.am
new file mode 100644 (file)
index 0000000..c7b4c54
--- /dev/null
@@ -0,0 +1,59 @@
+gst_legacy_metadata_backend_libadd = \
+       $(common_libadd) \
+       $(GST_LEGACY_LIBS) \
+       $(GST_PBU_LEGACY_LIBS) \
+       libgupnp-dlna-2.0.la
+gst_legacy_metadata_backend_cflags = \
+       $(common_cflags) \
+       $(GST_LEGACY_CFLAGS) \
+       $(GST_PBU_LEGACY_CFLAGS) \
+       $(metadata_log_cflags) \
+       $(metadata_cflags)
+
+gstreamer_legacy_metadata_backend = \
+       metadata-backends/gstreamer-legacy/libgstreamer-legacy.la
+gstreamer_legacy_utils_lib = \
+       metadata-backends/gstreamer-legacy/libgupnp-dlna-gst-legacy-2.0.la
+metadata_LTLIBRARIES += \
+       $(gstreamer_legacy_metadata_backend)
+lib_LTLIBRARIES += \
+       $(gstreamer_legacy_utils_lib)
+
+metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_LDFLAGS = \
+       -no-undefined \
+       -shared -fPIC -module -avoid-version -Wl,-z,defs
+metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_SOURCES = \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c
+metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_LIBADD = \
+       $(gst_legacy_metadata_backend_libadd) \
+       $(gstreamer_legacy_utils_lib)
+metadata_backends_gstreamer_legacy_libgstreamer_legacy_la_CFLAGS = \
+       $(gst_legacy_metadata_backend_cflags)
+
+metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_LDFLAGS = \
+       $(gupnp_ldflags)
+metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_SOURCES = \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c
+metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_LIBADD = \
+       $(gst_legacy_metadata_backend_libadd)
+metadata_backends_gstreamer_legacy_libgupnp_dlna_gst_legacy_2_0_la_CFLAGS = \
+       $(gst_legacy_metadata_backend_cflags)
+
+dist_noinst_HEADERS += \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.h \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.h
+
+libgupnp_dlna_inc_HEADERS += \
+       metadata-backends/gstreamer-legacy/gupnp-dlna-gst-legacy-utils.h
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.c
new file mode 100644 (file)
index 0000000..097cad5
--- /dev/null
@@ -0,0 +1,392 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-audio-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstAudioInformation,
+               gupnp_dlna_gst_audio_information,
+               GUPNP_TYPE_DLNA_AUDIO_INFORMATION)
+
+struct _GUPnPDLNAGstAudioInformationPrivate {
+        GstDiscovererInfo *info;
+        GList *stream_list;
+        GstDiscovererAudioInfo *audio_info;
+        GstCaps *caps;
+};
+
+enum
+{
+        PROP_0,
+
+        PROP_INFO
+};
+
+static GstDiscovererAudioInfo *
+get_audio_info (GUPnPDLNAGstAudioInformation *gst_info)
+{
+        GUPnPDLNAGstAudioInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->audio_info) {
+                GList *iter;
+
+                if (!priv->stream_list) {
+                        priv->stream_list =
+                               gst_discoverer_info_get_stream_list (priv->info);
+                        if (!priv->stream_list)
+                                return NULL;
+                }
+
+                for (iter = priv->stream_list; iter; iter = iter->next) {
+                        GstDiscovererStreamInfo *stream =
+                                        GST_DISCOVERER_STREAM_INFO (iter->data);
+                        GType stream_type = G_TYPE_FROM_INSTANCE (stream);
+
+                        if (stream_type == GST_TYPE_DISCOVERER_AUDIO_INFO) {
+                                priv->audio_info =
+                                             GST_DISCOVERER_AUDIO_INFO (stream);
+
+                                break;
+                        }
+                }
+        }
+
+        return priv->audio_info;
+}
+
+static GstCaps *
+get_caps (GUPnPDLNAGstAudioInformation *gst_info)
+{
+        GUPnPDLNAGstAudioInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->caps)
+                priv->caps = gst_discoverer_stream_info_get_caps
+                       (GST_DISCOVERER_STREAM_INFO (get_audio_info (gst_info)));
+
+        return priv->caps;
+}
+
+static GUPnPDLNAIntValue
+get_int_value (GUPnPDLNAGstAudioInformation *gst_info,
+               const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_audio_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_int_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAStringValue
+get_string_value (GUPnPDLNAGstAudioInformation *gst_info,
+                  const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_audio_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_string_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAIntValue
+backend_get_bitrate (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        GstDiscovererAudioInfo *audio_info = get_audio_info (gst_info);
+        guint data = gst_discoverer_audio_info_get_bitrate (audio_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_channels (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        GstDiscovererAudioInfo *audio_info = get_audio_info (gst_info);
+        guint data = gst_discoverer_audio_info_get_channels (audio_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_depth (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        GstDiscovererAudioInfo *audio_info = get_audio_info (gst_info);
+        guint data = gst_discoverer_audio_info_get_depth (audio_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_layer (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_int_value (gst_info, "layer");
+}
+
+static GUPnPDLNAStringValue
+backend_get_level (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        return get_string_value (gst_info, "level");
+}
+
+static GUPnPDLNAIntValue
+backend_get_mpeg_audio_version (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_int_value (gst_info, "mpegaudioversion");
+}
+
+static GUPnPDLNAIntValue
+backend_get_mpeg_version (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_int_value (gst_info, "mpegversion");
+}
+
+static GUPnPDLNAStringValue
+backend_get_profile (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_string_value (gst_info, "profile");
+}
+
+static GUPnPDLNAIntValue
+backend_get_rate (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        GstDiscovererAudioInfo *audio_info = get_audio_info (gst_info);
+        guint data = gst_discoverer_audio_info_get_sample_rate (audio_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_stream_format (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_string_value (gst_info, "stream-format");
+}
+
+static GUPnPDLNAIntValue
+backend_get_wma_version (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_int_value (gst_info, "wmaversion");
+}
+
+static GUPnPDLNAStringValue
+backend_get_mime (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return gupnp_dlna_gst_get_mime (get_caps (gst_info));
+}
+
+static void
+gupnp_dlna_gst_audio_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstAudioInformation *info =
+                                      GUPNP_DLNA_GST_AUDIO_INFORMATION (object);
+        GUPnPDLNAGstAudioInformationPrivate *priv = info->priv;
+        GObjectClass *parent_class =
+                 G_OBJECT_CLASS (gupnp_dlna_gst_audio_information_parent_class);
+
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        g_clear_pointer (&priv->stream_list,
+                         gst_discoverer_stream_info_list_free);
+        /* priv->audio_info is freed with stream list above */
+        priv->audio_info = NULL;
+        g_clear_pointer (&priv->caps, gst_caps_unref);
+        parent_class->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_audio_information_set_property (GObject      *object,
+                                               guint         property_id,
+                                               const GValue *value,
+                                               GParamSpec   *pspec)
+{
+        GUPnPDLNAGstAudioInformation *info =
+                                      GUPNP_DLNA_GST_AUDIO_INFORMATION (object);
+        GUPnPDLNAGstAudioInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (gst_value_dup_mini_object (value));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_audio_information_get_property (GObject    *object,
+                                               guint       property_id,
+                                               GValue     *value,
+                                               GParamSpec *pspec)
+{
+        GUPnPDLNAGstAudioInformation *info =
+                                      GUPNP_DLNA_GST_AUDIO_INFORMATION (object);
+        GUPnPDLNAGstAudioInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                gst_value_set_mini_object (value, GST_MINI_OBJECT (priv->info));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_audio_information_class_init
+                             (GUPnPDLNAGstAudioInformationClass *gst_info_class)
+{
+        GUPnPDLNAAudioInformationClass *info_class =
+                            GUPNP_DLNA_AUDIO_INFORMATION_CLASS (gst_info_class);
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->get_property =
+                                  gupnp_dlna_gst_audio_information_get_property;
+        object_class->set_property =
+                                  gupnp_dlna_gst_audio_information_set_property;
+        object_class->dispose = gupnp_dlna_gst_audio_information_dispose;
+
+        info_class->get_bitrate = backend_get_bitrate;
+        info_class->get_channels = backend_get_channels;
+        info_class->get_depth = backend_get_depth;
+        info_class->get_layer = backend_get_layer;
+        info_class->get_level = backend_get_level;
+        info_class->get_mpeg_audio_version = backend_get_mpeg_audio_version;
+        info_class->get_mpeg_version = backend_get_mpeg_version;
+        info_class->get_profile = backend_get_profile;
+        info_class->get_rate = backend_get_rate;
+        info_class->get_stream_format = backend_get_stream_format;
+        info_class->get_wma_version = backend_get_wma_version;
+        info_class->get_mime = backend_get_mime;
+
+        pspec = gst_param_spec_mini_object ("info",
+                                            "info",
+                                            "discoverer info",
+                                            GST_TYPE_DISCOVERER_INFO,
+                                            G_PARAM_READWRITE |
+                                            G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private (gst_info_class,
+                                  sizeof (GUPnPDLNAGstAudioInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_audio_information_init (GUPnPDLNAGstAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION,
+                                         GUPnPDLNAGstAudioInformationPrivate);
+
+        priv->info = NULL;
+        priv->stream_list = NULL;
+        priv->audio_info = NULL;
+        priv->caps = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstAudioInformation *
+gupnp_dlna_gst_audio_information_new_from_discoverer_info (GstDiscovererInfo *info)
+{
+        GList* audio_list;
+        GUPnPDLNAGstAudioInformation *audio_info = NULL;
+
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        audio_list = gst_discoverer_info_get_audio_streams (info);
+
+        if (audio_list) {
+                audio_info = GUPNP_DLNA_GST_AUDIO_INFORMATION (g_object_new
+                                         (GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION,
+                                          "info", info,
+                                          NULL));
+                gst_discoverer_stream_info_list_free (audio_list);
+        }
+
+        return audio_info;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.h b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-audio-information.h
new file mode 100644 (file)
index 0000000..612cdb5
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_AUDIO_INFORMATION_H__
+#define __GUPNP_DLNA_GST_AUDIO_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-audio-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION \
+        (gupnp_dlna_gst_audio_information_get_type())
+
+#define GUPNP_DLNA_GST_AUDIO_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION, \
+                                     GUPnPDLNAGstAudioInformation))
+
+#define GUPNP_DLNA_GST_AUDIO_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION, \
+                                  GUPnPDLNAGstAudioInformationClass))
+
+#define GUPNP_IS_DLNA_GST_AUDIO_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_AUDIO_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION))
+
+#define GUPNP_DLNA_GST_AUDIO_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION, \
+                                    GUPnPDLNAGstAudioInformationClass))
+
+typedef struct _GUPnPDLNAGstAudioInformationPrivate
+                GUPnPDLNAGstAudioInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAAudioInformation parent;
+
+        GUPnPDLNAGstAudioInformationPrivate *priv;
+} GUPnPDLNAGstAudioInformation;
+
+typedef struct {
+        GUPnPDLNAAudioInformationClass parent_class;
+} GUPnPDLNAGstAudioInformationClass;
+
+GType
+gupnp_dlna_gst_audio_information_get_type (void);
+
+GUPnPDLNAGstAudioInformation *
+gupnp_dlna_gst_audio_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_AUDIO_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.c
new file mode 100644 (file)
index 0000000..ca983ec
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-container-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstContainerInformation,
+               gupnp_dlna_gst_container_information,
+               GUPNP_TYPE_DLNA_CONTAINER_INFORMATION)
+
+struct _GUPnPDLNAGstContainerInformationPrivate {
+        GstDiscovererInfo *info;
+        GstDiscovererStreamInfo *container_info;
+        GstCaps *caps;
+};
+
+enum
+{
+        PROP_0,
+
+        PROP_INFO
+};
+
+static GstDiscovererStreamInfo *
+get_container_info (GUPnPDLNAGstContainerInformation *gst_info)
+{
+        GUPnPDLNAGstContainerInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->container_info) {
+                priv->container_info =
+                               gst_discoverer_info_get_stream_info (priv->info);
+        }
+
+        return priv->container_info;
+}
+
+static GstCaps *
+get_caps (GUPnPDLNAGstContainerInformation *gst_info)
+{
+        GUPnPDLNAGstContainerInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->caps) {
+                priv->caps = gst_discoverer_stream_info_get_caps
+                                        (get_container_info (gst_info));
+        }
+
+        return priv->caps;
+}
+
+static GUPnPDLNAIntValue
+get_int_value (GUPnPDLNAGstContainerInformation *gst_info,
+               const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream = get_container_info (gst_info);
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_int_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAStringValue
+get_string_value (GUPnPDLNAGstContainerInformation *gst_info,
+                  const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream = get_container_info (gst_info);
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_string_value (caps, stream, info, name);
+}
+
+static GUPnPDLNABoolValue
+get_bool_value (GUPnPDLNAGstContainerInformation *gst_info,
+                const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream = get_container_info (gst_info);
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_bool_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAIntValue
+backend_get_mpeg_version (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_int_value (gst_info, "mpegversion");
+}
+
+static GUPnPDLNAIntValue
+backend_get_packet_size (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_int_value (gst_info, "packetsize");
+}
+
+static GUPnPDLNAStringValue
+backend_get_profile (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_string_value (gst_info, "profile");
+}
+
+static GUPnPDLNABoolValue
+backend_is_system_stream (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_bool_value (gst_info, "systemstream");
+}
+
+static GUPnPDLNAStringValue
+backend_get_variant (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_string_value (gst_info, "variant");
+}
+
+static GUPnPDLNAStringValue
+backend_get_mime (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return gupnp_dlna_gst_get_mime (get_caps (gst_info));
+}
+
+static void
+gupnp_dlna_gst_container_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstContainerInformation *info =
+                                  GUPNP_DLNA_GST_CONTAINER_INFORMATION (object);
+        GUPnPDLNAGstContainerInformationPrivate *priv = info->priv;
+        GObjectClass *parent_class =
+             G_OBJECT_CLASS (gupnp_dlna_gst_container_information_parent_class);
+
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        g_clear_pointer (&priv->container_info,
+                         gupnp_dlna_gst_discoverer_stream_info_unref);
+        g_clear_pointer (&priv->caps, gst_caps_unref);
+        parent_class->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_container_information_set_property (GObject      *object,
+                                                   guint         property_id,
+                                                   const GValue *value,
+                                                   GParamSpec   *pspec)
+{
+        GUPnPDLNAGstContainerInformation *info =
+                                  GUPNP_DLNA_GST_CONTAINER_INFORMATION (object);
+        GUPnPDLNAGstContainerInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (gst_value_dup_mini_object (value));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_container_information_get_property (GObject    *object,
+                                                   guint       property_id,
+                                                   GValue     *value,
+                                                   GParamSpec *pspec)
+{
+        GUPnPDLNAGstContainerInformation *info =
+                                  GUPNP_DLNA_GST_CONTAINER_INFORMATION (object);
+        GUPnPDLNAGstContainerInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                gst_value_set_mini_object (value, GST_MINI_OBJECT (priv->info));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_container_information_class_init
+                         (GUPnPDLNAGstContainerInformationClass *gst_info_class)
+{
+        GUPnPDLNAContainerInformationClass *info_class =
+                        GUPNP_DLNA_CONTAINER_INFORMATION_CLASS (gst_info_class);
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->get_property =
+                              gupnp_dlna_gst_container_information_get_property;
+        object_class->set_property =
+                              gupnp_dlna_gst_container_information_set_property;
+        object_class->dispose = gupnp_dlna_gst_container_information_dispose;
+
+        info_class->get_mpeg_version = backend_get_mpeg_version;
+        info_class->get_packet_size = backend_get_packet_size;
+        info_class->get_profile = backend_get_profile;
+        info_class->is_system_stream = backend_is_system_stream;
+        info_class->get_variant = backend_get_variant;
+        info_class->get_mime = backend_get_mime;
+
+        pspec = gst_param_spec_mini_object ("info",
+                                            "info",
+                                            "discoverer info",
+                                            GST_TYPE_DISCOVERER_INFO,
+                                            G_PARAM_READWRITE |
+                                            G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private
+                             (gst_info_class,
+                              sizeof (GUPnPDLNAGstContainerInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_container_information_init
+                                        (GUPnPDLNAGstContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformationPrivate *priv =
+                G_TYPE_INSTANCE_GET_PRIVATE
+                                     (self,
+                                      GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION,
+                                      GUPnPDLNAGstContainerInformationPrivate);
+
+        priv->info = NULL;
+        priv->container_info = NULL;
+        priv->caps = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstContainerInformation *
+gupnp_dlna_gst_container_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info)
+{
+        GUPnPDLNAGstContainerInformation *container_info = NULL;
+        GstDiscovererStreamInfo *stream_info;
+
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        stream_info = gst_discoverer_info_get_stream_info (info);
+
+        if (stream_info) {
+                GType type = G_TYPE_FROM_INSTANCE (stream_info);
+
+                if (type == GST_TYPE_DISCOVERER_CONTAINER_INFO)
+                        container_info = GUPNP_DLNA_GST_CONTAINER_INFORMATION
+                                (g_object_new
+                                     (GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION,
+                                      "info", info,
+                                      NULL));
+                gst_discoverer_stream_info_unref (stream_info);
+        }
+
+        return container_info;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.h b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-container-information.h
new file mode 100644 (file)
index 0000000..775253d
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_CONTAINER_INFORMATION_H__
+#define __GUPNP_DLNA_GST_CONTAINER_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-container-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION \
+        (gupnp_dlna_gst_container_information_get_type())
+
+#define GUPNP_DLNA_GST_CONTAINER_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST \
+                                   ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION, \
+                                    GUPnPDLNAGstContainerInformation))
+
+#define GUPNP_DLNA_GST_CONTAINER_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION, \
+                                  GUPnPDLNAGstContainerInformationClass))
+
+#define GUPNP_IS_DLNA_GST_CONTAINER_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_CONTAINER_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION))
+
+#define GUPNP_DLNA_GST_CONTAINER_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION, \
+                                    GUPnPDLNAGstContainerInformationClass))
+
+typedef struct _GUPnPDLNAGstContainerInformationPrivate
+                GUPnPDLNAGstContainerInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAContainerInformation parent;
+
+        GUPnPDLNAGstContainerInformationPrivate *priv;
+} GUPnPDLNAGstContainerInformation;
+
+typedef struct {
+        GUPnPDLNAContainerInformationClass parent_class;
+} GUPnPDLNAGstContainerInformationClass;
+
+GType
+gupnp_dlna_gst_container_information_get_type (void);
+
+GUPnPDLNAGstContainerInformation *
+gupnp_dlna_gst_container_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_CONTAINER_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.c
new file mode 100644 (file)
index 0000000..d5d72f5
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-image-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstImageInformation,
+               gupnp_dlna_gst_image_information,
+               GUPNP_TYPE_DLNA_IMAGE_INFORMATION)
+
+struct _GUPnPDLNAGstImageInformationPrivate {
+        GstDiscovererInfo *info;
+        GList *stream_list;
+        GstDiscovererVideoInfo *image_info;
+        GstCaps *caps;
+};
+
+enum
+{
+        PROP_0,
+
+        PROP_INFO
+};
+
+static GstDiscovererVideoInfo *
+get_image_info (GUPnPDLNAGstImageInformation *gst_info)
+{
+        GUPnPDLNAGstImageInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->image_info) {
+                GList *iter;
+
+                if (!priv->stream_list) {
+                        priv->stream_list =
+                               gst_discoverer_info_get_stream_list (priv->info);
+                        if (!priv->stream_list)
+                                return NULL;
+                }
+
+                for (iter = priv->stream_list; iter; iter = iter->next) {
+                        GstDiscovererStreamInfo *stream =
+                                        GST_DISCOVERER_STREAM_INFO (iter->data);
+                        GType stream_type = G_TYPE_FROM_INSTANCE (stream);
+
+                        if (stream_type == GST_TYPE_DISCOVERER_VIDEO_INFO) {
+                                priv->image_info =
+                                             GST_DISCOVERER_VIDEO_INFO (stream);
+
+                                break;
+                        }
+                }
+        }
+
+        return priv->image_info;
+}
+
+static GstCaps *
+get_caps (GUPnPDLNAGstImageInformation *gst_info)
+{
+        GUPnPDLNAGstImageInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->caps)
+                priv->caps = gst_discoverer_stream_info_get_caps
+                                        (GST_DISCOVERER_STREAM_INFO
+                                                   (get_image_info (gst_info)));
+
+        return priv->caps;
+}
+
+static GUPnPDLNAIntValue
+backend_get_depth (GUPnPDLNAImageInformation *self)
+{
+        GUPnPDLNAGstImageInformation *gst_info =
+                                        GUPNP_DLNA_GST_IMAGE_INFORMATION (self);
+        GstDiscovererVideoInfo *image_info = get_image_info (gst_info);
+        guint data = gst_discoverer_video_info_get_depth (image_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_height (GUPnPDLNAImageInformation *self)
+{
+        GUPnPDLNAGstImageInformation* gst_info =
+                                        GUPNP_DLNA_GST_IMAGE_INFORMATION (self);
+        GstDiscovererVideoInfo *image_info = get_image_info (gst_info);
+        guint data = gst_discoverer_video_info_get_height (image_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_width (GUPnPDLNAImageInformation *self)
+{
+        GUPnPDLNAGstImageInformation* gst_info =
+                                        GUPNP_DLNA_GST_IMAGE_INFORMATION (self);
+        GstDiscovererVideoInfo *image_info = get_image_info (gst_info);
+        guint data = gst_discoverer_video_info_get_width (image_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_mime (GUPnPDLNAImageInformation *self)
+{
+        GUPnPDLNAGstImageInformation* gst_info =
+                                        GUPNP_DLNA_GST_IMAGE_INFORMATION (self);
+
+        return gupnp_dlna_gst_get_mime (get_caps (gst_info));
+}
+
+static void
+gupnp_dlna_gst_image_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstImageInformation *info =
+                                      GUPNP_DLNA_GST_IMAGE_INFORMATION (object);
+        GUPnPDLNAGstImageInformationPrivate *priv = info->priv;
+        GObjectClass *parent_class =
+                 G_OBJECT_CLASS (gupnp_dlna_gst_image_information_parent_class);
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        g_clear_pointer (&priv->stream_list,
+                         gst_discoverer_stream_info_list_free);
+        /* priv->image_info is freed with stream list above */
+        priv->image_info = NULL;
+        g_clear_pointer (&priv->caps, gst_caps_unref);
+        parent_class->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_image_information_set_property (GObject      *object,
+                                               guint         property_id,
+                                               const GValue *value,
+                                               GParamSpec   *pspec)
+{
+        GUPnPDLNAGstImageInformation *info =
+                                      GUPNP_DLNA_GST_IMAGE_INFORMATION (object);
+        GUPnPDLNAGstImageInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (gst_value_dup_mini_object (value));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_image_information_get_property (GObject    *object,
+                                               guint       property_id,
+                                               GValue     *value,
+                                               GParamSpec *pspec)
+{
+        GUPnPDLNAGstImageInformation *info =
+                                      GUPNP_DLNA_GST_IMAGE_INFORMATION (object);
+        GUPnPDLNAGstImageInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                gst_value_set_mini_object (value, GST_MINI_OBJECT (priv->info));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_image_information_class_init
+                             (GUPnPDLNAGstImageInformationClass *gst_info_class)
+{
+        GUPnPDLNAImageInformationClass *info_class =
+                            GUPNP_DLNA_IMAGE_INFORMATION_CLASS (gst_info_class);
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->get_property =
+                                  gupnp_dlna_gst_image_information_get_property;
+        object_class->set_property =
+                                  gupnp_dlna_gst_image_information_set_property;
+        object_class->dispose = gupnp_dlna_gst_image_information_dispose;
+
+        info_class->get_depth = backend_get_depth;
+        info_class->get_height = backend_get_height;
+        info_class->get_width = backend_get_width;
+        info_class->get_mime = backend_get_mime;
+
+        pspec = gst_param_spec_mini_object ("info",
+                                            "info",
+                                            "discoverer info",
+                                            GST_TYPE_DISCOVERER_INFO,
+                                            G_PARAM_READWRITE |
+                                            G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private (gst_info_class,
+                                  sizeof (GUPnPDLNAGstImageInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_image_information_init (GUPnPDLNAGstImageInformation *self)
+{
+        GUPnPDLNAGstImageInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION,
+                                         GUPnPDLNAGstImageInformationPrivate);
+
+        priv->info = NULL;
+        priv->stream_list = NULL;
+        priv->image_info = NULL;
+        priv->caps = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstImageInformation *
+gupnp_dlna_gst_image_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info)
+{
+        GList* image_list;
+        GUPnPDLNAGstImageInformation *image_info = NULL;
+
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        image_list = gst_discoverer_info_get_video_streams (info);
+
+        if (image_list) {
+                if ((image_list->next == NULL) &&
+                    gst_discoverer_video_info_is_image
+                                 (GST_DISCOVERER_VIDEO_INFO (image_list->data)))
+                        image_info = GUPNP_DLNA_GST_IMAGE_INFORMATION
+                                (g_object_new
+                                         (GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION,
+                                          "info", info,
+                                          NULL));
+                gst_discoverer_stream_info_list_free (image_list);
+        }
+
+        return image_info;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.h b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-image-information.h
new file mode 100644 (file)
index 0000000..b6dcfc3
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_IMAGE_INFORMATION_H__
+#define __GUPNP_DLNA_GST_IMAGE_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-image-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION \
+        (gupnp_dlna_gst_image_information_get_type())
+
+#define GUPNP_DLNA_GST_IMAGE_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION, \
+                                     GUPnPDLNAGstImageInformation))
+
+#define GUPNP_DLNA_GST_IMAGE_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION, \
+                                  GUPnPDLNAGstImageInformationClass))
+
+#define GUPNP_IS_DLNA_GST_IMAGE_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_IMAGE_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION))
+
+#define GUPNP_DLNA_GST_IMAGE_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION, \
+                                    GUPnPDLNAGstImageInformationClass))
+
+typedef struct _GUPnPDLNAGstImageInformationPrivate
+                GUPnPDLNAGstImageInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAImageInformation parent;
+
+        GUPnPDLNAGstImageInformationPrivate *priv;
+} GUPnPDLNAGstImageInformation;
+
+typedef struct {
+        GUPnPDLNAImageInformationClass parent_class;
+} GUPnPDLNAGstImageInformationClass;
+
+GType
+gupnp_dlna_gst_image_information_get_type (void);
+
+GUPnPDLNAGstImageInformation *
+gupnp_dlna_gst_image_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_IMAGE_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.c
new file mode 100644 (file)
index 0000000..288ada5
--- /dev/null
@@ -0,0 +1,431 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-gst-info-utils.h"
+
+void
+gupnp_dlna_gst_discoverer_info_unref (gpointer info)
+{
+        if (info)
+                gst_discoverer_info_unref (info);
+}
+
+void
+gupnp_dlna_gst_discoverer_stream_info_unref (gpointer stream)
+{
+        gst_discoverer_stream_info_unref (stream);
+}
+
+static GUPnPDLNAStringValue
+get_string_value_from_structure (const GstStructure *st,
+                                 const gchar *name)
+{
+        GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+
+        if (st != NULL) {
+                const gchar* data = gst_structure_get_string (st, name);
+
+                if (data != NULL) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = g_strdup (data);
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+get_string_value_from_tag_list (const GstTagList *tags,
+                                const gchar *name)
+{
+        GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+
+        if (tags != NULL) {
+                const GValue *g_value = gst_tag_list_get_value_index (tags,
+                                                                      name,
+                                                                      0);
+
+                if (g_value != NULL && G_VALUE_HOLDS_STRING (g_value)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = g_value_dup_string (g_value);
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+get_int_value_from_structure (const GstStructure *st,
+                              const gchar *name)
+{
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (st != NULL) {
+                gint idata;
+                guint udata;
+
+                if (gst_structure_get_int (st, name, &idata)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = idata;
+                } else if (gst_structure_get_uint (st, name, &udata)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = (gint) udata;
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+get_int_value_from_tag_list (const GstTagList *tags,
+                             const gchar *name)
+{
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (tags != NULL) {
+                const GValue *g_value = gst_tag_list_get_value_index (tags,
+                                                                      name,
+                                                                      0);
+
+                if (g_value != NULL) {
+                        if (G_VALUE_HOLDS_INT (g_value)) {
+                                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                                value.value = g_value_get_int (g_value);
+                        } else if (G_VALUE_HOLDS_UINT (g_value)) {
+                                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                                value.value = g_value_get_uint (g_value);
+                        }
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNABoolValue
+get_bool_value_from_structure (const GstStructure *st,
+                               const gchar *name)
+{
+        GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSET;
+
+        if (st != NULL) {
+                gboolean data;
+
+                if (gst_structure_get_boolean (st, name, &data)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = data;
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNABoolValue
+get_bool_value_from_tag_list (const GstTagList *tags,
+                              const gchar *name)
+{
+        GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSET;
+
+        if (tags != NULL) {
+                const GValue *g_value = gst_tag_list_get_value_index (tags,
+                                                                      name,
+                                                                      0);
+
+                if (g_value != NULL && G_VALUE_HOLDS_BOOLEAN (g_value)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = g_value_get_boolean (g_value);
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAFractionValue
+get_fraction_value_from_structure (const GstStructure *st,
+                                   const gchar *name)
+{
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (st != NULL) {
+                gint ndata;
+                gint ddata;
+
+                if (gst_structure_get_fraction (st, name, &ndata, &ddata)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.numerator = ndata;
+                        value.denominator = ddata;
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAFractionValue
+get_fraction_value_from_tag_list (const GstTagList *tags,
+                                  const gchar *name)
+{
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (tags != NULL) {
+                const GValue *g_value = gst_tag_list_get_value_index (tags,
+                                                                      name,
+                                                                      0);
+
+                if (g_value != NULL && GST_VALUE_HOLDS_FRACTION (g_value)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.numerator =
+                                     gst_value_get_fraction_numerator (g_value);
+                        value.denominator =
+                                   gst_value_get_fraction_denominator (g_value);
+                }
+        }
+
+        return value;
+}
+
+GUPnPDLNAIntValue
+gupnp_dlna_gst_get_int_value (GstCaps* caps,
+                              GstDiscovererStreamInfo *stream,
+                              GstDiscovererInfo *info,
+                              const gchar *name)
+{
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (caps != NULL) {
+                guint caps_size = gst_caps_get_size (caps);
+                guint iter;
+
+                for (iter = 0; iter < caps_size; ++iter) {
+                        const GstStructure *st = gst_caps_get_structure (caps,
+                                                                         iter);
+
+                        value = get_int_value_from_structure (st, name);
+                        if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                                return value;
+                }
+        }
+
+        if (stream != NULL) {
+                const GstStructure *st =
+                                   gst_discoverer_stream_info_get_misc (stream);
+
+                value = get_int_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (info != NULL) {
+                const GstStructure *st = gst_discoverer_info_get_misc (info);
+
+                value = get_int_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (stream != NULL) {
+                const GstTagList *tags =
+                                   gst_discoverer_stream_info_get_tags (stream);
+
+                value = get_int_value_from_tag_list (tags, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        return value;
+}
+
+GUPnPDLNAStringValue
+gupnp_dlna_gst_get_string_value (GstCaps* caps,
+                                 GstDiscovererStreamInfo *stream,
+                                 GstDiscovererInfo *info,
+                                 const gchar *name)
+{
+        GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+
+        if (caps != NULL) {
+                guint caps_size = gst_caps_get_size (caps);
+                guint iter;
+
+                for (iter = 0; iter < caps_size; ++iter) {
+                        const GstStructure *st = gst_caps_get_structure (caps,
+                                                                         iter);
+
+                        value = get_string_value_from_structure (st, name);
+                        if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                                return value;
+                }
+        }
+
+        if (stream != NULL) {
+                const GstStructure *st =
+                                   gst_discoverer_stream_info_get_misc (stream);
+
+                value = get_string_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (info != NULL) {
+                const GstStructure *st = gst_discoverer_info_get_misc (info);
+
+                value = get_string_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (stream != NULL) {
+                const GstTagList *tags =
+                                   gst_discoverer_stream_info_get_tags (stream);
+
+                value = get_string_value_from_tag_list (tags, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        return value;
+}
+
+GUPnPDLNABoolValue
+gupnp_dlna_gst_get_bool_value (GstCaps* caps,
+                               GstDiscovererStreamInfo *stream,
+                               GstDiscovererInfo *info,
+                               const gchar *name)
+{
+        GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSET;
+
+        if (caps != NULL) {
+                guint caps_size = gst_caps_get_size (caps);
+                guint iter;
+
+                for (iter = 0; iter < caps_size; ++iter) {
+                        const GstStructure *st = gst_caps_get_structure (caps,
+                                                                         iter);
+
+                        value = get_bool_value_from_structure (st, name);
+                        if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                                return value;
+                }
+        }
+
+        if (stream != NULL) {
+                const GstStructure *st =
+                                   gst_discoverer_stream_info_get_misc (stream);
+
+                value = get_bool_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (info != NULL) {
+                const GstStructure *st = gst_discoverer_info_get_misc (info);
+
+                value = get_bool_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (stream != NULL) {
+                const GstTagList *tags =
+                                   gst_discoverer_stream_info_get_tags (stream);
+
+                value = get_bool_value_from_tag_list (tags, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        return value;
+}
+
+GUPnPDLNAFractionValue
+gupnp_dlna_gst_get_fraction_value (GstCaps* caps,
+                                   GstDiscovererStreamInfo *stream,
+                                   GstDiscovererInfo *info,
+                                   const gchar *name)
+{
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (caps != NULL) {
+                guint caps_size = gst_caps_get_size (caps);
+                guint iter;
+
+                for (iter = 0; iter < caps_size; ++iter) {
+                        const GstStructure *st = gst_caps_get_structure (caps,
+                                                                         iter);
+
+                        value = get_fraction_value_from_structure (st, name);
+                        if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                                return value;
+                }
+        }
+
+        if (stream != NULL) {
+                const GstStructure *st =
+                                   gst_discoverer_stream_info_get_misc (stream);
+
+                value = get_fraction_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (info != NULL) {
+                const GstStructure *st = gst_discoverer_info_get_misc (info);
+
+                value = get_fraction_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (stream != NULL) {
+                const GstTagList *tags =
+                                   gst_discoverer_stream_info_get_tags (stream);
+
+                value = get_fraction_value_from_tag_list (tags, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        return value;
+}
+
+GUPnPDLNAStringValue
+gupnp_dlna_gst_get_mime (GstCaps* caps)
+{
+        GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+        guint count = gst_caps_get_size (caps);
+        guint iter;
+
+        for (iter = 0; iter < count; ++iter) {
+                const GstStructure *st = gst_caps_get_structure (caps, iter);
+
+                if (st != NULL) {
+                        const gchar *name = gst_structure_get_name (st);
+
+                        /* just in case */
+                        if (name != NULL && name[0] != '\0') {
+                                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                                value.value = g_strdup (name);
+
+                                break;
+                        }
+                }
+        }
+
+        return value;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.h b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-info-utils.h
new file mode 100644 (file)
index 0000000..ec5265b
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_INFO_UTILS_H__
+#define __GUPNP_DLNA_GST_INFO_UTILS_H__
+
+#include <glib.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-values.h"
+
+G_BEGIN_DECLS
+
+/* some unref functions are macros, so we wrap them into functions,
+   because we want to pass them to g_clear_pointer. */
+void
+gupnp_dlna_gst_discoverer_info_unref (gpointer info);
+
+void
+gupnp_dlna_gst_discoverer_stream_info_unref (gpointer stream);
+
+GUPnPDLNAIntValue
+gupnp_dlna_gst_get_int_value (GstCaps* caps,
+                              GstDiscovererStreamInfo *stream,
+                              GstDiscovererInfo *info,
+                              const gchar *name);
+
+GUPnPDLNAStringValue
+gupnp_dlna_gst_get_string_value (GstCaps* caps,
+                                 GstDiscovererStreamInfo *stream,
+                                 GstDiscovererInfo *info,
+                                 const gchar *name);
+
+GUPnPDLNABoolValue
+gupnp_dlna_gst_get_bool_value (GstCaps* caps,
+                               GstDiscovererStreamInfo *stream,
+                               GstDiscovererInfo *info,
+                               const gchar *name);
+
+GUPnPDLNAFractionValue
+gupnp_dlna_gst_get_fraction_value (GstCaps* caps,
+                                   GstDiscovererStreamInfo *stream,
+                                   GstDiscovererInfo *info,
+                                   const gchar *name);
+
+GUPnPDLNAStringValue
+gupnp_dlna_gst_get_mime (GstCaps* caps);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_INFO_UTILS_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.c
new file mode 100644 (file)
index 0000000..5014ffe
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+#include "gupnp-dlna-gst-audio-information.h"
+#include "gupnp-dlna-gst-container-information.h"
+#include "gupnp-dlna-gst-image-information.h"
+#include "gupnp-dlna-gst-video-information.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstInformation,
+               gupnp_dlna_gst_information,
+               GUPNP_TYPE_DLNA_INFORMATION)
+
+struct _GUPnPDLNAGstInformationPrivate {
+        GstDiscovererInfo* info;
+};
+
+enum {
+        PROP_0,
+
+        PROP_INFO
+};
+
+static void
+gupnp_dlna_gst_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstInformation *info = GUPNP_DLNA_GST_INFORMATION (object);
+        GUPnPDLNAGstInformationPrivate *priv = info->priv;
+
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        G_OBJECT_CLASS
+                    (gupnp_dlna_gst_information_parent_class)->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_information_set_property (GObject      *object,
+                                         guint         property_id,
+                                         const GValue *value,
+                                         GParamSpec   *pspec)
+{
+        GUPnPDLNAGstInformation *info = GUPNP_DLNA_GST_INFORMATION (object);
+        GUPnPDLNAGstInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (gst_value_dup_mini_object (value));
+
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_information_get_property (GObject    *object,
+                                         guint       property_id,
+                                         GValue     *value,
+                                         GParamSpec *pspec)
+{
+        GUPnPDLNAGstInformation *info = GUPNP_DLNA_GST_INFORMATION (object);
+        GUPnPDLNAGstInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                gst_value_set_mini_object (value, GST_MINI_OBJECT (priv->info));
+
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+
+                break;
+        }
+}
+
+GUPnPDLNAAudioInformation *
+backend_get_audio_information (GUPnPDLNAInformation *self)
+{
+        GUPnPDLNAGstInformation *gst_info = GUPNP_DLNA_GST_INFORMATION (self);
+
+        if (gst_info == NULL)
+                return NULL;
+
+        return GUPNP_DLNA_AUDIO_INFORMATION
+                (gupnp_dlna_gst_audio_information_new_from_discoverer_info
+                                        (gst_info->priv->info));
+}
+
+GUPnPDLNAContainerInformation *
+backend_get_container_information (GUPnPDLNAInformation *self)
+{
+        GUPnPDLNAGstInformation *gst_info = GUPNP_DLNA_GST_INFORMATION (self);
+
+        if (gst_info == NULL)
+                return NULL;
+
+        return GUPNP_DLNA_CONTAINER_INFORMATION
+                (gupnp_dlna_gst_container_information_new_from_discoverer_info
+                                        (gst_info->priv->info));
+}
+
+GUPnPDLNAImageInformation *
+backend_get_image_information (GUPnPDLNAInformation *self)
+{
+        GUPnPDLNAGstInformation *gst_info = GUPNP_DLNA_GST_INFORMATION (self);
+
+        return GUPNP_DLNA_IMAGE_INFORMATION
+                (gupnp_dlna_gst_image_information_new_from_discoverer_info
+                                        (gst_info->priv->info));
+}
+
+GUPnPDLNAVideoInformation *
+backend_get_video_information (GUPnPDLNAInformation *self)
+{
+        GUPnPDLNAGstInformation *gst_info = GUPNP_DLNA_GST_INFORMATION (self);
+
+        return GUPNP_DLNA_VIDEO_INFORMATION
+                (gupnp_dlna_gst_video_information_new_from_discoverer_info
+                                        (gst_info->priv->info));
+}
+
+static void
+gupnp_dlna_gst_information_class_init
+                                  (GUPnPDLNAGstInformationClass *gst_info_class)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GUPnPDLNAInformationClass *info_class =
+                                  GUPNP_DLNA_INFORMATION_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->dispose = gupnp_dlna_gst_information_dispose;
+        object_class->set_property = gupnp_dlna_gst_information_set_property;
+        object_class->get_property = gupnp_dlna_gst_information_get_property;
+        info_class->get_audio_information = backend_get_audio_information;
+        info_class->get_container_information =
+                                        backend_get_container_information;
+        info_class->get_image_information = backend_get_image_information;
+        info_class->get_video_information = backend_get_video_information;
+
+        pspec = gst_param_spec_mini_object ("info",
+                                            "info",
+                                            "discoverer info",
+                                            GST_TYPE_DISCOVERER_INFO,
+                                            G_PARAM_READWRITE |
+                                            G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private (gst_info_class,
+                                  sizeof (GUPnPDLNAGstInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_information_init (GUPnPDLNAGstInformation *self)
+{
+        GUPnPDLNAGstInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_GST_INFORMATION,
+                                         GUPnPDLNAGstInformationPrivate);
+
+        priv->info = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstInformation *
+gupnp_dlna_gst_information_new_from_discoverer_info (const gchar       *uri,
+                                                     GstDiscovererInfo *info)
+{
+        return GUPNP_DLNA_GST_INFORMATION
+                                 (g_object_new (GUPNP_TYPE_DLNA_GST_INFORMATION,
+                                                "uri", uri,
+                                                "info", info,
+                                                NULL));
+}
+
+GUPnPDLNAGstInformation *
+gupnp_dlna_gst_information_new_empty_with_uri (const gchar *uri)
+{
+        return GUPNP_DLNA_GST_INFORMATION
+                                 (g_object_new (GUPNP_TYPE_DLNA_GST_INFORMATION,
+                                                "uri", uri,
+                                                NULL));
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.h b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-information.h
new file mode 100644 (file)
index 0000000..0db2d37
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_INFORMATION_H__
+#define __GUPNP_DLNA_GST_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_INFORMATION (gupnp_dlna_gst_information_get_type())
+
+#define GUPNP_DLNA_GST_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_INFORMATION, \
+                                     GUPnPDLNAGstInformation))
+
+#define GUPNP_DLNA_GST_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_INFORMATION, \
+                                  GUPnPDLNAGstInformationClass))
+
+#define GUPNP_IS_DLNA_GST_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_INFORMATION))
+
+#define GUPNP_DLNA_GST_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_INFORMATION, \
+                                    GUPnPDLNAGstInformationClass))
+
+typedef struct _GUPnPDLNAGstInformationPrivate GUPnPDLNAGstInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAInformation parent;
+
+        GUPnPDLNAGstInformationPrivate *priv;
+} GUPnPDLNAGstInformation;
+
+typedef struct {
+        GUPnPDLNAInformationClass parent_class;
+} GUPnPDLNAGstInformationClass;
+
+GType
+gupnp_dlna_gst_information_get_type (void);
+
+GUPnPDLNAGstInformation *
+gupnp_dlna_gst_information_new_from_discoverer_info (const gchar       *uri,
+                                                     GstDiscovererInfo *info);
+
+GUPnPDLNAGstInformation *
+gupnp_dlna_gst_information_new_empty_with_uri (const gchar *uri);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-legacy-utils.h b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-legacy-utils.h
new file mode 100644 (file)
index 0000000..731272f
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_UTILS_H__
+#define __GUPNP_DLNA_GST_UTILS_H__
+
+#include <gst/pbutils/pbutils.h>
+#include <libgupnp-dlna/gupnp-dlna-information.h>
+
+G_BEGIN_DECLS
+
+GUPnPDLNAInformation *
+gupnp_dlna_gst_utils_information_from_discoverer_info (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_UTILS_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-backend.c
new file mode 100644 (file)
index 0000000..d31dd5d
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <glib.h>
+#include <gmodule.h>
+#include <gst/gst.h>
+#include "gupnp-dlna-gst-metadata-extractor.h"
+
+G_MODULE_EXPORT GUPnPDLNAMetadataExtractor *
+gupnp_dlna_get_default_extractor (void)
+{
+        return GUPNP_DLNA_METADATA_EXTRACTOR
+                                     (gupnp_dlna_gst_metadata_extractor_new ());
+}
+
+G_MODULE_EXPORT const gchar *
+g_module_check_init (GModule *module G_GNUC_UNUSED)
+{
+        if (!gst_is_initialized ())
+                gst_init (NULL, NULL);
+
+        return NULL;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.c
new file mode 100644 (file)
index 0000000..436e608
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-gst-metadata-extractor.h"
+#include "gupnp-dlna-gst-information.h"
+#include "gupnp-dlna-gst-legacy-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstMetadataExtractor,
+               gupnp_dlna_gst_metadata_extractor,
+               GUPNP_TYPE_DLNA_METADATA_EXTRACTOR)
+
+struct _GUPnPDLNAGstMetadataExtractorPrivate {
+        gpointer placeholder;
+};
+
+static gboolean
+unref_discoverer_in_idle (GstDiscoverer *discoverer)
+{
+        if (discoverer)
+                g_object_unref (discoverer);
+
+        return FALSE;
+}
+
+static void
+gupnp_dlna_discovered_cb (GUPnPDLNAMetadataExtractor *self,
+                          GstDiscovererInfo *info,
+                          GError *error,
+                          gpointer user_data)
+{
+        GstDiscoverer *discoverer = GST_DISCOVERER (user_data);
+        GUPnPDLNAInformation *gupnp_info = NULL;
+
+        if (error)
+                gupnp_info = GUPNP_DLNA_INFORMATION
+                                  (gupnp_dlna_gst_information_new_empty_with_uri
+                                        (gst_discoverer_info_get_uri (info)));
+        else
+                gupnp_info = gupnp_dlna_gst_utils_information_from_discoverer_info
+                                        (info);
+        gupnp_dlna_metadata_extractor_emit_done (self,
+                                                 gupnp_info,
+                                                 error);
+        g_object_unref (gupnp_info);
+        g_idle_add ((GSourceFunc) unref_discoverer_in_idle, discoverer);
+}
+
+static gboolean
+backend_extract_async (GUPnPDLNAMetadataExtractor  *extractor,
+                       const gchar                 *uri,
+                       guint                        timeout,
+                       GError                     **error)
+{
+        GError *gst_error = NULL;
+        GstClockTime clock_time = GST_MSECOND * timeout;
+        GstDiscoverer *discoverer = gst_discoverer_new (clock_time, &gst_error);
+
+        if (gst_error) {
+                g_propagate_error (error, gst_error);
+
+                return FALSE;
+        }
+
+        g_signal_connect_swapped (discoverer,
+                                  "discovered",
+                                  G_CALLBACK (gupnp_dlna_discovered_cb),
+                                  extractor);
+        gst_discoverer_start (discoverer);
+
+        return gst_discoverer_discover_uri_async (discoverer,
+                                                  uri);
+}
+
+static GUPnPDLNAInformation *
+backend_extract_sync (GUPnPDLNAMetadataExtractor  *extractor G_GNUC_UNUSED,
+                      const gchar                 *uri,
+                      guint                        timeout_in_ms,
+                      GError                     **error)
+{
+        GError *gst_error = NULL;
+        GstClockTime clock_time = GST_MSECOND * timeout_in_ms;
+        GstDiscoverer *discoverer = gst_discoverer_new (clock_time, &gst_error);
+        GstDiscovererInfo* info;
+        GUPnPDLNAInformation *gupnp_info;
+
+        if (gst_error) {
+                g_propagate_error (error, gst_error);
+
+                return NULL;
+        }
+
+        info = gst_discoverer_discover_uri (discoverer,
+                                            uri,
+                                            &gst_error);
+
+        g_object_unref (discoverer);
+        if (gst_error) {
+                g_propagate_error (error, gst_error);
+
+                return NULL;
+        }
+
+        gupnp_info = GUPNP_DLNA_INFORMATION
+              (gupnp_dlna_gst_information_new_from_discoverer_info (uri, info));
+        gst_discoverer_info_unref (info);
+
+        return gupnp_info;
+}
+
+static void
+gupnp_dlna_gst_metadata_extractor_class_init
+                       (GUPnPDLNAGstMetadataExtractorClass *gst_extractor_class)
+{
+        GUPnPDLNAMetadataExtractorClass *extractor_class =
+                      GUPNP_DLNA_METADATA_EXTRACTOR_CLASS (gst_extractor_class);
+
+        extractor_class->extract_async = backend_extract_async;
+        extractor_class->extract_sync = backend_extract_sync;
+
+        g_type_class_add_private
+                                (gst_extractor_class,
+                                 sizeof (GUPnPDLNAGstMetadataExtractorPrivate));
+}
+
+static void
+gupnp_dlna_gst_metadata_extractor_init (GUPnPDLNAGstMetadataExtractor *self)
+{
+        GUPnPDLNAGstMetadataExtractorPrivate *priv =
+            G_TYPE_INSTANCE_GET_PRIVATE (self,
+                                         GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR,
+                                         GUPnPDLNAGstMetadataExtractorPrivate);
+
+        self->priv = priv;
+}
+
+GUPnPDLNAGstMetadataExtractor *
+gupnp_dlna_gst_metadata_extractor_new (void)
+{
+        return GUPNP_DLNA_GST_METADATA_EXTRACTOR
+                          (g_object_new (GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR,
+                                         NULL));
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.h b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-metadata-extractor.h
new file mode 100644 (file)
index 0000000..3a76df6
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _GUPNP_DLNA_GST_METADATA_EXTRACTOR
+#define _GUPNP_DLNA_GST_METADATA_EXTRACTOR
+
+#include <glib-object.h>
+#include "gupnp-dlna-metadata-extractor.h"
+#include "gupnp-dlna-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR \
+        (gupnp_dlna_gst_metadata_extractor_get_type())
+
+#define GUPNP_DLNA_GST_METADATA_EXTRACTOR(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR, \
+                                     GUPnPDLNAGstMetadataExtractor))
+
+#define GUPNP_DLNA_GST_METADATA_EXTRACTOR_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR, \
+                                  GUPnPDLNAGstMetadataExtractorClass))
+
+#define GUPNP_IS_DLNA_GST_METADATA_EXTRACTOR(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR))
+
+#define GUPNP_IS_DLNA_GST_METADATA_EXTRACTOR_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR))
+
+#define GUPNP_DLNA_GST_METADATA_EXTRACTOR_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR, \
+                                    GUPnPDLNAGstMetadataExtractorClass))
+
+typedef struct _GUPnPDLNAGstMetadataExtractorPrivate
+                GUPnPDLNAGstMetadataExtractorPrivate;
+
+/**
+ * GUPnPDLNAGstMetadataExtractor:
+ *
+ * The top-level object used to for metadata extraction.
+ */
+typedef struct {
+        GUPnPDLNAMetadataExtractor parent;
+
+        GUPnPDLNAGstMetadataExtractorPrivate *priv;
+} GUPnPDLNAGstMetadataExtractor;
+
+typedef struct {
+        GUPnPDLNAMetadataExtractorClass parent_class;
+} GUPnPDLNAGstMetadataExtractorClass;
+
+GType
+gupnp_dlna_gst_metadata_extractor_get_type (void);
+
+GUPnPDLNAGstMetadataExtractor *
+gupnp_dlna_gst_metadata_extractor_new (void);
+
+G_END_DECLS
+
+#endif /* _GUPNP_DLNA_GST_METADATA_EXTRACTOR */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-utils.c
new file mode 100644 (file)
index 0000000..7f365ff
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-gst-legacy-utils.h"
+#include "gupnp-dlna-gst-information.h"
+
+/**
+ * gupnp_dlna_gst_utils_information_from_discoverer_info:
+ * @info: A #GstDiscovererInfo object.
+ *
+ * This utility function creates a #GUPnPDLNAInformation from
+ * #GstDiscovererInfo. Its purpose is mainly to pass its result to
+ * gupnp_dlna_profile_guesser_guess_profile_from_info() to avoid
+ * rediscovering of a URI. Created #GUPnPDLNAInformation takes a
+ * reference on @info.
+ *
+ * Returns: (transfer full): A #GUPnPDLNAInformation. Unref it when
+ * done with it.
+ */
+GUPnPDLNAInformation *
+gupnp_dlna_gst_utils_information_from_discoverer_info (GstDiscovererInfo *info)
+{
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        return GUPNP_DLNA_INFORMATION
+                            (gupnp_dlna_gst_information_new_from_discoverer_info
+                                        (gst_discoverer_info_get_uri (info),
+                                         info));
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.c
new file mode 100644 (file)
index 0000000..42bc0e3
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-video-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstVideoInformation,
+               gupnp_dlna_gst_video_information,
+               GUPNP_TYPE_DLNA_VIDEO_INFORMATION)
+
+struct _GUPnPDLNAGstVideoInformationPrivate {
+        GstDiscovererInfo *info;
+        GList *stream_list;
+        GstDiscovererVideoInfo *video_info;
+        GstCaps *caps;
+};
+
+enum
+{
+        PROP_0,
+
+        PROP_INFO
+};
+
+static GstDiscovererVideoInfo *
+get_video_info (GUPnPDLNAGstVideoInformation *gst_info)
+{
+        GUPnPDLNAGstVideoInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->video_info) {
+                GList *iter;
+
+                if (!priv->stream_list) {
+                        priv->stream_list =
+                               gst_discoverer_info_get_stream_list (priv->info);
+                        if (!priv->stream_list)
+                                return NULL;
+                }
+
+                for (iter = priv->stream_list; iter; iter = iter->next) {
+                        GstDiscovererStreamInfo *stream =
+                                        GST_DISCOVERER_STREAM_INFO (iter->data);
+                        GType stream_type = G_TYPE_FROM_INSTANCE (stream);
+
+                        if (stream_type == GST_TYPE_DISCOVERER_VIDEO_INFO) {
+                                priv->video_info =
+                                             GST_DISCOVERER_VIDEO_INFO (stream);
+
+                                break;
+                        }
+                }
+        }
+
+        return priv->video_info;
+}
+
+static GstCaps *
+get_caps (GUPnPDLNAGstVideoInformation *gst_info)
+{
+        GUPnPDLNAGstVideoInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->caps)
+                priv->caps = gst_discoverer_stream_info_get_caps
+                                        (GST_DISCOVERER_STREAM_INFO
+                                                   (get_video_info (gst_info)));
+
+        return priv->caps;
+}
+
+static GUPnPDLNAIntValue
+get_int_value (GUPnPDLNAGstVideoInformation *gst_info,
+               const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_video_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_int_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAStringValue
+get_string_value (GUPnPDLNAGstVideoInformation *gst_info,
+                  const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_video_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_string_value (caps, stream, info, name);
+}
+
+static GUPnPDLNABoolValue
+get_bool_value (GUPnPDLNAGstVideoInformation *gst_info,
+                const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_video_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_bool_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAIntValue
+backend_get_bitrate (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint data = gst_discoverer_video_info_get_bitrate (video_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAFractionValue
+backend_get_framerate (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint ndata = gst_discoverer_video_info_get_framerate_num (video_info);
+        guint ddata = gst_discoverer_video_info_get_framerate_denom
+                                        (video_info);
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (ndata > 0 && ndata <= G_MAXINT && ddata > 0 && ddata <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.numerator = (gint) ndata;
+                value.denominator = (gint) ddata;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_height (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint data = gst_discoverer_video_info_get_height (video_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNABoolValue
+backend_is_interlaced (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        gboolean data = gst_discoverer_video_info_get_height (video_info);
+        GUPnPDLNABoolValue value;
+
+        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+        value.value = data;
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_level (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return get_string_value (gst_info, "level");
+}
+
+static GUPnPDLNAIntValue
+backend_get_mpeg_version (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return get_int_value (gst_info, "mpegversion");
+}
+
+static GUPnPDLNAFractionValue
+backend_get_pixel_aspect_ratio (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint ndata = gst_discoverer_video_info_get_par_num (video_info);
+        guint ddata = gst_discoverer_video_info_get_par_denom (video_info);
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (ndata > 0 && ndata <= G_MAXINT && ddata > 0 && ddata <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.numerator = (gint) ndata;
+                value.denominator = (gint) ddata;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_profile (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return get_string_value (gst_info, "profile");
+}
+
+static GUPnPDLNABoolValue
+backend_is_system_stream (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return get_bool_value (gst_info, "systemstream");
+}
+
+static GUPnPDLNAIntValue
+backend_get_width (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint data = gst_discoverer_video_info_get_width (video_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_mime (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return gupnp_dlna_gst_get_mime (get_caps (gst_info));
+}
+
+static void
+gupnp_dlna_gst_video_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstVideoInformation *info =
+                                      GUPNP_DLNA_GST_VIDEO_INFORMATION (object);
+        GUPnPDLNAGstVideoInformationPrivate *priv = info->priv;
+
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        g_clear_pointer (&priv->stream_list,
+                         gst_discoverer_stream_info_list_free);
+        /* priv->video_info is freed with stream list above */
+        priv->video_info = NULL;
+        g_clear_pointer (&priv->caps, gst_caps_unref);
+        G_OBJECT_CLASS
+              (gupnp_dlna_gst_video_information_parent_class)->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_video_information_set_property (GObject      *object,
+                                               guint         property_id,
+                                               const GValue *value,
+                                               GParamSpec   *pspec)
+{
+        GUPnPDLNAGstVideoInformation *info =
+                                      GUPNP_DLNA_GST_VIDEO_INFORMATION (object);
+        GUPnPDLNAGstVideoInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (gst_value_dup_mini_object (value));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_video_information_get_property (GObject    *object,
+                                               guint       property_id,
+                                               GValue     *value,
+                                               GParamSpec *pspec)
+{
+        GUPnPDLNAGstVideoInformation *info =
+                                      GUPNP_DLNA_GST_VIDEO_INFORMATION (object);
+        GUPnPDLNAGstVideoInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                gst_value_set_mini_object (value, GST_MINI_OBJECT (priv->info));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_video_information_class_init
+                             (GUPnPDLNAGstVideoInformationClass *gst_info_class)
+{
+        GUPnPDLNAVideoInformationClass *info_class =
+                            GUPNP_DLNA_VIDEO_INFORMATION_CLASS (gst_info_class);
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->get_property =
+                                  gupnp_dlna_gst_video_information_get_property;
+        object_class->set_property =
+                                  gupnp_dlna_gst_video_information_set_property;
+        object_class->dispose = gupnp_dlna_gst_video_information_dispose;
+
+        info_class->get_bitrate = backend_get_bitrate;
+        info_class->get_framerate = backend_get_framerate;
+        info_class->get_height = backend_get_height;
+        info_class->is_interlaced = backend_is_interlaced;
+        info_class->get_level = backend_get_level;
+        info_class->get_mpeg_version = backend_get_mpeg_version;
+        info_class->get_pixel_aspect_ratio = backend_get_pixel_aspect_ratio;
+        info_class->get_profile = backend_get_profile;
+        info_class->is_system_stream = backend_is_system_stream;
+        info_class->get_width = backend_get_width;
+        info_class->get_mime = backend_get_mime;
+
+        pspec = gst_param_spec_mini_object ("info",
+                                            "info",
+                                            "discoverer info",
+                                            GST_TYPE_DISCOVERER_INFO,
+                                            G_PARAM_READWRITE |
+                                            G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private (gst_info_class,
+                                  sizeof (GUPnPDLNAGstVideoInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_video_information_init (GUPnPDLNAGstVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,
+                                         GUPnPDLNAGstVideoInformationPrivate);
+
+        priv->info = NULL;
+        priv->stream_list = NULL;
+        priv->video_info = NULL;
+        priv->caps = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstVideoInformation *
+gupnp_dlna_gst_video_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info)
+{
+        GList* video_list;
+        GUPnPDLNAGstVideoInformation *video_info = NULL;
+
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        video_list = gst_discoverer_info_get_video_streams (info);
+
+        if (video_list) {
+                if (!gst_discoverer_video_info_is_image
+                                 (GST_DISCOVERER_VIDEO_INFO (video_list->data)))
+                        video_info = GUPNP_DLNA_GST_VIDEO_INFORMATION
+                                        (g_object_new
+                                         (GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,
+                                          "info", info,
+                                          NULL));
+                gst_discoverer_stream_info_list_free (video_list);
+        }
+
+        return video_info;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.h b/libgupnp-dlna/metadata-backends/gstreamer-legacy/gupnp-dlna-gst-video-information.h
new file mode 100644 (file)
index 0000000..23618a3
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2012,2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_VIDEO_INFORMATION_H__
+#define __GUPNP_DLNA_GST_VIDEO_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-video-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION gupnp_dlna_gst_video_information_get_type()
+
+#define GUPNP_DLNA_GST_VIDEO_INFORMATION(obj)                                     \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj),                             \
+                                     GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,       \
+                                     GUPnPDLNAGstVideoInformation))
+
+#define GUPNP_DLNA_GST_VIDEO_INFORMATION_CLASS(klass)                             \
+        (G_TYPE_CHECK_CLASS_CAST ((klass),                              \
+                                  GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,          \
+                                  GUPnPDLNAGstVideoInformationClass))
+
+#define GUPNP_IS_DLNA_GST_VIDEO_INFORMATION(obj)                                  \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_VIDEO_INFORMATION_CLASS(klass)                          \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION))
+
+#define GUPNP_DLNA_GST_VIDEO_INFORMATION_GET_CLASS(obj)                           \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj),                              \
+                                    GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,        \
+                                    GUPnPDLNAGstVideoInformationClass))
+
+typedef struct _GUPnPDLNAGstVideoInformationPrivate GUPnPDLNAGstVideoInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAVideoInformation parent;
+
+        GUPnPDLNAGstVideoInformationPrivate *priv;
+} GUPnPDLNAGstVideoInformation;
+
+typedef struct {
+        GUPnPDLNAVideoInformationClass parent_class;
+} GUPnPDLNAGstVideoInformationClass;
+
+GType gupnp_dlna_gst_video_information_get_type (void);
+
+GUPnPDLNAGstVideoInformation *
+gupnp_dlna_gst_video_information_new_from_discoverer_info (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_VIDEO_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gstreamer.am b/libgupnp-dlna/metadata-backends/gstreamer/gstreamer.am
new file mode 100644 (file)
index 0000000..6eefb5e
--- /dev/null
@@ -0,0 +1,59 @@
+gst_metadata_backend_libadd = \
+       $(common_libadd) \
+       $(GST_LIBS) \
+       $(GST_PBU_LIBS) \
+       libgupnp-dlna-2.0.la
+gst_metadata_backend_cflags = \
+       $(common_cflags) \
+       $(GST_CFLAGS) \
+       $(GST_PBU_CFLAGS) \
+       $(metadata_log_cflags) \
+       $(metadata_cflags)
+
+gstreamer_metadata_backend = \
+       metadata-backends/gstreamer/libgstreamer.la
+gstreamer_utils_lib = \
+       metadata-backends/gstreamer/libgupnp-dlna-gst-2.0.la
+metadata_LTLIBRARIES += \
+       $(gstreamer_metadata_backend)
+lib_LTLIBRARIES += \
+       $(gstreamer_utils_lib)
+
+metadata_backends_gstreamer_libgstreamer_la_LDFLAGS = \
+       -no-undefined \
+       -shared -fPIC -module -avoid-version -Wl,-z,defs
+metadata_backends_gstreamer_libgstreamer_la_SOURCES = \
+       metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c
+metadata_backends_gstreamer_libgstreamer_la_LIBADD = \
+       $(gst_metadata_backend_libadd) \
+       $(gstreamer_utils_lib)
+metadata_backends_gstreamer_libgstreamer_la_CFLAGS = \
+       $(gst_metadata_backend_cflags)
+
+metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_LDFLAGS = \
+       $(gupnp_ldflags)
+metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_SOURCES = \
+       metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-information.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-utils.c \
+       metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c
+metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_LIBADD = \
+       $(gst_metadata_backend_libadd)
+metadata_backends_gstreamer_libgupnp_dlna_gst_2_0_la_CFLAGS = \
+       $(gst_metadata_backend_cflags)
+
+dist_noinst_HEADERS += \
+       metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-container-information.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-image-information.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-information.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.h \
+       metadata-backends/gstreamer/gupnp-dlna-gst-video-information.h
+
+libgupnp_dlna_inc_HEADERS += \
+       metadata-backends/gstreamer/gupnp-dlna-gst-utils.h
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.c
new file mode 100644 (file)
index 0000000..a6ea58d
--- /dev/null
@@ -0,0 +1,392 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-audio-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstAudioInformation,
+               gupnp_dlna_gst_audio_information,
+               GUPNP_TYPE_DLNA_AUDIO_INFORMATION)
+
+struct _GUPnPDLNAGstAudioInformationPrivate {
+        GstDiscovererInfo *info;
+        GList *stream_list;
+        GstDiscovererAudioInfo *audio_info;
+        GstCaps *caps;
+};
+
+enum
+{
+        PROP_0,
+
+        PROP_INFO
+};
+
+static GstDiscovererAudioInfo *
+get_audio_info (GUPnPDLNAGstAudioInformation *gst_info)
+{
+        GUPnPDLNAGstAudioInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->audio_info) {
+                GList *iter;
+
+                if (!priv->stream_list) {
+                        priv->stream_list =
+                               gst_discoverer_info_get_stream_list (priv->info);
+                        if (!priv->stream_list)
+                                return NULL;
+                }
+
+                for (iter = priv->stream_list; iter; iter = iter->next) {
+                        GstDiscovererStreamInfo *stream =
+                                        GST_DISCOVERER_STREAM_INFO (iter->data);
+                        GType stream_type = G_TYPE_FROM_INSTANCE (stream);
+
+                        if (stream_type == GST_TYPE_DISCOVERER_AUDIO_INFO) {
+                                priv->audio_info =
+                                             GST_DISCOVERER_AUDIO_INFO (stream);
+
+                                break;
+                        }
+                }
+        }
+
+        return priv->audio_info;
+}
+
+static GstCaps *
+get_caps (GUPnPDLNAGstAudioInformation *gst_info)
+{
+        GUPnPDLNAGstAudioInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->caps)
+                priv->caps = gst_discoverer_stream_info_get_caps
+                       (GST_DISCOVERER_STREAM_INFO (get_audio_info (gst_info)));
+
+        return priv->caps;
+}
+
+static GUPnPDLNAIntValue
+get_int_value (GUPnPDLNAGstAudioInformation *gst_info,
+               const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_audio_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_int_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAStringValue
+get_string_value (GUPnPDLNAGstAudioInformation *gst_info,
+                  const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_audio_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_string_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAIntValue
+backend_get_bitrate (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        GstDiscovererAudioInfo *audio_info = get_audio_info (gst_info);
+        guint data = gst_discoverer_audio_info_get_bitrate (audio_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_channels (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        GstDiscovererAudioInfo *audio_info = get_audio_info (gst_info);
+        guint data = gst_discoverer_audio_info_get_channels (audio_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_depth (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        GstDiscovererAudioInfo *audio_info = get_audio_info (gst_info);
+        guint data = gst_discoverer_audio_info_get_depth (audio_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_layer (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_int_value (gst_info, "layer");
+}
+
+static GUPnPDLNAStringValue
+backend_get_level (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        return get_string_value (gst_info, "level");
+}
+
+static GUPnPDLNAIntValue
+backend_get_mpeg_audio_version (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_int_value (gst_info, "mpegaudioversion");
+}
+
+static GUPnPDLNAIntValue
+backend_get_mpeg_version (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_int_value (gst_info, "mpegversion");
+}
+
+static GUPnPDLNAStringValue
+backend_get_profile (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_string_value (gst_info, "profile");
+}
+
+static GUPnPDLNAIntValue
+backend_get_rate (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+        GstDiscovererAudioInfo *audio_info = get_audio_info (gst_info);
+        guint data = gst_discoverer_audio_info_get_sample_rate (audio_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_stream_format (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_string_value (gst_info, "stream-format");
+}
+
+static GUPnPDLNAIntValue
+backend_get_wma_version (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return get_int_value (gst_info, "wmaversion");
+}
+
+static GUPnPDLNAStringValue
+backend_get_mime (GUPnPDLNAAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformation* gst_info =
+                                        GUPNP_DLNA_GST_AUDIO_INFORMATION (self);
+
+        return gupnp_dlna_gst_get_mime (get_caps (gst_info));
+}
+
+static void
+gupnp_dlna_gst_audio_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstAudioInformation *info =
+                                      GUPNP_DLNA_GST_AUDIO_INFORMATION (object);
+        GUPnPDLNAGstAudioInformationPrivate *priv = info->priv;
+        GObjectClass *parent_class =
+                 G_OBJECT_CLASS (gupnp_dlna_gst_audio_information_parent_class);
+
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        g_clear_pointer (&priv->stream_list,
+                         gst_discoverer_stream_info_list_free);
+        /* priv->audio_info is freed with stream list above */
+        priv->audio_info = NULL;
+        g_clear_pointer (&priv->caps, gst_caps_unref);
+        parent_class->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_audio_information_set_property (GObject      *object,
+                                               guint         property_id,
+                                               const GValue *value,
+                                               GParamSpec   *pspec)
+{
+        GUPnPDLNAGstAudioInformation *info =
+                                      GUPNP_DLNA_GST_AUDIO_INFORMATION (object);
+        GUPnPDLNAGstAudioInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (g_value_dup_object (value));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_audio_information_get_property (GObject    *object,
+                                               guint       property_id,
+                                               GValue     *value,
+                                               GParamSpec *pspec)
+{
+        GUPnPDLNAGstAudioInformation *info =
+                                      GUPNP_DLNA_GST_AUDIO_INFORMATION (object);
+        GUPnPDLNAGstAudioInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_value_set_object (value, G_OBJECT (priv->info));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_audio_information_class_init
+                             (GUPnPDLNAGstAudioInformationClass *gst_info_class)
+{
+        GUPnPDLNAAudioInformationClass *info_class =
+                            GUPNP_DLNA_AUDIO_INFORMATION_CLASS (gst_info_class);
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->get_property =
+                                  gupnp_dlna_gst_audio_information_get_property;
+        object_class->set_property =
+                                  gupnp_dlna_gst_audio_information_set_property;
+        object_class->dispose = gupnp_dlna_gst_audio_information_dispose;
+
+        info_class->get_bitrate = backend_get_bitrate;
+        info_class->get_channels = backend_get_channels;
+        info_class->get_depth = backend_get_depth;
+        info_class->get_layer = backend_get_layer;
+        info_class->get_level = backend_get_level;
+        info_class->get_mpeg_audio_version = backend_get_mpeg_audio_version;
+        info_class->get_mpeg_version = backend_get_mpeg_version;
+        info_class->get_profile = backend_get_profile;
+        info_class->get_rate = backend_get_rate;
+        info_class->get_stream_format = backend_get_stream_format;
+        info_class->get_wma_version = backend_get_wma_version;
+        info_class->get_mime = backend_get_mime;
+
+        pspec = g_param_spec_object ("info",
+                                     "info",
+                                     "discoverer info",
+                                     GST_TYPE_DISCOVERER_INFO,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private (gst_info_class,
+                                  sizeof (GUPnPDLNAGstAudioInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_audio_information_init (GUPnPDLNAGstAudioInformation *self)
+{
+        GUPnPDLNAGstAudioInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION,
+                                         GUPnPDLNAGstAudioInformationPrivate);
+
+        priv->info = NULL;
+        priv->stream_list = NULL;
+        priv->audio_info = NULL;
+        priv->caps = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstAudioInformation *
+gupnp_dlna_gst_audio_information_new_from_discoverer_info (GstDiscovererInfo *info)
+{
+        GList* audio_list;
+        GUPnPDLNAGstAudioInformation *audio_info = NULL;
+
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        audio_list = gst_discoverer_info_get_audio_streams (info);
+
+        if (audio_list) {
+                audio_info = GUPNP_DLNA_GST_AUDIO_INFORMATION (g_object_new
+                                         (GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION,
+                                          "info", info,
+                                          NULL));
+                gst_discoverer_stream_info_list_free (audio_list);
+        }
+
+        return audio_info;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.h b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-audio-information.h
new file mode 100644 (file)
index 0000000..4e8f8e1
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_AUDIO_INFORMATION_H__
+#define __GUPNP_DLNA_GST_AUDIO_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-audio-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION \
+        (gupnp_dlna_gst_audio_information_get_type())
+
+#define GUPNP_DLNA_GST_AUDIO_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION, \
+                                     GUPnPDLNAGstAudioInformation))
+
+#define GUPNP_DLNA_GST_AUDIO_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION, \
+                                  GUPnPDLNAGstAudioInformationClass))
+
+#define GUPNP_IS_DLNA_GST_AUDIO_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_AUDIO_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION))
+
+#define GUPNP_DLNA_GST_AUDIO_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_AUDIO_INFORMATION, \
+                                    GUPnPDLNAGstAudioInformationClass))
+
+typedef struct _GUPnPDLNAGstAudioInformationPrivate
+                GUPnPDLNAGstAudioInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAAudioInformation parent;
+
+        GUPnPDLNAGstAudioInformationPrivate *priv;
+} GUPnPDLNAGstAudioInformation;
+
+typedef struct {
+        GUPnPDLNAAudioInformationClass parent_class;
+} GUPnPDLNAGstAudioInformationClass;
+
+GType
+gupnp_dlna_gst_audio_information_get_type (void);
+
+GUPnPDLNAGstAudioInformation *
+gupnp_dlna_gst_audio_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_AUDIO_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-container-information.c
new file mode 100644 (file)
index 0000000..6ad3133
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-container-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstContainerInformation,
+               gupnp_dlna_gst_container_information,
+               GUPNP_TYPE_DLNA_CONTAINER_INFORMATION)
+
+struct _GUPnPDLNAGstContainerInformationPrivate {
+        GstDiscovererInfo *info;
+        GstDiscovererStreamInfo *container_info;
+        GstCaps *caps;
+};
+
+enum
+{
+        PROP_0,
+
+        PROP_INFO
+};
+
+static GstDiscovererStreamInfo *
+get_container_info (GUPnPDLNAGstContainerInformation *gst_info)
+{
+        GUPnPDLNAGstContainerInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->container_info) {
+                priv->container_info =
+                               gst_discoverer_info_get_stream_info (priv->info);
+        }
+
+        return priv->container_info;
+}
+
+static GstCaps *
+get_caps (GUPnPDLNAGstContainerInformation *gst_info)
+{
+        GUPnPDLNAGstContainerInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->caps) {
+                priv->caps = gst_discoverer_stream_info_get_caps
+                                        (get_container_info (gst_info));
+        }
+
+        return priv->caps;
+}
+
+static GUPnPDLNAIntValue
+get_int_value (GUPnPDLNAGstContainerInformation *gst_info,
+               const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream = get_container_info (gst_info);
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_int_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAStringValue
+get_string_value (GUPnPDLNAGstContainerInformation *gst_info,
+                  const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream = get_container_info (gst_info);
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_string_value (caps, stream, info, name);
+}
+
+static GUPnPDLNABoolValue
+get_bool_value (GUPnPDLNAGstContainerInformation *gst_info,
+                const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream = get_container_info (gst_info);
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_bool_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAIntValue
+backend_get_mpeg_version (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_int_value (gst_info, "mpegversion");
+}
+
+static GUPnPDLNAIntValue
+backend_get_packet_size (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_int_value (gst_info, "packetsize");
+}
+
+static GUPnPDLNAStringValue
+backend_get_profile (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_string_value (gst_info, "profile");
+}
+
+static GUPnPDLNABoolValue
+backend_is_system_stream (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_bool_value (gst_info, "systemstream");
+}
+
+static GUPnPDLNAStringValue
+backend_get_variant (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return get_string_value (gst_info, "variant");
+}
+
+static GUPnPDLNAStringValue
+backend_get_mime (GUPnPDLNAContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformation* gst_info =
+                                    GUPNP_DLNA_GST_CONTAINER_INFORMATION (self);
+
+        return gupnp_dlna_gst_get_mime (get_caps (gst_info));
+}
+
+static void
+gupnp_dlna_gst_container_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstContainerInformation *info =
+                                  GUPNP_DLNA_GST_CONTAINER_INFORMATION (object);
+        GUPnPDLNAGstContainerInformationPrivate *priv = info->priv;
+        GObjectClass *parent_class =
+             G_OBJECT_CLASS (gupnp_dlna_gst_container_information_parent_class);
+
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        g_clear_pointer (&priv->container_info,
+                         gupnp_dlna_gst_discoverer_stream_info_unref);
+        g_clear_pointer (&priv->caps, gst_caps_unref);
+        parent_class->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_container_information_set_property (GObject      *object,
+                                                   guint         property_id,
+                                                   const GValue *value,
+                                                   GParamSpec   *pspec)
+{
+        GUPnPDLNAGstContainerInformation *info =
+                                  GUPNP_DLNA_GST_CONTAINER_INFORMATION (object);
+        GUPnPDLNAGstContainerInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (g_value_dup_object (value));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_container_information_get_property (GObject    *object,
+                                                   guint       property_id,
+                                                   GValue     *value,
+                                                   GParamSpec *pspec)
+{
+        GUPnPDLNAGstContainerInformation *info =
+                                  GUPNP_DLNA_GST_CONTAINER_INFORMATION (object);
+        GUPnPDLNAGstContainerInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_value_set_object (value, G_OBJECT (priv->info));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_container_information_class_init
+                         (GUPnPDLNAGstContainerInformationClass *gst_info_class)
+{
+        GUPnPDLNAContainerInformationClass *info_class =
+                        GUPNP_DLNA_CONTAINER_INFORMATION_CLASS (gst_info_class);
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->get_property =
+                              gupnp_dlna_gst_container_information_get_property;
+        object_class->set_property =
+                              gupnp_dlna_gst_container_information_set_property;
+        object_class->dispose = gupnp_dlna_gst_container_information_dispose;
+
+        info_class->get_mpeg_version = backend_get_mpeg_version;
+        info_class->get_packet_size = backend_get_packet_size;
+        info_class->get_profile = backend_get_profile;
+        info_class->is_system_stream = backend_is_system_stream;
+        info_class->get_variant = backend_get_variant;
+        info_class->get_mime = backend_get_mime;
+
+        pspec = g_param_spec_object ("info",
+                                     "info",
+                                     "discoverer info",
+                                     GST_TYPE_DISCOVERER_INFO,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private
+                             (gst_info_class,
+                              sizeof (GUPnPDLNAGstContainerInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_container_information_init
+                                        (GUPnPDLNAGstContainerInformation *self)
+{
+        GUPnPDLNAGstContainerInformationPrivate *priv =
+                G_TYPE_INSTANCE_GET_PRIVATE
+                                     (self,
+                                      GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION,
+                                      GUPnPDLNAGstContainerInformationPrivate);
+
+        priv->info = NULL;
+        priv->container_info = NULL;
+        priv->caps = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstContainerInformation *
+gupnp_dlna_gst_container_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info)
+{
+        GUPnPDLNAGstContainerInformation *container_info = NULL;
+        GstDiscovererStreamInfo *stream_info;
+
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        stream_info = gst_discoverer_info_get_stream_info (info);
+
+        if (stream_info) {
+                GType type = G_TYPE_FROM_INSTANCE (stream_info);
+
+                if (type == GST_TYPE_DISCOVERER_CONTAINER_INFO)
+                        container_info = GUPNP_DLNA_GST_CONTAINER_INFORMATION
+                                (g_object_new
+                                     (GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION,
+                                      "info", info,
+                                      NULL));
+                gst_discoverer_stream_info_unref (stream_info);
+        }
+
+        return container_info;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-container-information.h b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-container-information.h
new file mode 100644 (file)
index 0000000..c480ca6
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_CONTAINER_INFORMATION_H__
+#define __GUPNP_DLNA_GST_CONTAINER_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-container-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION \
+        (gupnp_dlna_gst_container_information_get_type())
+
+#define GUPNP_DLNA_GST_CONTAINER_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST \
+                                   ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION, \
+                                    GUPnPDLNAGstContainerInformation))
+
+#define GUPNP_DLNA_GST_CONTAINER_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION, \
+                                  GUPnPDLNAGstContainerInformationClass))
+
+#define GUPNP_IS_DLNA_GST_CONTAINER_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_CONTAINER_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION))
+
+#define GUPNP_DLNA_GST_CONTAINER_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_CONTAINER_INFORMATION, \
+                                    GUPnPDLNAGstContainerInformationClass))
+
+typedef struct _GUPnPDLNAGstContainerInformationPrivate
+                GUPnPDLNAGstContainerInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAContainerInformation parent;
+
+        GUPnPDLNAGstContainerInformationPrivate *priv;
+} GUPnPDLNAGstContainerInformation;
+
+typedef struct {
+        GUPnPDLNAContainerInformationClass parent_class;
+} GUPnPDLNAGstContainerInformationClass;
+
+GType
+gupnp_dlna_gst_container_information_get_type (void);
+
+GUPnPDLNAGstContainerInformation *
+gupnp_dlna_gst_container_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_CONTAINER_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-image-information.c
new file mode 100644 (file)
index 0000000..6547819
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-image-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstImageInformation,
+               gupnp_dlna_gst_image_information,
+               GUPNP_TYPE_DLNA_IMAGE_INFORMATION)
+
+struct _GUPnPDLNAGstImageInformationPrivate {
+        GstDiscovererInfo *info;
+        GList *stream_list;
+        GstDiscovererVideoInfo *image_info;
+        GstCaps *caps;
+};
+
+enum
+{
+        PROP_0,
+
+        PROP_INFO
+};
+
+static GstDiscovererVideoInfo *
+get_image_info (GUPnPDLNAGstImageInformation *gst_info)
+{
+        GUPnPDLNAGstImageInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->image_info) {
+                GList *iter;
+
+                if (!priv->stream_list) {
+                        priv->stream_list =
+                               gst_discoverer_info_get_stream_list (priv->info);
+                        if (!priv->stream_list)
+                                return NULL;
+                }
+
+                for (iter = priv->stream_list; iter; iter = iter->next) {
+                        GstDiscovererStreamInfo *stream =
+                                        GST_DISCOVERER_STREAM_INFO (iter->data);
+                        GType stream_type = G_TYPE_FROM_INSTANCE (stream);
+
+                        if (stream_type == GST_TYPE_DISCOVERER_VIDEO_INFO) {
+                                priv->image_info =
+                                             GST_DISCOVERER_VIDEO_INFO (stream);
+
+                                break;
+                        }
+                }
+        }
+
+        return priv->image_info;
+}
+
+static GstCaps *
+get_caps (GUPnPDLNAGstImageInformation *gst_info)
+{
+        GUPnPDLNAGstImageInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->caps)
+                priv->caps = gst_discoverer_stream_info_get_caps
+                                        (GST_DISCOVERER_STREAM_INFO
+                                                   (get_image_info (gst_info)));
+
+        return priv->caps;
+}
+
+static GUPnPDLNAIntValue
+backend_get_depth (GUPnPDLNAImageInformation *self)
+{
+        GUPnPDLNAGstImageInformation *gst_info =
+                                        GUPNP_DLNA_GST_IMAGE_INFORMATION (self);
+        GstDiscovererVideoInfo *image_info = get_image_info (gst_info);
+        guint data = gst_discoverer_video_info_get_depth (image_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_height (GUPnPDLNAImageInformation *self)
+{
+        GUPnPDLNAGstImageInformation* gst_info =
+                                        GUPNP_DLNA_GST_IMAGE_INFORMATION (self);
+        GstDiscovererVideoInfo *image_info = get_image_info (gst_info);
+        guint data = gst_discoverer_video_info_get_height (image_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_width (GUPnPDLNAImageInformation *self)
+{
+        GUPnPDLNAGstImageInformation* gst_info =
+                                        GUPNP_DLNA_GST_IMAGE_INFORMATION (self);
+        GstDiscovererVideoInfo *image_info = get_image_info (gst_info);
+        guint data = gst_discoverer_video_info_get_width (image_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_mime (GUPnPDLNAImageInformation *self)
+{
+        GUPnPDLNAGstImageInformation* gst_info =
+                                        GUPNP_DLNA_GST_IMAGE_INFORMATION (self);
+
+        return gupnp_dlna_gst_get_mime (get_caps (gst_info));
+}
+
+static void
+gupnp_dlna_gst_image_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstImageInformation *info =
+                                      GUPNP_DLNA_GST_IMAGE_INFORMATION (object);
+        GUPnPDLNAGstImageInformationPrivate *priv = info->priv;
+        GObjectClass *parent_class =
+                 G_OBJECT_CLASS (gupnp_dlna_gst_image_information_parent_class);
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        g_clear_pointer (&priv->stream_list,
+                         gst_discoverer_stream_info_list_free);
+        /* priv->image_info is freed with stream list above */
+        priv->image_info = NULL;
+        g_clear_pointer (&priv->caps, gst_caps_unref);
+        parent_class->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_image_information_set_property (GObject      *object,
+                                               guint         property_id,
+                                               const GValue *value,
+                                               GParamSpec   *pspec)
+{
+        GUPnPDLNAGstImageInformation *info =
+                                      GUPNP_DLNA_GST_IMAGE_INFORMATION (object);
+        GUPnPDLNAGstImageInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (g_value_dup_object (value));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_image_information_get_property (GObject    *object,
+                                               guint       property_id,
+                                               GValue     *value,
+                                               GParamSpec *pspec)
+{
+        GUPnPDLNAGstImageInformation *info =
+                                      GUPNP_DLNA_GST_IMAGE_INFORMATION (object);
+        GUPnPDLNAGstImageInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_value_set_object (value, G_OBJECT (priv->info));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_image_information_class_init
+                             (GUPnPDLNAGstImageInformationClass *gst_info_class)
+{
+        GUPnPDLNAImageInformationClass *info_class =
+                            GUPNP_DLNA_IMAGE_INFORMATION_CLASS (gst_info_class);
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->get_property =
+                                  gupnp_dlna_gst_image_information_get_property;
+        object_class->set_property =
+                                  gupnp_dlna_gst_image_information_set_property;
+        object_class->dispose = gupnp_dlna_gst_image_information_dispose;
+
+        info_class->get_depth = backend_get_depth;
+        info_class->get_height = backend_get_height;
+        info_class->get_width = backend_get_width;
+        info_class->get_mime = backend_get_mime;
+
+        pspec = g_param_spec_object ("info",
+                                     "info",
+                                     "discoverer info",
+                                     GST_TYPE_DISCOVERER_INFO,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private (gst_info_class,
+                                  sizeof (GUPnPDLNAGstImageInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_image_information_init (GUPnPDLNAGstImageInformation *self)
+{
+        GUPnPDLNAGstImageInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION,
+                                         GUPnPDLNAGstImageInformationPrivate);
+
+        priv->info = NULL;
+        priv->stream_list = NULL;
+        priv->image_info = NULL;
+        priv->caps = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstImageInformation *
+gupnp_dlna_gst_image_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info)
+{
+        GList* image_list;
+        GUPnPDLNAGstImageInformation *image_info = NULL;
+
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        image_list = gst_discoverer_info_get_video_streams (info);
+
+        if (image_list) {
+                if ((image_list->next == NULL) &&
+                    gst_discoverer_video_info_is_image
+                                 (GST_DISCOVERER_VIDEO_INFO (image_list->data)))
+                        image_info = GUPNP_DLNA_GST_IMAGE_INFORMATION
+                                (g_object_new
+                                         (GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION,
+                                          "info", info,
+                                          NULL));
+                gst_discoverer_stream_info_list_free (image_list);
+        }
+
+        return image_info;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-image-information.h b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-image-information.h
new file mode 100644 (file)
index 0000000..457ea61
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_IMAGE_INFORMATION_H__
+#define __GUPNP_DLNA_GST_IMAGE_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-image-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION \
+        (gupnp_dlna_gst_image_information_get_type())
+
+#define GUPNP_DLNA_GST_IMAGE_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION, \
+                                     GUPnPDLNAGstImageInformation))
+
+#define GUPNP_DLNA_GST_IMAGE_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION, \
+                                  GUPnPDLNAGstImageInformationClass))
+
+#define GUPNP_IS_DLNA_GST_IMAGE_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_IMAGE_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION))
+
+#define GUPNP_DLNA_GST_IMAGE_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_IMAGE_INFORMATION, \
+                                    GUPnPDLNAGstImageInformationClass))
+
+typedef struct _GUPnPDLNAGstImageInformationPrivate
+                GUPnPDLNAGstImageInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAImageInformation parent;
+
+        GUPnPDLNAGstImageInformationPrivate *priv;
+} GUPnPDLNAGstImageInformation;
+
+typedef struct {
+        GUPnPDLNAImageInformationClass parent_class;
+} GUPnPDLNAGstImageInformationClass;
+
+GType
+gupnp_dlna_gst_image_information_get_type (void);
+
+GUPnPDLNAGstImageInformation *
+gupnp_dlna_gst_image_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_IMAGE_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.c
new file mode 100644 (file)
index 0000000..022bedc
--- /dev/null
@@ -0,0 +1,430 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-gst-info-utils.h"
+
+void
+gupnp_dlna_gst_discoverer_info_unref (gpointer info)
+{
+        gst_discoverer_info_unref (info);
+}
+
+void
+gupnp_dlna_gst_discoverer_stream_info_unref (gpointer stream)
+{
+        gst_discoverer_stream_info_unref (stream);
+}
+
+static GUPnPDLNAStringValue
+get_string_value_from_structure (const GstStructure *st,
+                                 const gchar *name)
+{
+        GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+
+        if (st != NULL) {
+                const gchar* data = gst_structure_get_string (st, name);
+
+                if (data != NULL) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = g_strdup (data);
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+get_string_value_from_tag_list (const GstTagList *tags,
+                                const gchar *name)
+{
+        GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+
+        if (tags != NULL) {
+                const GValue *g_value = gst_tag_list_get_value_index (tags,
+                                                                      name,
+                                                                      0);
+
+                if (g_value != NULL && G_VALUE_HOLDS_STRING (g_value)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = g_value_dup_string (g_value);
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+get_int_value_from_structure (const GstStructure *st,
+                              const gchar *name)
+{
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (st != NULL) {
+                gint idata;
+                guint udata;
+
+                if (gst_structure_get_int (st, name, &idata)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = idata;
+                } else if (gst_structure_get_uint (st, name, &udata)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = (gint) udata;
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+get_int_value_from_tag_list (const GstTagList *tags,
+                             const gchar *name)
+{
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (tags != NULL) {
+                const GValue *g_value = gst_tag_list_get_value_index (tags,
+                                                                      name,
+                                                                      0);
+
+                if (g_value != NULL) {
+                        if (G_VALUE_HOLDS_INT (g_value)) {
+                                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                                value.value = g_value_get_int (g_value);
+                        } else if (G_VALUE_HOLDS_UINT (g_value)) {
+                                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                                value.value = g_value_get_uint (g_value);
+                        }
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNABoolValue
+get_bool_value_from_structure (const GstStructure *st,
+                               const gchar *name)
+{
+        GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSET;
+
+        if (st != NULL) {
+                gboolean data;
+
+                if (gst_structure_get_boolean (st, name, &data)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = data;
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNABoolValue
+get_bool_value_from_tag_list (const GstTagList *tags,
+                              const gchar *name)
+{
+        GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSET;
+
+        if (tags != NULL) {
+                const GValue *g_value = gst_tag_list_get_value_index (tags,
+                                                                      name,
+                                                                      0);
+
+                if (g_value != NULL && G_VALUE_HOLDS_BOOLEAN (g_value)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.value = g_value_get_boolean (g_value);
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAFractionValue
+get_fraction_value_from_structure (const GstStructure *st,
+                                   const gchar *name)
+{
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (st != NULL) {
+                gint ndata;
+                gint ddata;
+
+                if (gst_structure_get_fraction (st, name, &ndata, &ddata)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.numerator = ndata;
+                        value.denominator = ddata;
+                }
+        }
+
+        return value;
+}
+
+static GUPnPDLNAFractionValue
+get_fraction_value_from_tag_list (const GstTagList *tags,
+                                  const gchar *name)
+{
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (tags != NULL) {
+                const GValue *g_value = gst_tag_list_get_value_index (tags,
+                                                                      name,
+                                                                      0);
+
+                if (g_value != NULL && GST_VALUE_HOLDS_FRACTION (g_value)) {
+                        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                        value.numerator =
+                                     gst_value_get_fraction_numerator (g_value);
+                        value.denominator =
+                                   gst_value_get_fraction_denominator (g_value);
+                }
+        }
+
+        return value;
+}
+
+GUPnPDLNAIntValue
+gupnp_dlna_gst_get_int_value (GstCaps* caps,
+                              GstDiscovererStreamInfo *stream,
+                              GstDiscovererInfo *info,
+                              const gchar *name)
+{
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (caps != NULL) {
+                guint caps_size = gst_caps_get_size (caps);
+                guint iter;
+
+                for (iter = 0; iter < caps_size; ++iter) {
+                        const GstStructure *st = gst_caps_get_structure (caps,
+                                                                         iter);
+
+                        value = get_int_value_from_structure (st, name);
+                        if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                                return value;
+                }
+        }
+
+        if (stream != NULL) {
+                const GstStructure *st =
+                                   gst_discoverer_stream_info_get_misc (stream);
+
+                value = get_int_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (info != NULL) {
+                const GstStructure *st = gst_discoverer_info_get_misc (info);
+
+                value = get_int_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (stream != NULL) {
+                const GstTagList *tags =
+                                   gst_discoverer_stream_info_get_tags (stream);
+
+                value = get_int_value_from_tag_list (tags, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        return value;
+}
+
+GUPnPDLNAStringValue
+gupnp_dlna_gst_get_string_value (GstCaps* caps,
+                                 GstDiscovererStreamInfo *stream,
+                                 GstDiscovererInfo *info,
+                                 const gchar *name)
+{
+        GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+
+        if (caps != NULL) {
+                guint caps_size = gst_caps_get_size (caps);
+                guint iter;
+
+                for (iter = 0; iter < caps_size; ++iter) {
+                        const GstStructure *st = gst_caps_get_structure (caps,
+                                                                         iter);
+
+                        value = get_string_value_from_structure (st, name);
+                        if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                                return value;
+                }
+        }
+
+        if (stream != NULL) {
+                const GstStructure *st =
+                                   gst_discoverer_stream_info_get_misc (stream);
+
+                value = get_string_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (info != NULL) {
+                const GstStructure *st = gst_discoverer_info_get_misc (info);
+
+                value = get_string_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (stream != NULL) {
+                const GstTagList *tags =
+                                   gst_discoverer_stream_info_get_tags (stream);
+
+                value = get_string_value_from_tag_list (tags, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        return value;
+}
+
+GUPnPDLNABoolValue
+gupnp_dlna_gst_get_bool_value (GstCaps* caps,
+                               GstDiscovererStreamInfo *stream,
+                               GstDiscovererInfo *info,
+                               const gchar *name)
+{
+        GUPnPDLNABoolValue value = GUPNP_DLNA_BOOL_VALUE_UNSET;
+
+        if (caps != NULL) {
+                guint caps_size = gst_caps_get_size (caps);
+                guint iter;
+
+                for (iter = 0; iter < caps_size; ++iter) {
+                        const GstStructure *st = gst_caps_get_structure (caps,
+                                                                         iter);
+
+                        value = get_bool_value_from_structure (st, name);
+                        if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                                return value;
+                }
+        }
+
+        if (stream != NULL) {
+                const GstStructure *st =
+                                   gst_discoverer_stream_info_get_misc (stream);
+
+                value = get_bool_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (info != NULL) {
+                const GstStructure *st = gst_discoverer_info_get_misc (info);
+
+                value = get_bool_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (stream != NULL) {
+                const GstTagList *tags =
+                                   gst_discoverer_stream_info_get_tags (stream);
+
+                value = get_bool_value_from_tag_list (tags, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        return value;
+}
+
+GUPnPDLNAFractionValue
+gupnp_dlna_gst_get_fraction_value (GstCaps* caps,
+                                   GstDiscovererStreamInfo *stream,
+                                   GstDiscovererInfo *info,
+                                   const gchar *name)
+{
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (caps != NULL) {
+                guint caps_size = gst_caps_get_size (caps);
+                guint iter;
+
+                for (iter = 0; iter < caps_size; ++iter) {
+                        const GstStructure *st = gst_caps_get_structure (caps,
+                                                                         iter);
+
+                        value = get_fraction_value_from_structure (st, name);
+                        if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                                return value;
+                }
+        }
+
+        if (stream != NULL) {
+                const GstStructure *st =
+                                   gst_discoverer_stream_info_get_misc (stream);
+
+                value = get_fraction_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (info != NULL) {
+                const GstStructure *st = gst_discoverer_info_get_misc (info);
+
+                value = get_fraction_value_from_structure (st, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        if (stream != NULL) {
+                const GstTagList *tags =
+                                   gst_discoverer_stream_info_get_tags (stream);
+
+                value = get_fraction_value_from_tag_list (tags, name);
+                if (value.state == GUPNP_DLNA_VALUE_STATE_SET)
+                        return value;
+        }
+
+        return value;
+}
+
+GUPnPDLNAStringValue
+gupnp_dlna_gst_get_mime (GstCaps* caps)
+{
+        GUPnPDLNAStringValue value = GUPNP_DLNA_STRING_VALUE_UNSET;
+        guint count = gst_caps_get_size (caps);
+        guint iter;
+
+        for (iter = 0; iter < count; ++iter) {
+                const GstStructure *st = gst_caps_get_structure (caps, iter);
+
+                if (st != NULL) {
+                        const gchar *name = gst_structure_get_name (st);
+
+                        /* just in case */
+                        if (name != NULL && name[0] != '\0') {
+                                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                                value.value = g_strdup (name);
+
+                                break;
+                        }
+                }
+        }
+
+        return value;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.h b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-info-utils.h
new file mode 100644 (file)
index 0000000..1ed689e
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_INFO_UTILS_H__
+#define __GUPNP_DLNA_GST_INFO_UTILS_H__
+
+#include <glib.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-values.h"
+
+G_BEGIN_DECLS
+
+/* some unref functions are macros, so we wrap them into functions,
+   because we want to pass them to g_clear_pointer. */
+void
+gupnp_dlna_gst_discoverer_info_unref (gpointer info);
+
+void
+gupnp_dlna_gst_discoverer_stream_info_unref (gpointer stream);
+
+GUPnPDLNAIntValue
+gupnp_dlna_gst_get_int_value (GstCaps* caps,
+                              GstDiscovererStreamInfo *stream,
+                              GstDiscovererInfo *info,
+                              const gchar *name);
+
+GUPnPDLNAStringValue
+gupnp_dlna_gst_get_string_value (GstCaps* caps,
+                                 GstDiscovererStreamInfo *stream,
+                                 GstDiscovererInfo *info,
+                                 const gchar *name);
+
+GUPnPDLNABoolValue
+gupnp_dlna_gst_get_bool_value (GstCaps* caps,
+                               GstDiscovererStreamInfo *stream,
+                               GstDiscovererInfo *info,
+                               const gchar *name);
+
+GUPnPDLNAFractionValue
+gupnp_dlna_gst_get_fraction_value (GstCaps* caps,
+                                   GstDiscovererStreamInfo *stream,
+                                   GstDiscovererInfo *info,
+                                   const gchar *name);
+
+GUPnPDLNAStringValue
+gupnp_dlna_gst_get_mime (GstCaps* caps);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_INFO_UTILS_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-information.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-information.c
new file mode 100644 (file)
index 0000000..bd7fc6b
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+#include "gupnp-dlna-gst-audio-information.h"
+#include "gupnp-dlna-gst-container-information.h"
+#include "gupnp-dlna-gst-image-information.h"
+#include "gupnp-dlna-gst-video-information.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstInformation,
+               gupnp_dlna_gst_information,
+               GUPNP_TYPE_DLNA_INFORMATION)
+
+struct _GUPnPDLNAGstInformationPrivate {
+        GstDiscovererInfo* info;
+};
+
+enum {
+        PROP_0,
+
+        PROP_INFO
+};
+
+static void
+gupnp_dlna_gst_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstInformation *info = GUPNP_DLNA_GST_INFORMATION (object);
+        GUPnPDLNAGstInformationPrivate *priv = info->priv;
+
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        G_OBJECT_CLASS
+                    (gupnp_dlna_gst_information_parent_class)->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_information_set_property (GObject      *object,
+                                         guint         property_id,
+                                         const GValue *value,
+                                         GParamSpec   *pspec)
+{
+        GUPnPDLNAGstInformation *info = GUPNP_DLNA_GST_INFORMATION (object);
+        GUPnPDLNAGstInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (g_value_dup_object (value));
+
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_information_get_property (GObject    *object,
+                                         guint       property_id,
+                                         GValue     *value,
+                                         GParamSpec *pspec)
+{
+        GUPnPDLNAGstInformation *info = GUPNP_DLNA_GST_INFORMATION (object);
+        GUPnPDLNAGstInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_value_set_object (value, G_OBJECT (priv->info));
+
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+
+                break;
+        }
+}
+
+GUPnPDLNAAudioInformation *
+backend_get_audio_information (GUPnPDLNAInformation *self)
+{
+        GUPnPDLNAGstInformation *gst_info = GUPNP_DLNA_GST_INFORMATION (self);
+
+        if (gst_info == NULL)
+                return NULL;
+
+        return GUPNP_DLNA_AUDIO_INFORMATION
+                (gupnp_dlna_gst_audio_information_new_from_discoverer_info
+                                        (gst_info->priv->info));
+}
+
+GUPnPDLNAContainerInformation *
+backend_get_container_information (GUPnPDLNAInformation *self)
+{
+        GUPnPDLNAGstInformation *gst_info = GUPNP_DLNA_GST_INFORMATION (self);
+
+        if (gst_info == NULL)
+                return NULL;
+
+        return GUPNP_DLNA_CONTAINER_INFORMATION
+                (gupnp_dlna_gst_container_information_new_from_discoverer_info
+                                        (gst_info->priv->info));
+}
+
+GUPnPDLNAImageInformation *
+backend_get_image_information (GUPnPDLNAInformation *self)
+{
+        GUPnPDLNAGstInformation *gst_info = GUPNP_DLNA_GST_INFORMATION (self);
+
+        return GUPNP_DLNA_IMAGE_INFORMATION
+                (gupnp_dlna_gst_image_information_new_from_discoverer_info
+                                        (gst_info->priv->info));
+}
+
+GUPnPDLNAVideoInformation *
+backend_get_video_information (GUPnPDLNAInformation *self)
+{
+        GUPnPDLNAGstInformation *gst_info = GUPNP_DLNA_GST_INFORMATION (self);
+
+        return GUPNP_DLNA_VIDEO_INFORMATION
+                (gupnp_dlna_gst_video_information_new_from_discoverer_info
+                                        (gst_info->priv->info));
+}
+
+static void
+gupnp_dlna_gst_information_class_init
+                                  (GUPnPDLNAGstInformationClass *gst_info_class)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GUPnPDLNAInformationClass *info_class =
+                                  GUPNP_DLNA_INFORMATION_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->dispose = gupnp_dlna_gst_information_dispose;
+        object_class->set_property = gupnp_dlna_gst_information_set_property;
+        object_class->get_property = gupnp_dlna_gst_information_get_property;
+        info_class->get_audio_information = backend_get_audio_information;
+        info_class->get_container_information =
+                                        backend_get_container_information;
+        info_class->get_image_information = backend_get_image_information;
+        info_class->get_video_information = backend_get_video_information;
+
+        pspec = g_param_spec_object ("info",
+                                     "info",
+                                     "discoverer info",
+                                     GST_TYPE_DISCOVERER_INFO,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private (gst_info_class,
+                                  sizeof (GUPnPDLNAGstInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_information_init (GUPnPDLNAGstInformation *self)
+{
+        GUPnPDLNAGstInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_GST_INFORMATION,
+                                         GUPnPDLNAGstInformationPrivate);
+
+        priv->info = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstInformation *
+gupnp_dlna_gst_information_new_from_discoverer_info (const gchar       *uri,
+                                                     GstDiscovererInfo *info)
+{
+        return GUPNP_DLNA_GST_INFORMATION
+                                 (g_object_new (GUPNP_TYPE_DLNA_GST_INFORMATION,
+                                                "uri", uri,
+                                                "info", info,
+                                                NULL));
+}
+
+GUPnPDLNAGstInformation *
+gupnp_dlna_gst_information_new_empty_with_uri (const gchar *uri)
+{
+        return GUPNP_DLNA_GST_INFORMATION
+                                 (g_object_new (GUPNP_TYPE_DLNA_GST_INFORMATION,
+                                                "uri", uri,
+                                                NULL));
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-information.h b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-information.h
new file mode 100644 (file)
index 0000000..a71dfc1
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_INFORMATION_H__
+#define __GUPNP_DLNA_GST_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_INFORMATION (gupnp_dlna_gst_information_get_type())
+
+#define GUPNP_DLNA_GST_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_INFORMATION, \
+                                     GUPnPDLNAGstInformation))
+
+#define GUPNP_DLNA_GST_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_INFORMATION, \
+                                  GUPnPDLNAGstInformationClass))
+
+#define GUPNP_IS_DLNA_GST_INFORMATION(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_INFORMATION_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_INFORMATION))
+
+#define GUPNP_DLNA_GST_INFORMATION_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_INFORMATION, \
+                                    GUPnPDLNAGstInformationClass))
+
+typedef struct _GUPnPDLNAGstInformationPrivate GUPnPDLNAGstInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAInformation parent;
+
+        GUPnPDLNAGstInformationPrivate *priv;
+} GUPnPDLNAGstInformation;
+
+typedef struct {
+        GUPnPDLNAInformationClass parent_class;
+} GUPnPDLNAGstInformationClass;
+
+GType
+gupnp_dlna_gst_information_get_type (void);
+
+GUPnPDLNAGstInformation *
+gupnp_dlna_gst_information_new_from_discoverer_info (const gchar       *uri,
+                                                     GstDiscovererInfo *info);
+
+GUPnPDLNAGstInformation *
+gupnp_dlna_gst_information_new_empty_with_uri (const gchar *uri);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-backend.c
new file mode 100644 (file)
index 0000000..de086a2
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <glib.h>
+#include <gmodule.h>
+#include <gst/gst.h>
+#include "gupnp-dlna-gst-metadata-extractor.h"
+
+G_MODULE_EXPORT GUPnPDLNAMetadataExtractor *
+gupnp_dlna_get_default_extractor (void)
+{
+        return GUPNP_DLNA_METADATA_EXTRACTOR
+                                     (gupnp_dlna_gst_metadata_extractor_new ());
+}
+
+G_MODULE_EXPORT const gchar *
+g_module_check_init (GModule *module G_GNUC_UNUSED)
+{
+        if (!gst_is_initialized ())
+                gst_init (NULL, NULL);
+
+        return NULL;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.c
new file mode 100644 (file)
index 0000000..e76ac85
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-gst-metadata-extractor.h"
+#include "gupnp-dlna-gst-information.h"
+#include "gupnp-dlna-gst-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstMetadataExtractor,
+               gupnp_dlna_gst_metadata_extractor,
+               GUPNP_TYPE_DLNA_METADATA_EXTRACTOR)
+
+struct _GUPnPDLNAGstMetadataExtractorPrivate {
+        gpointer placeholder;
+};
+
+static gboolean
+unref_discoverer_in_idle (GstDiscoverer *discoverer)
+{
+        if (discoverer)
+                g_object_unref (discoverer);
+
+        return FALSE;
+}
+
+static void
+gupnp_dlna_discovered_cb (GUPnPDLNAMetadataExtractor *self,
+                          GstDiscovererInfo *info,
+                          GError *error,
+                          gpointer user_data)
+{
+        GstDiscoverer *discoverer = GST_DISCOVERER (user_data);
+        GUPnPDLNAInformation *gupnp_info = NULL;
+
+        if (error)
+                gupnp_info = GUPNP_DLNA_INFORMATION
+                                  (gupnp_dlna_gst_information_new_empty_with_uri
+                                        (gst_discoverer_info_get_uri (info)));
+        else
+                gupnp_info = gupnp_dlna_gst_utils_information_from_discoverer_info
+                                        (info);
+        gupnp_dlna_metadata_extractor_emit_done (self,
+                                                 gupnp_info,
+                                                 error);
+        g_object_unref (gupnp_info);
+        g_idle_add ((GSourceFunc) unref_discoverer_in_idle, discoverer);
+}
+
+static gboolean
+backend_extract_async (GUPnPDLNAMetadataExtractor  *extractor,
+                       const gchar                 *uri,
+                       guint                        timeout,
+                       GError                     **error)
+{
+        GError *gst_error = NULL;
+        GstClockTime clock_time = GST_MSECOND * timeout;
+        GstDiscoverer *discoverer = gst_discoverer_new (clock_time, &gst_error);
+
+        if (gst_error) {
+                g_propagate_error (error, gst_error);
+
+                return FALSE;
+        }
+
+        g_signal_connect_swapped (discoverer,
+                                  "discovered",
+                                  G_CALLBACK (gupnp_dlna_discovered_cb),
+                                  extractor);
+        gst_discoverer_start (discoverer);
+
+        return gst_discoverer_discover_uri_async (discoverer,
+                                                  uri);
+}
+
+static GUPnPDLNAInformation *
+backend_extract_sync (GUPnPDLNAMetadataExtractor  *extractor G_GNUC_UNUSED,
+                      const gchar                 *uri,
+                      guint                        timeout_in_ms,
+                      GError                     **error)
+{
+        GError *gst_error = NULL;
+        GstClockTime clock_time = GST_MSECOND * timeout_in_ms;
+        GstDiscoverer *discoverer = gst_discoverer_new (clock_time, &gst_error);
+        GstDiscovererInfo* info;
+        GUPnPDLNAInformation *gupnp_info;
+
+        if (gst_error) {
+                g_propagate_error (error, gst_error);
+
+                return NULL;
+        }
+
+        info = gst_discoverer_discover_uri (discoverer,
+                                            uri,
+                                            &gst_error);
+
+        g_object_unref (discoverer);
+        if (gst_error) {
+                g_propagate_error (error, gst_error);
+
+                return NULL;
+        }
+
+        gupnp_info = GUPNP_DLNA_INFORMATION
+              (gupnp_dlna_gst_information_new_from_discoverer_info (uri, info));
+        gst_discoverer_info_unref (info);
+
+        return gupnp_info;
+}
+
+static void
+gupnp_dlna_gst_metadata_extractor_class_init
+                       (GUPnPDLNAGstMetadataExtractorClass *gst_extractor_class)
+{
+        GUPnPDLNAMetadataExtractorClass *extractor_class =
+                      GUPNP_DLNA_METADATA_EXTRACTOR_CLASS (gst_extractor_class);
+
+        extractor_class->extract_async = backend_extract_async;
+        extractor_class->extract_sync = backend_extract_sync;
+
+        g_type_class_add_private
+                                (gst_extractor_class,
+                                 sizeof (GUPnPDLNAGstMetadataExtractorPrivate));
+}
+
+static void
+gupnp_dlna_gst_metadata_extractor_init (GUPnPDLNAGstMetadataExtractor *self)
+{
+        GUPnPDLNAGstMetadataExtractorPrivate *priv =
+            G_TYPE_INSTANCE_GET_PRIVATE (self,
+                                         GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR,
+                                         GUPnPDLNAGstMetadataExtractorPrivate);
+
+        self->priv = priv;
+}
+
+GUPnPDLNAGstMetadataExtractor *
+gupnp_dlna_gst_metadata_extractor_new (void)
+{
+        return GUPNP_DLNA_GST_METADATA_EXTRACTOR
+                          (g_object_new (GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR,
+                                         NULL));
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.h b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-metadata-extractor.h
new file mode 100644 (file)
index 0000000..f8160b4
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _GUPNP_DLNA_GST_METADATA_EXTRACTOR
+#define _GUPNP_DLNA_GST_METADATA_EXTRACTOR
+
+#include <glib-object.h>
+#include "gupnp-dlna-metadata-extractor.h"
+#include "gupnp-dlna-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR \
+        (gupnp_dlna_gst_metadata_extractor_get_type())
+
+#define GUPNP_DLNA_GST_METADATA_EXTRACTOR(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR, \
+                                     GUPnPDLNAGstMetadataExtractor))
+
+#define GUPNP_DLNA_GST_METADATA_EXTRACTOR_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR, \
+                                  GUPnPDLNAGstMetadataExtractorClass))
+
+#define GUPNP_IS_DLNA_GST_METADATA_EXTRACTOR(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR))
+
+#define GUPNP_IS_DLNA_GST_METADATA_EXTRACTOR_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR))
+
+#define GUPNP_DLNA_GST_METADATA_EXTRACTOR_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_GST_METADATA_EXTRACTOR, \
+                                    GUPnPDLNAGstMetadataExtractorClass))
+
+typedef struct _GUPnPDLNAGstMetadataExtractorPrivate
+                GUPnPDLNAGstMetadataExtractorPrivate;
+
+/**
+ * GUPnPDLNAGstMetadataExtractor:
+ *
+ * The top-level object used to for metadata extraction.
+ */
+typedef struct {
+        GUPnPDLNAMetadataExtractor parent;
+
+        GUPnPDLNAGstMetadataExtractorPrivate *priv;
+} GUPnPDLNAGstMetadataExtractor;
+
+typedef struct {
+        GUPnPDLNAMetadataExtractorClass parent_class;
+} GUPnPDLNAGstMetadataExtractorClass;
+
+GType
+gupnp_dlna_gst_metadata_extractor_get_type (void);
+
+GUPnPDLNAGstMetadataExtractor *
+gupnp_dlna_gst_metadata_extractor_new (void);
+
+G_END_DECLS
+
+#endif /* _GUPNP_DLNA_GST_METADATA_EXTRACTOR */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.c
new file mode 100644 (file)
index 0000000..8f783dd
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "gupnp-dlna-gst-utils.h"
+#include "gupnp-dlna-gst-information.h"
+
+/**
+ * gupnp_dlna_gst_utils_information_from_discoverer_info:
+ * @info: A #GstDiscovererInfo object.
+ *
+ * This utility function creates a #GUPnPDLNAInformation from
+ * #GstDiscovererInfo. Its purpose is mainly to pass its result to
+ * gupnp_dlna_profile_guesser_guess_profile_from_info() to avoid
+ * rediscovering of a URI. Created #GUPnPDLNAInformation takes a
+ * reference on @info.
+ *
+ * Returns: (transfer full): A #GUPnPDLNAInformation. Unref it when
+ * done with it.
+ */
+GUPnPDLNAInformation *
+gupnp_dlna_gst_utils_information_from_discoverer_info (GstDiscovererInfo *info)
+{
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        return GUPNP_DLNA_INFORMATION
+                            (gupnp_dlna_gst_information_new_from_discoverer_info
+                                        (gst_discoverer_info_get_uri (info),
+                                         info));
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.h b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-utils.h
new file mode 100644 (file)
index 0000000..731272f
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_UTILS_H__
+#define __GUPNP_DLNA_GST_UTILS_H__
+
+#include <gst/pbutils/pbutils.h>
+#include <libgupnp-dlna/gupnp-dlna-information.h>
+
+G_BEGIN_DECLS
+
+GUPnPDLNAInformation *
+gupnp_dlna_gst_utils_information_from_discoverer_info (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_UTILS_H__ */
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-video-information.c
new file mode 100644 (file)
index 0000000..3a3b3c9
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H_ */
+#include "gupnp-dlna-gst-video-information.h"
+#include "gupnp-dlna-gst-info-utils.h"
+
+G_DEFINE_TYPE (GUPnPDLNAGstVideoInformation,
+               gupnp_dlna_gst_video_information,
+               GUPNP_TYPE_DLNA_VIDEO_INFORMATION)
+
+struct _GUPnPDLNAGstVideoInformationPrivate {
+        GstDiscovererInfo *info;
+        GList *stream_list;
+        GstDiscovererVideoInfo *video_info;
+        GstCaps *caps;
+};
+
+enum
+{
+        PROP_0,
+
+        PROP_INFO
+};
+
+static GstDiscovererVideoInfo *
+get_video_info (GUPnPDLNAGstVideoInformation *gst_info)
+{
+        GUPnPDLNAGstVideoInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->video_info) {
+                GList *iter;
+
+                if (!priv->stream_list) {
+                        priv->stream_list =
+                               gst_discoverer_info_get_stream_list (priv->info);
+                        if (!priv->stream_list)
+                                return NULL;
+                }
+
+                for (iter = priv->stream_list; iter; iter = iter->next) {
+                        GstDiscovererStreamInfo *stream =
+                                        GST_DISCOVERER_STREAM_INFO (iter->data);
+                        GType stream_type = G_TYPE_FROM_INSTANCE (stream);
+
+                        if (stream_type == GST_TYPE_DISCOVERER_VIDEO_INFO) {
+                                priv->video_info =
+                                             GST_DISCOVERER_VIDEO_INFO (stream);
+
+                                break;
+                        }
+                }
+        }
+
+        return priv->video_info;
+}
+
+static GstCaps *
+get_caps (GUPnPDLNAGstVideoInformation *gst_info)
+{
+        GUPnPDLNAGstVideoInformationPrivate *priv = gst_info->priv;
+
+        if (!priv->caps)
+                priv->caps = gst_discoverer_stream_info_get_caps
+                                        (GST_DISCOVERER_STREAM_INFO
+                                                   (get_video_info (gst_info)));
+
+        return priv->caps;
+}
+
+static GUPnPDLNAIntValue
+get_int_value (GUPnPDLNAGstVideoInformation *gst_info,
+               const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_video_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_int_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAStringValue
+get_string_value (GUPnPDLNAGstVideoInformation *gst_info,
+                  const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_video_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_string_value (caps, stream, info, name);
+}
+
+static GUPnPDLNABoolValue
+get_bool_value (GUPnPDLNAGstVideoInformation *gst_info,
+                const gchar *name)
+{
+        GstCaps *caps = get_caps (gst_info);
+        GstDiscovererStreamInfo *stream =
+                         GST_DISCOVERER_STREAM_INFO (get_video_info (gst_info));
+        GstDiscovererInfo *info = gst_info->priv->info;
+
+        return gupnp_dlna_gst_get_bool_value (caps, stream, info, name);
+}
+
+static GUPnPDLNAIntValue
+backend_get_bitrate (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint data = gst_discoverer_video_info_get_bitrate (video_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAFractionValue
+backend_get_framerate (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint ndata = gst_discoverer_video_info_get_framerate_num (video_info);
+        guint ddata = gst_discoverer_video_info_get_framerate_denom
+                                        (video_info);
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (ndata > 0 && ndata <= G_MAXINT && ddata > 0 && ddata <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.numerator = (gint) ndata;
+                value.denominator = (gint) ddata;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAIntValue
+backend_get_height (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint data = gst_discoverer_video_info_get_height (video_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNABoolValue
+backend_is_interlaced (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        gboolean data = gst_discoverer_video_info_get_height (video_info);
+        GUPnPDLNABoolValue value;
+
+        value.state = GUPNP_DLNA_VALUE_STATE_SET;
+        value.value = data;
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_level (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return get_string_value (gst_info, "level");
+}
+
+static GUPnPDLNAIntValue
+backend_get_mpeg_version (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return get_int_value (gst_info, "mpegversion");
+}
+
+static GUPnPDLNAFractionValue
+backend_get_pixel_aspect_ratio (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint ndata = gst_discoverer_video_info_get_par_num (video_info);
+        guint ddata = gst_discoverer_video_info_get_par_denom (video_info);
+        GUPnPDLNAFractionValue value = GUPNP_DLNA_FRACTION_VALUE_UNSET;
+
+        if (ndata > 0 && ndata <= G_MAXINT && ddata > 0 && ddata <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.numerator = (gint) ndata;
+                value.denominator = (gint) ddata;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_profile (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return get_string_value (gst_info, "profile");
+}
+
+static GUPnPDLNABoolValue
+backend_is_system_stream (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return get_bool_value (gst_info, "systemstream");
+}
+
+static GUPnPDLNAIntValue
+backend_get_width (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+        GstDiscovererVideoInfo *video_info = get_video_info (gst_info);
+        guint data = gst_discoverer_video_info_get_width (video_info);
+        GUPnPDLNAIntValue value = GUPNP_DLNA_INT_VALUE_UNSET;
+
+        if (data > 0 && data <= G_MAXINT) {
+                value.state = GUPNP_DLNA_VALUE_STATE_SET;
+                value.value = (gint) data;
+        }
+
+        return value;
+}
+
+static GUPnPDLNAStringValue
+backend_get_mime (GUPnPDLNAVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformation* gst_info =
+                                        GUPNP_DLNA_GST_VIDEO_INFORMATION (self);
+
+        return gupnp_dlna_gst_get_mime (get_caps (gst_info));
+}
+
+static void
+gupnp_dlna_gst_video_information_dispose (GObject *object)
+{
+        GUPnPDLNAGstVideoInformation *info =
+                                      GUPNP_DLNA_GST_VIDEO_INFORMATION (object);
+        GUPnPDLNAGstVideoInformationPrivate *priv = info->priv;
+
+        g_clear_pointer (&priv->info, gupnp_dlna_gst_discoverer_info_unref);
+        g_clear_pointer (&priv->stream_list,
+                         gst_discoverer_stream_info_list_free);
+        /* priv->video_info is freed with stream list above */
+        priv->video_info = NULL;
+        g_clear_pointer (&priv->caps, gst_caps_unref);
+        G_OBJECT_CLASS
+              (gupnp_dlna_gst_video_information_parent_class)->dispose (object);
+}
+
+static void
+gupnp_dlna_gst_video_information_set_property (GObject      *object,
+                                               guint         property_id,
+                                               const GValue *value,
+                                               GParamSpec   *pspec)
+{
+        GUPnPDLNAGstVideoInformation *info =
+                                      GUPNP_DLNA_GST_VIDEO_INFORMATION (object);
+        GUPnPDLNAGstVideoInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_clear_pointer (&priv->info,
+                                 gupnp_dlna_gst_discoverer_info_unref);
+                priv->info =
+                        GST_DISCOVERER_INFO (g_value_dup_object (value));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_video_information_get_property (GObject    *object,
+                                               guint       property_id,
+                                               GValue     *value,
+                                               GParamSpec *pspec)
+{
+        GUPnPDLNAGstVideoInformation *info =
+                                      GUPNP_DLNA_GST_VIDEO_INFORMATION (object);
+        GUPnPDLNAGstVideoInformationPrivate *priv = info->priv;
+
+        switch (property_id) {
+        case PROP_INFO:
+                g_value_set_object (value, G_OBJECT (priv->info));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_dlna_gst_video_information_class_init
+                             (GUPnPDLNAGstVideoInformationClass *gst_info_class)
+{
+        GUPnPDLNAVideoInformationClass *info_class =
+                            GUPNP_DLNA_VIDEO_INFORMATION_CLASS (gst_info_class);
+        GObjectClass *object_class = G_OBJECT_CLASS (gst_info_class);
+        GParamSpec *pspec;
+
+        object_class->get_property =
+                                  gupnp_dlna_gst_video_information_get_property;
+        object_class->set_property =
+                                  gupnp_dlna_gst_video_information_set_property;
+        object_class->dispose = gupnp_dlna_gst_video_information_dispose;
+
+        info_class->get_bitrate = backend_get_bitrate;
+        info_class->get_framerate = backend_get_framerate;
+        info_class->get_height = backend_get_height;
+        info_class->is_interlaced = backend_is_interlaced;
+        info_class->get_level = backend_get_level;
+        info_class->get_mpeg_version = backend_get_mpeg_version;
+        info_class->get_pixel_aspect_ratio = backend_get_pixel_aspect_ratio;
+        info_class->get_profile = backend_get_profile;
+        info_class->is_system_stream = backend_is_system_stream;
+        info_class->get_width = backend_get_width;
+        info_class->get_mime = backend_get_mime;
+
+        pspec = g_param_spec_object ("info",
+                                     "info",
+                                     "discoverer info",
+                                     GST_TYPE_DISCOVERER_INFO,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT);
+        g_object_class_install_property (object_class,
+                                         PROP_INFO,
+                                         pspec);
+
+        g_type_class_add_private (gst_info_class,
+                                  sizeof (GUPnPDLNAGstVideoInformationPrivate));
+}
+
+static void
+gupnp_dlna_gst_video_information_init (GUPnPDLNAGstVideoInformation *self)
+{
+        GUPnPDLNAGstVideoInformationPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (self,
+                                         GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,
+                                         GUPnPDLNAGstVideoInformationPrivate);
+
+        priv->info = NULL;
+        priv->stream_list = NULL;
+        priv->video_info = NULL;
+        priv->caps = NULL;
+        self->priv = priv;
+}
+
+GUPnPDLNAGstVideoInformation *
+gupnp_dlna_gst_video_information_new_from_discoverer_info
+                                        (GstDiscovererInfo *info)
+{
+        GList* video_list;
+        GUPnPDLNAGstVideoInformation *video_info = NULL;
+
+        g_return_val_if_fail (GST_IS_DISCOVERER_INFO (info), NULL);
+
+        video_list = gst_discoverer_info_get_video_streams (info);
+
+        if (video_list) {
+                if (!gst_discoverer_video_info_is_image
+                                 (GST_DISCOVERER_VIDEO_INFO (video_list->data)))
+                        video_info = GUPNP_DLNA_GST_VIDEO_INFORMATION
+                                        (g_object_new
+                                         (GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,
+                                          "info", info,
+                                          NULL));
+                gst_discoverer_stream_info_list_free (video_list);
+        }
+
+        return video_info;
+}
diff --git a/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-video-information.h b/libgupnp-dlna/metadata-backends/gstreamer/gupnp-dlna-gst-video-information.h
new file mode 100644 (file)
index 0000000..93ebbce
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_GST_VIDEO_INFORMATION_H__
+#define __GUPNP_DLNA_GST_VIDEO_INFORMATION_H__
+
+#include <glib-object.h>
+#include <gst/pbutils/pbutils.h>
+#include "gupnp-dlna-video-information.h"
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION gupnp_dlna_gst_video_information_get_type()
+
+#define GUPNP_DLNA_GST_VIDEO_INFORMATION(obj)                                     \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj),                             \
+                                     GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,       \
+                                     GUPnPDLNAGstVideoInformation))
+
+#define GUPNP_DLNA_GST_VIDEO_INFORMATION_CLASS(klass)                             \
+        (G_TYPE_CHECK_CLASS_CAST ((klass),                              \
+                                  GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,          \
+                                  GUPnPDLNAGstVideoInformationClass))
+
+#define GUPNP_IS_DLNA_GST_VIDEO_INFORMATION(obj)                                  \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION))
+
+#define GUPNP_IS_DLNA_GST_VIDEO_INFORMATION_CLASS(klass)                          \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION))
+
+#define GUPNP_DLNA_GST_VIDEO_INFORMATION_GET_CLASS(obj)                           \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj),                              \
+                                    GUPNP_TYPE_DLNA_GST_VIDEO_INFORMATION,        \
+                                    GUPnPDLNAGstVideoInformationClass))
+
+typedef struct _GUPnPDLNAGstVideoInformationPrivate GUPnPDLNAGstVideoInformationPrivate;
+
+typedef struct {
+        GUPnPDLNAVideoInformation parent;
+
+        GUPnPDLNAGstVideoInformationPrivate *priv;
+} GUPnPDLNAGstVideoInformation;
+
+typedef struct {
+        GUPnPDLNAVideoInformationClass parent_class;
+} GUPnPDLNAGstVideoInformationClass;
+
+GType gupnp_dlna_gst_video_information_get_type (void);
+
+GUPnPDLNAGstVideoInformation *
+gupnp_dlna_gst_video_information_new_from_discoverer_info (GstDiscovererInfo *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_GST_VIDEO_INFORMATION_H__ */
diff --git a/libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.c b/libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.c
new file mode 100644 (file)
index 0000000..2337548
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gupnp-dlna-metadata-extractor
+ * @short_description: Base class for extracting metadata for given
+ * media.
+ *
+ * #GUPnPDLNAMetadataExtractor is used by #GUPnPDLNAProfileGuesser to
+ * get needed metadata for profile matching. This class itself does
+ * not implement any metadata extraction features. For that it is
+ * expected to provide a plugin which:
+ * 1. Provides a #GUPnPDLNAMetadataExtractor subclass implementation.
+ * 2. Exports a gupnp_dlna_get_default_extractor() which takes no
+ * parameters and returns a #GUPnPDLNAMetadataExtractor.
+ *
+ * #GModule is used for loading the plugin, so #GModule's features can
+ * be used also (like exporting g_module_check_init() to initialize
+ * multimedia framework used for extracting metadata).
+ *
+ * Default plugin directory and default plugin file is set during
+ * configuration stage, but it can be overriden during runtime by
+ * setting respectively %GUPNP_DLNA_METADATA_BACKEND and
+ * %GUPNP_DLNA_METADATA_BACKEND_DIR environment variables before the
+ * plugin is loaded (i.e. before #GUPnPDLNAProfileGuesser is used for
+ * guessing profile).
+ *
+ * The %GUPNP_DLNA_METADATA_BACKEND environment variable should hold a
+ * name like "gstreamer", so libgstreamer.so will be loaded. For
+ * determining a plugin filename g_module_build_path() is used.
+ *
+ * If subclassing #GUPnPDLNAMetadataExtractor then also
+ * #GUPnPDLNAInformation, #GUPnPDLNAAudioInformation,
+ * #GUPnPDLNAContainerInformation, #GUPnPDLNAImageInformation and
+ * #GUPnPDLNAVideoInformation have to be subclassed as well.
+ */
+
+#include "gupnp-dlna-metadata-extractor.h"
+
+enum {
+        DONE,
+        SIGNAL_LAST
+};
+
+static guint signals[SIGNAL_LAST];
+
+G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAMetadataExtractor,
+                        gupnp_dlna_metadata_extractor,
+                        G_TYPE_OBJECT)
+
+struct _GUPnPDLNAMetadataExtractorPrivate {
+        gpointer placeholder;
+};
+
+static void
+gupnp_dlna_metadata_extractor_class_init
+                              (GUPnPDLNAMetadataExtractorClass *extractor_class)
+{
+        extractor_class->extract_async = NULL;
+        extractor_class->extract_sync = NULL;
+
+        /**
+         * GUPnPDLNAMetadataExtractor::done:
+         * @extractor: The #GUPnPDLNAMetadataExtractor.
+         * @info: (transfer none): The results as #GUPnPDLNAInformation.
+         * @error: (allow-none) (transfer none): Contains details of
+         * the error if discovery fails, otherwise is %NULL.
+         *
+         * Will be emitted when all information on a URI could be
+         * discovered.
+         */
+        signals[DONE] =
+                g_signal_new ("done",
+                              G_TYPE_FROM_CLASS (extractor_class),
+                              G_SIGNAL_RUN_LAST,
+                              0,
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_generic,
+                              G_TYPE_NONE,
+                              2,
+                              GUPNP_TYPE_DLNA_INFORMATION,
+                              G_TYPE_ERROR);
+
+        g_type_class_add_private (extractor_class,
+                                  sizeof (GUPnPDLNAMetadataExtractorPrivate));
+}
+
+static void
+gupnp_dlna_metadata_extractor_init (GUPnPDLNAMetadataExtractor *self)
+{
+        GUPnPDLNAMetadataExtractorPrivate *priv =
+                G_TYPE_INSTANCE_GET_PRIVATE (self,
+                                             GUPNP_TYPE_DLNA_METADATA_EXTRACTOR,
+                                             GUPnPDLNAMetadataExtractorPrivate);
+
+        self->priv = priv;
+}
+
+/**
+ * gupnp_dlna_metadata_extractor_extract_async:
+ * @extractor: #GUPnPDLNAMetadataExtractor object to use for discovery
+ * @uri: URI to gather metadata for
+ * @timeout_in_ms: Timeout in miliseconds.
+ * @error: A #GError.
+ *
+ * Queues @uri for metadata discovery. When discovery is completed,
+ * the ::done signal is emitted on @extractor.
+ *
+ * Returns: %TRUE if @uri was successfully queued, %FALSE otherwise.
+ */
+gboolean
+gupnp_dlna_metadata_extractor_extract_async
+                                    (GUPnPDLNAMetadataExtractor  *extractor,
+                                     const gchar                 *uri,
+                                     guint                        timeout_in_ms,
+                                     GError                     **error)
+{
+        GUPnPDLNAMetadataExtractorClass *extractor_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_METADATA_EXTRACTOR (extractor),
+                              FALSE);
+        g_return_val_if_fail (uri != NULL, FALSE);
+
+        extractor_class = GUPNP_DLNA_METADATA_EXTRACTOR_GET_CLASS (extractor);
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_METADATA_EXTRACTOR_CLASS
+                                        (extractor_class),
+                              FALSE);
+        g_return_val_if_fail (extractor_class->extract_async != NULL, FALSE);
+
+        return extractor_class->extract_async (extractor,
+                                               uri,
+                                               timeout_in_ms,
+                                               error);
+}
+
+/**
+ * gupnp_dlna_metadata_extractor_extract_sync:
+ * @extractor: #GUPnPDLNAMetadataExtractor object to use for discovery
+ * @uri: URI to gather metadata for
+ * @timeout_in_ms: Timeout in miliseconds.
+ * @error: A #GError.
+ *
+ * Discovers synchronously metadata of given @uri.
+ *
+ * Returns: A #GUPnPDLNAInformation object if discovery succeeded,
+ * otherwise %NULL.
+ */
+GUPnPDLNAInformation *
+gupnp_dlna_metadata_extractor_extract_sync
+                                    (GUPnPDLNAMetadataExtractor  *extractor,
+                                     const gchar                 *uri,
+                                     guint                        timeout_in_ms,
+                                     GError                     **error)
+{
+        GUPnPDLNAMetadataExtractorClass *extractor_class;
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_METADATA_EXTRACTOR (extractor),
+                              NULL);
+        g_return_val_if_fail (uri != NULL, NULL);
+
+        extractor_class = GUPNP_DLNA_METADATA_EXTRACTOR_GET_CLASS (extractor);
+
+        g_return_val_if_fail (GUPNP_IS_DLNA_METADATA_EXTRACTOR_CLASS
+                                        (extractor_class),
+                              NULL);
+        g_return_val_if_fail (extractor_class->extract_async != NULL, NULL);
+
+        return extractor_class->extract_sync (extractor,
+                                              uri,
+                                              timeout_in_ms,
+                                              error);
+}
+
+/**
+ * gupnp_dlna_metadata_extractor_emit_done:
+ * @extractor: A #GUPnPDLNAMetadataExtractor object.
+ * @info: (transfer none): A #GUPnPDLNAInformation about discovered URI.
+ * @error: (allow-none) (transfer none): A #GError.
+ *
+ * Emits ::done signal. This function is intended to be used by
+ * subclasses of #GUPnPDLNAMetadataExtractor. It is required to always
+ * pass a meaningful @info, even in case of error. That way a receiver
+ * of this signal can know which URI discovery failed by using
+ * gupnp_dlna_information_get_uri().
+ */
+void
+gupnp_dlna_metadata_extractor_emit_done (GUPnPDLNAMetadataExtractor *extractor,
+                                         GUPnPDLNAInformation       *info,
+                                         GError                     *error)
+{
+        g_return_if_fail (GUPNP_IS_DLNA_METADATA_EXTRACTOR (extractor));
+        g_return_if_fail (GUPNP_IS_DLNA_INFORMATION (info));
+
+        g_signal_emit (extractor, signals[DONE], 0, info, error);
+}
diff --git a/libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.h b/libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.h
new file mode 100644 (file)
index 0000000..610d28d
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2010 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_DLNA_METADATA_EXTRACTOR_H__
+#define __GUPNP_DLNA_METADATA_EXTRACTOR_H__
+
+#include <glib-object.h>
+#include <libgupnp-dlna/gupnp-dlna-information.h>
+
+G_BEGIN_DECLS
+
+#define GUPNP_TYPE_DLNA_METADATA_EXTRACTOR \
+        (gupnp_dlna_metadata_extractor_get_type())
+
+#define GUPNP_DLNA_METADATA_EXTRACTOR(obj) \
+        (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                     GUPNP_TYPE_DLNA_METADATA_EXTRACTOR, \
+                                     GUPnPDLNAMetadataExtractor))
+
+#define GUPNP_DLNA_METADATA_EXTRACTOR_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_CAST ((klass), \
+                                  GUPNP_TYPE_DLNA_METADATA_EXTRACTOR, \
+                                  GUPnPDLNAMetadataExtractorClass))
+
+#define GUPNP_IS_DLNA_METADATA_EXTRACTOR(obj) \
+        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                     GUPNP_TYPE_DLNA_METADATA_EXTRACTOR))
+
+#define GUPNP_IS_DLNA_METADATA_EXTRACTOR_CLASS(klass) \
+        (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                  GUPNP_TYPE_DLNA_METADATA_EXTRACTOR))
+
+#define GUPNP_DLNA_METADATA_EXTRACTOR_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                                    GUPNP_TYPE_DLNA_METADATA_EXTRACTOR, \
+                                    GUPnPDLNAMetadataExtractorClass))
+
+typedef struct _GUPnPDLNAMetadataExtractorPrivate
+                GUPnPDLNAMetadataExtractorPrivate;
+
+/**
+ * GUPnPDLNAMetadataExtractor:
+ *
+ * The top-level object used to for metadata extraction.
+ */
+typedef struct {
+        GObject parent;
+
+        GUPnPDLNAMetadataExtractorPrivate *priv;
+} GUPnPDLNAMetadataExtractor;
+
+/**
+ * GUPnPDLNAMetadataExtractorClass:
+ * @parent_class: Parent class.
+ * @extract_async: This is called by #GUPnPDLNAProfileGuesser to get a
+ * information about media file asynchronously.
+ * @extract_sync: This is called by #GUPnPDLNAProfileGuesser to get a
+ * information about media file synchronously.
+ * @_reserved: Padding. Ignore it.
+ */
+typedef struct {
+        GObjectClass parent_class;
+
+        /* virtuals */
+        gboolean
+        (* extract_async) (GUPnPDLNAMetadataExtractor  *extractor,
+                           const gchar                 *uri,
+                           guint                        timeout_in_ms,
+                           GError                     **error);
+
+        GUPnPDLNAInformation *
+        (* extract_sync) (GUPnPDLNAMetadataExtractor  *extractor,
+                          const gchar                 *uri,
+                          guint                        timeout_in_ms,
+                          GError                     **error);
+
+        gpointer _reserved[12];
+} GUPnPDLNAMetadataExtractorClass;
+
+GType
+gupnp_dlna_metadata_extractor_get_type (void);
+
+gboolean
+gupnp_dlna_metadata_extractor_extract_async
+                                    (GUPnPDLNAMetadataExtractor  *extractor,
+                                     const gchar                 *uri,
+                                     guint                        timeout_in_ms,
+                                     GError                     **error);
+
+GUPnPDLNAInformation *
+gupnp_dlna_metadata_extractor_extract_sync
+                                    (GUPnPDLNAMetadataExtractor  *extractor,
+                                     const gchar                 *uri,
+                                     guint                        timeout_in_ms,
+                                     GError                     **error);
+
+void
+gupnp_dlna_metadata_extractor_emit_done (GUPnPDLNAMetadataExtractor *extractor,
+                                         GUPnPDLNAInformation       *info,
+                                         GError                     *error);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_METADATA_EXTRACTOR_H__ */
diff --git a/libgupnp-dlna/metadata/metadata.am b/libgupnp-dlna/metadata/metadata.am
new file mode 100644 (file)
index 0000000..c0abb3b
--- /dev/null
@@ -0,0 +1,2 @@
+metadata_metadata_sources = \
+       metadata/gupnp-dlna-metadata-extractor.c
diff --git a/libgupnp-dlna/profile-loading.c b/libgupnp-dlna/profile-loading.c
deleted file mode 100644 (file)
index 874fe44..0000000
+++ /dev/null
@@ -1,921 +0,0 @@
-/*
- * Copyright (C) 2010 Nokia Corporation.
- *
- * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <glib.h>
-#include <glib/gstdio.h>
-#include <glib-object.h>
-#include <libxml/xmlreader.h>
-#include <libxml/relaxng.h>
-#include <gst/pbutils/pbutils.h>
-#include "profile-loading.h"
-#include "gupnp-dlna-profile.h"
-#include "gupnp-dlna-profile-private.h"
-
-#define GST_CAPS_NULL_NAME "NULL"
-#define DLNA_DATA_DIR DATA_DIR                              \
-        G_DIR_SEPARATOR_S "dlna-profiles" G_DIR_SEPARATOR_S
-
-static gboolean
-copy_func (GQuark field_id, const GValue *value, gpointer data)
-{
-        GstStructure *st2 = (GstStructure *)data;
-
-        if (!gst_structure_has_field (st2, g_quark_to_string (field_id)))
-                gst_structure_id_set_value (st2, field_id, value);
-
-        return TRUE;
-}
-
-/* Note: It is assumed that caps1 and caps2 have only 1 structure each */
-static GstCaps *
-merge_caps (GstCaps *caps1, GstCaps *caps2)
-{
-        GstStructure *st1, *st2;
-        GstCaps *ret;
-        gboolean any = FALSE;
-
-        /* If one of the caps GST_CAPS_ANY, gst_caps_merge will result in a
-         * GST_CAPS_ANY, which might not be correct for us */
-        if (!gst_caps_is_any (caps1) && !gst_caps_is_any (caps2)) {
-                any = TRUE;
-                gst_caps_merge (caps1, gst_caps_copy (caps2));
-                gst_caps_do_simplify (caps1);
-        }
-
-        ret = gst_caps_make_writable (caps1);
-        st1 = gst_caps_get_structure (ret, 0);
-        if (gst_caps_get_size (caps1) == 2)
-                /* Non-merged fields were copied to a second structure in caps
-                 * at gst_merge_caps() time */
-                st2 = gst_caps_get_structure (ret, 1);
-        else
-                /* Either one of the caps was GST_CAPS_ANY, or there were no
-                 * unmerged fields */
-                st2 = gst_caps_get_structure (caps2, 0);
-
-        /* If caps1 has a name, we retain it. If not, and caps2 does, caps1
-         * gets caps2's name. */
-        if ((g_strcmp0 (GST_CAPS_NULL_NAME,
-                        gst_structure_get_name (st1)) == 0) &&
-            (g_strcmp0 (GST_CAPS_NULL_NAME,
-                        gst_structure_get_name (st2)) != 0)) {
-                gst_structure_set_name (st1, gst_structure_get_name (st2));
-        }
-
-        /* We now walk over the structures and append any fields that are in
-         * caps2 but not in caps1. */
-        if (any || gst_caps_get_size (caps1) == 2)
-                gst_structure_foreach (st2, copy_func, st1);
-
-        if (gst_caps_get_size (caps1) == 2)
-                gst_caps_remove_structure (ret, 1);
-
-        return ret;
-}
-
-static xmlChar *
-get_value (xmlTextReaderPtr reader)
-{
-        xmlChar *value = NULL, *curr;
-        int ret = 1;
-
-        curr = xmlTextReaderName (reader);
-
-        /* This function may be called with reader pointing to a <field> or
-         * the element just below a <field>. In the former case, we move the
-         * cursor forward and then continue processing. */
-        if (xmlStrEqual (curr, BAD_CAST ("field")))
-                ret = xmlTextReaderRead (reader);
-        xmlFree (curr);
-
-        while (ret == 1) {
-                xmlChar *tag;
-
-                tag = xmlTextReaderName (reader);
-
-                if (xmlTextReaderNodeType (reader) == 1 &&
-                    xmlStrEqual (tag, BAD_CAST ("value"))) {
-                        /* <value> */
-
-                        /* Note: This assumes you won't have a comment in the
-                         *       middle of your text */
-                        do {
-                                ret = xmlTextReaderRead (reader);
-                        } while (ret == 1 &&
-                                 xmlTextReaderNodeType (reader) != 3 &&
-                                 xmlTextReaderNodeType (reader) != 15);
-
-                        /* We're now at the real text between a <value> and a
-                         * </value> */
-
-                        if (xmlTextReaderNodeType (reader) == 3)
-                                value = xmlTextReaderValue (reader);
-                }
-
-                if (xmlTextReaderNodeType (reader) == 15 &&
-                    xmlStrEqual (tag, BAD_CAST ("value"))) {
-                        /* </value> */
-                        xmlFree (tag);
-
-                        break;
-                }
-
-                xmlFree (tag);
-                ret = xmlTextReaderRead (reader);
-        }
-
-        if (!value)
-                g_warning ("Empty <value>s are illegal");
-
-        return value;
-}
-
-static void
-xml_str_free (xmlChar *str, gpointer unused)
-{
-        xmlFree (str);
-}
-
-static void
-free_restrictions_struct (gpointer data, gpointer user_data)
-{
-        GUPnPDLNARestrictions *restr = (GUPnPDLNARestrictions *)data;
-        if (restr) {
-                if (restr->caps)
-                        gst_caps_unref (restr->caps);
-
-                g_free (restr);
-        }
-}
-
-static void
-process_range (xmlTextReaderPtr reader, GString *caps_str)
-{
-        xmlChar *min, *max;
-
-        min = xmlTextReaderGetAttribute (reader, BAD_CAST ("min"));
-        max = xmlTextReaderGetAttribute (reader, BAD_CAST ("max"));
-
-        g_string_append_printf (caps_str, "[ %s, %s ]", min, max);
-
-        xmlFree (min);
-        xmlFree (max);
-}
-
-static int
-process_field (xmlTextReaderPtr reader,
-               GString          *caps_str,
-               gboolean         relaxed_mode,
-               gboolean         extended_mode)
-{
-        int ret;
-        xmlChar *name;
-        xmlChar *type;
-        xmlChar *used;
-        GList *values = NULL;
-        gboolean done = FALSE, skip = FALSE;
-
-        /*
-         * Parse the 'used' attribute and figure out the mode we
-         * need to follow.
-         */
-        used = xmlTextReaderGetAttribute (reader, BAD_CAST ("used"));
-        if (used) {
-                if ((relaxed_mode == FALSE) &&
-                    xmlStrEqual (used, BAD_CAST ("in-relaxed"))) {
-                        skip = TRUE;
-                } else if ((relaxed_mode == TRUE) &&
-                           (xmlStrEqual (used, BAD_CAST ("in-strict")))) {
-                        skip = TRUE;
-                }
-
-                xmlFree (used);
-        }
-
-        name = xmlTextReaderGetAttribute (reader, BAD_CAST ("name"));
-        type = xmlTextReaderGetAttribute (reader, BAD_CAST ("type"));
-
-        /*
-         * This function reads a <field> and appends it to caps_str in the
-         * GstCaps-as-a-string format:
-         *
-         *   Single value: field = (type) value
-         *   Multiple values: field = (type) { value1, value2, value3 }
-         *   Range: field = (type) [ min, max ]
-         */
-
-        /* Fields are comma-separeted. The leading comma is okay for the first
-         * field - we will be prepending the restriction name to this string */
-        if (!skip)
-                g_string_append_printf (caps_str, ", %s = (%s) ", name, type);
-
-        xmlFree (name);
-        xmlFree (type);
-
-        ret = xmlTextReaderRead (reader);
-        while (ret == 1 && !done) {
-                xmlChar *tag;
-
-                tag = xmlTextReaderName (reader);
-
-                switch (xmlTextReaderNodeType (reader)) {
-                case 1:
-                        if (skip)
-                                break;
-
-                        if (xmlStrEqual (tag, BAD_CAST ("range"))) {
-                                /* <range> */
-                                process_range (reader, caps_str);
-                        } else if (xmlStrEqual (tag, BAD_CAST ("value"))) {
-                                /* <value> */
-                                xmlChar *value;
-
-                                value = get_value (reader);
-
-                                if (value)
-                                        values = g_list_append (values, value);
-                        }
-
-                        break;
-
-                case 15:
-                        if (xmlStrEqual (tag, BAD_CAST ("field")))
-                                /* </field> */
-                                done = TRUE;
-
-                        break;
-
-                default:
-                        break;
-                }
-
-                xmlFree (tag);
-                ret = xmlTextReaderRead (reader);
-        }
-
-        if (skip)
-                return ret;
-
-        if (g_list_length (values) == 1)
-                /* Single value */
-                g_string_append_printf (caps_str,
-                                        "%s",
-                                        (xmlChar *) values->data);
-        else if (g_list_length (values) > 1) {
-                /* Multiple values */
-                GList *tmp = values->next;
-                g_string_append_printf (caps_str,
-                                        "{ %s",
-                                        (xmlChar *) values->data);
-
-                do {
-                        g_string_append_printf (caps_str,
-                                                ", %s",
-                                                (xmlChar *) tmp->data);
-                } while ((tmp = tmp->next) != NULL);
-
-                g_string_append_printf (caps_str, " }");
-        }
-
-        if (values) {
-                g_list_foreach (values, (GFunc) xml_str_free, NULL);
-                g_list_free (values);
-        }
-
-        return ret;
-}
-
-static GUPnPDLNARestrictions *
-process_parent (xmlTextReaderPtr reader, GUPnPDLNALoadState *data)
-{
-        xmlChar *parent;
-        xmlChar *used;
-        GUPnPDLNARestrictions *restr = NULL;
-
-        /*
-         * Check to see if we need to follow any relaxed/strict mode
-         * restrictions.
-         */
-        used = xmlTextReaderGetAttribute (reader, BAD_CAST ("used"));
-        if (used) {
-                if ((data->relaxed_mode == FALSE) &&
-                    xmlStrEqual (used, BAD_CAST ("in-relaxed"))) {
-                        xmlFree (used);
-                        return NULL;
-                } else if ((data->relaxed_mode == TRUE) &&
-                           (xmlStrEqual (used, BAD_CAST ("in-strict")))) {
-                        xmlFree (used);
-                        return NULL;
-                }
-        }
-
-        parent = xmlTextReaderGetAttribute (reader, BAD_CAST ("name"));
-        restr = g_hash_table_lookup (data->restrictions, parent);
-
-        if (!restr) {
-                g_warning ("Could not find parent restriction: %s", parent);
-                return NULL;
-        }
-
-        xmlFree (parent);
-        xmlFree (used);
-
-        return restr;
-}
-
-static GUPnPDLNARestrictions *
-process_restriction (xmlTextReaderPtr reader, GUPnPDLNALoadState *data)
-{
-        GUPnPDLNARestrictions *restr = NULL;
-        GType type;
-        GstCaps *caps = NULL;
-        GString *caps_str = g_string_sized_new (100);
-        GList *parents = NULL, *tmp;
-        xmlChar *id, *name = NULL, *restr_type, *used;
-        int ret;
-        gboolean done = FALSE, skip = FALSE;
-
-        /*
-         * First we parse the 'used' attribute and figure out
-         * the mode we need to comply to.
-         */
-        used = xmlTextReaderGetAttribute (reader, BAD_CAST ("used"));
-        if (used) {
-                if ((data->relaxed_mode == FALSE) &&
-                    xmlStrEqual (used, BAD_CAST ("in-relaxed"))) {
-                        skip = TRUE;
-                } else if ((data->relaxed_mode == TRUE) &&
-                           (xmlStrEqual (used, BAD_CAST ("in-strict")))) {
-                        skip = TRUE;
-                }
-        }
-
-        /* We then walk through the fields in this restriction, and make a
-         * string that can be parsed by gst_caps_from_string (). We then make
-         * a GstCaps from this string */
-
-        id = xmlTextReaderGetAttribute (reader, BAD_CAST ("id"));
-        restr_type = xmlTextReaderGetAttribute (reader, BAD_CAST ("type"));
-
-        ret = xmlTextReaderRead (reader);
-        while (ret == 1 && !done) {
-                xmlChar *tag;
-
-                tag = xmlTextReaderName (reader);
-
-                switch (xmlTextReaderNodeType (reader)) {
-                case 1:
-                        if (skip)
-                                break;
-
-                        if (xmlStrEqual (tag, BAD_CAST ("field"))) {
-                                /* <field> */
-                                xmlChar *field;
-
-                                field = xmlTextReaderGetAttribute
-                                        (reader, BAD_CAST ("name"));
-
-                                /* We handle the "name" field specially - if
-                                 * present, it is the caps name */
-                                if (xmlStrEqual (field, BAD_CAST ("name")))
-                                        name = get_value (reader);
-                                else
-                                        process_field (reader,
-                                                       caps_str,
-                                                       data->relaxed_mode,
-                                                       data->extended_mode);
-
-                                xmlFree (field);
-                        } else if (xmlStrEqual (tag, BAD_CAST ("parent"))) {
-                                /* <parent> */
-                                GUPnPDLNARestrictions *restr =
-                                        process_parent (reader, data);
-
-                                if (restr && restr->caps)
-                                        /* Collect parents in a list - we'll
-                                         * coalesce them later */
-                                        parents = g_list_append (parents,
-                                                                 gst_caps_copy
-                                                                 (restr->caps));
-                        }
-
-                        break;
-
-                case 15:
-                        if (xmlStrEqual (tag, BAD_CAST ("restriction")))
-                                /* </restriction> */
-                                done = TRUE;
-
-                        break;
-
-                default:
-                        break;
-                }
-
-                xmlFree (tag);
-                ret = xmlTextReaderRead (reader);
-        }
-
-        if (skip)
-                goto out;
-
-        /* If the restriction doesn't have a name, we make it up */
-        if (!name)
-                name = BAD_CAST (g_strdup (GST_CAPS_NULL_NAME));
-        g_string_prepend (caps_str, (gchar *) name);
-        xmlFree (name);
-
-        if (xmlStrEqual (restr_type, BAD_CAST ("container")))
-                type = GST_TYPE_ENCODING_CONTAINER_PROFILE;
-        else if (xmlStrEqual (restr_type, BAD_CAST ("audio")))
-                type = GST_TYPE_ENCODING_AUDIO_PROFILE;
-        else if (xmlStrEqual (restr_type, BAD_CAST ("video")))
-                type = GST_TYPE_ENCODING_VIDEO_PROFILE;
-        else if (xmlStrEqual (restr_type, BAD_CAST ("image")))
-                type = GST_TYPE_ENCODING_VIDEO_PROFILE;
-        else {
-                g_warning ("Support for '%s' restrictions not yet implemented",
-                           restr_type);
-                goto out;
-        }
-
-        caps = gst_caps_from_string (caps_str->str);
-        g_string_free (caps_str, TRUE);
-        g_return_val_if_fail (caps != NULL, NULL);
-
-        tmp = parents;
-        while (tmp) {
-                /* Merge all the parent caps. The child overrides parent
-                 * attributes */
-                GstCaps *tmp_caps = (GstCaps *)tmp->data;
-                caps = merge_caps (caps, tmp_caps);
-                gst_caps_unref (tmp_caps);
-                tmp = tmp->next;
-        }
-
-        restr = g_new0 (GUPnPDLNARestrictions, 1);
-
-        restr->caps = gst_caps_copy (caps);
-        restr->type = type;
-
-        if (id)
-                g_hash_table_insert (data->restrictions, id, restr);
-
-out:
-        xmlFree (restr_type);
-        if (used)
-                xmlFree (used);
-        if (caps)
-                gst_caps_unref (caps);
-        if (parents)
-                g_list_free (parents);
-
-        return restr;
-}
-
-static void
-process_restrictions (xmlTextReaderPtr reader, GUPnPDLNALoadState *data)
-{
-        int ret = xmlTextReaderRead (reader);
-
-        while (ret == 1) {
-                xmlChar *tag;
-
-                tag = xmlTextReaderName (reader);
-
-                switch (xmlTextReaderNodeType (reader)) {
-                case 1:
-                        if (xmlStrEqual (tag, BAD_CAST ("restriction"))) {
-                                /* <restriction> */
-                                process_restriction (reader, data);
-                        }
-
-                        break;
-
-                case 15:
-                        if (xmlStrEqual (tag, BAD_CAST ("restrictions"))) {
-                                /* </restrictions> */
-                                xmlFree (tag);
-                                return;
-                        }
-
-                default:
-                        break;
-                }
-
-                xmlFree (tag);
-                ret = xmlTextReaderRead (reader);
-        }
-}
-
-static void
-process_dlna_profile (xmlTextReaderPtr   reader,
-                      GList              **profiles,
-                      GUPnPDLNALoadState *data)
-{
-        guint ret;
-        GUPnPDLNAProfile *profile = NULL;
-        GUPnPDLNAProfile  *base = NULL;
-        GUPnPDLNARestrictions *restr = NULL;
-        GstCaps *temp_audio = NULL, *temp_video = NULL, *temp_container = NULL;
-        xmlChar *name, *mime, *id, *base_profile, *extended;
-        gboolean done = FALSE, is_extended = FALSE;
-
-        name = xmlTextReaderGetAttribute (reader, BAD_CAST ("name"));
-        mime = xmlTextReaderGetAttribute (reader, BAD_CAST ("mime"));
-        extended = xmlTextReaderGetAttribute (reader, BAD_CAST ("extended"));
-        id = xmlTextReaderGetAttribute (reader, BAD_CAST ("id"));
-        base_profile = xmlTextReaderGetAttribute (reader,
-                                                  BAD_CAST ("base-profile"));
-
-        /* Create temporary place-holders for caps */
-        temp_container = gst_caps_new_empty ();
-        temp_video = gst_caps_new_empty ();
-        temp_audio = gst_caps_new_empty ();
-
-        if (!name) {
-                g_assert (mime == NULL);
-
-                /* We need a non-NULL string to not trigger asserts in the
-                 * places these are used. Profiles without names are used
-                 * only for inheritance, not for actual matching. */
-                name = xmlStrdup (BAD_CAST (""));
-                mime = xmlStrdup (BAD_CAST (""));
-        }
-
-        if (extended && xmlStrEqual (extended, BAD_CAST ("true"))) {
-                /* If we're not in extended mode, skip this profile */
-                if (!data->extended_mode)
-                        goto out;
-
-                is_extended = TRUE;
-        }
-
-        ret = xmlTextReaderRead (reader);
-        while (ret == 1 && !done) {
-                xmlChar *tag;
-
-                tag = xmlTextReaderName (reader);
-
-                switch (xmlTextReaderNodeType (reader)) {
-                case 1:
-                        if (xmlStrEqual (tag, BAD_CAST ("restriction")))
-                                restr = process_restriction (reader, data);
-                        else if (xmlStrEqual (tag, BAD_CAST ("parent")))
-                                restr = process_parent (reader, data);
-
-                        if (!restr)
-                                break;
-
-                        if (restr->type == GST_TYPE_ENCODING_CONTAINER_PROFILE)
-                                gst_caps_merge (temp_container,
-                                                gst_caps_copy (restr->caps));
-                        else if (restr->type == GST_TYPE_ENCODING_VIDEO_PROFILE)
-                                gst_caps_merge (temp_video,
-                                                gst_caps_copy (restr->caps));
-                        else if (restr->type == GST_TYPE_ENCODING_AUDIO_PROFILE)
-                                gst_caps_merge (temp_audio,
-                                                gst_caps_copy (restr->caps));
-                        else
-                                g_assert_not_reached ();
-
-                        break;
-
-                case 15:
-                        if (xmlStrEqual (tag, BAD_CAST ("dlna-profile")))
-                                done = TRUE;
-
-                default:
-                        break;
-                }
-
-                xmlFree (tag);
-                ret = xmlTextReaderRead (reader);
-        }
-
-        if (base_profile) {
-                base = g_hash_table_lookup (data->profile_ids, base_profile);
-                if (!base)
-                        g_warning ("Invalid base-profile reference");
-        }
-
-
-        /* create a new GUPnPDLNAProfile */
-        profile = gupnp_dlna_profile_new ((gchar *)name,
-                                          (gchar *)mime,
-                                          GST_CAPS_NONE,
-                                          GST_CAPS_NONE,
-                                          GST_CAPS_NONE,
-                                          is_extended);
-
-        /* Inherit from base profile, if it exists*/
-        if (base) {
-                const GstCaps *video_caps =
-                                       gupnp_dlna_profile_get_video_caps (base);
-                const GstCaps *audio_caps =
-                                       gupnp_dlna_profile_get_audio_caps (base);
-                const GstCaps *container_caps =
-                                       gupnp_dlna_profile_get_container_caps (base);
-
-                if (GST_IS_CAPS (video_caps))
-                        gst_caps_merge (temp_video,
-                                        gst_caps_copy (video_caps));
-                if (GST_IS_CAPS (audio_caps))
-                        gst_caps_merge (temp_audio,
-                                        gst_caps_copy (audio_caps));
-                if (GST_IS_CAPS (container_caps))
-                        gst_caps_merge (temp_container,
-                                        gst_caps_copy (container_caps));
-
-        }
-
-
-        /* The merged caps will be our new GUPnPDLNAProfile */
-
-        if (GST_IS_CAPS (temp_container) && !gst_caps_is_empty (temp_container))
-                gupnp_dlna_profile_set_container_caps (profile, temp_container);
-        if (GST_IS_CAPS (temp_video) && !gst_caps_is_empty (temp_video))
-                gupnp_dlna_profile_set_video_caps (profile, temp_video);
-        if (GST_IS_CAPS (temp_audio) && !gst_caps_is_empty (temp_audio))
-                gupnp_dlna_profile_set_audio_caps (profile, temp_audio);
-
-        *profiles = g_list_append (*profiles, profile);
-
-        if (id) {
-                /* id is freed when the hash table is destroyed */
-                g_object_ref (profile);
-                g_hash_table_insert (data->profile_ids, id, profile);
-        }
-
-out:
-
-        if (temp_container)
-                gst_caps_unref (temp_container);
-        if (temp_audio)
-                gst_caps_unref (temp_audio);
-        if (temp_video)
-                gst_caps_unref (temp_video);
-
-        xmlFree (mime);
-        xmlFree (name);
-        if (extended)
-                xmlFree (extended);
-        if (base_profile)
-                xmlFree (base_profile);
-}
-
-static GList *
-process_include (xmlTextReaderPtr reader, GUPnPDLNALoadState *data)
-{
-        xmlChar *path;
-        GList *ret;
-
-        path = xmlTextReaderGetAttribute (reader, BAD_CAST ("ref"));
-
-        if (!g_path_is_absolute ((gchar *) path)) {
-                gchar *tmp = g_strconcat (DLNA_DATA_DIR,
-                                          G_DIR_SEPARATOR_S,
-                                          path,
-                                          NULL);
-                xmlFree (path);
-                path = BAD_CAST (tmp);
-        }
-
-        ret = gupnp_dlna_load_profiles_from_file ((gchar *) path,
-                                                  data);
-        xmlFree (path);
-
-        return ret;
-}
-
-/* This can go away once we have a glib function to canonicalize paths (see
- * https://bugzilla.gnome.org/show_bug.cgi?id=111848
- *
- * The implementationis not generic enough, but sufficient for our use. The
- * idea is taken from Tristan Van Berkom's comment in the bug mentioned above:
- *
- *   1. cd dirname(path)
- *   2. absdir = $CWD
- *   3. cd $OLDPWD
- *   4. abspath = absdir + basename(path)
- */
-static gchar *
-canonicalize_path_name (const char *path)
-{
-        gchar *dir_name = NULL, *file_name = NULL, *abs_dir = NULL,
-              *old_dir = NULL, *ret = NULL;
-
-        if (g_path_is_absolute (path))
-                return g_strdup (path);
-
-        old_dir = g_get_current_dir ();
-        dir_name = g_path_get_dirname (path);
-
-        if (g_chdir (dir_name) < 0) {
-                ret = g_strdup (path);
-                goto out;
-        }
-
-        abs_dir = g_get_current_dir ();
-        g_chdir (old_dir);
-
-        file_name = g_path_get_basename (path);
-        ret = g_build_filename (abs_dir, file_name, NULL);
-
-out:
-        g_free (dir_name);
-        g_free (file_name);
-        g_free (abs_dir);
-        g_free (old_dir);
-
-        return ret;
-}
-
-GList *
-gupnp_dlna_load_profiles_from_file (const char         *file_name,
-                                    GUPnPDLNALoadState *data)
-{
-        GList *profiles = NULL;
-        gchar *path = NULL;
-        xmlTextReaderPtr reader;
-        xmlRelaxNGParserCtxtPtr rngp;
-        xmlRelaxNGPtr rngs;
-        int ret;
-
-        path = canonicalize_path_name (file_name);
-        if (g_hash_table_lookup_extended (data->files_hash, path, NULL, NULL))
-                goto out;
-        else
-                g_hash_table_insert (data->files_hash, g_strdup (path), NULL);
-
-        reader = xmlNewTextReaderFilename (path);
-        if (!reader)
-                goto out;
-
-        /* Load the schema for validation */
-        rngp = xmlRelaxNGNewParserCtxt (DLNA_DATA_DIR "dlna-profiles.rng");
-        rngs = xmlRelaxNGParse (rngp);
-        xmlTextReaderRelaxNGSetSchema (reader, rngs);
-
-        ret = xmlTextReaderRead (reader);
-        while (ret == 1) {
-                xmlChar *tag;
-
-                tag = xmlTextReaderName (reader);
-
-                switch (xmlTextReaderNodeType (reader)) {
-                        /* Start tag */
-                        case 1:
-                                if (xmlStrEqual (tag, BAD_CAST ("include"))) {
-                                        /* <include> */
-                                        GList *include =
-                                                process_include (reader,
-                                                                 data);
-                                        profiles = g_list_concat (profiles,
-                                                                  include);
-                                } else if (xmlStrEqual (tag,
-                                        BAD_CAST ("restrictions"))) {
-                                        /* <restrictions> */
-                                        process_restrictions (reader,
-                                                              data);
-                                } else if (xmlStrEqual (tag,
-                                        BAD_CAST ("dlna-profile"))) {
-                                        /* <dlna-profile> */
-                                        process_dlna_profile (reader,
-                                                              &profiles,
-                                                              data);
-
-                                }
-
-                                break;
-
-                        default:
-                                break;
-                }
-
-                xmlFree (tag);
-                ret = xmlTextReaderRead (reader);
-        }
-
-        xmlFreeTextReader (reader);
-        xmlRelaxNGFree (rngs);
-        xmlRelaxNGFreeParserCtxt (rngp);
-
-out:
-        g_free (path);
-
-        return profiles;
-}
-
-GList *
-gupnp_dlna_load_profiles_from_dir (gchar *profile_dir, GUPnPDLNALoadState *data)
-{
-        GDir *dir;
-
-        data->restrictions =
-                g_hash_table_new_full (g_str_hash,
-                                       g_str_equal,
-                                       (GDestroyNotify) xmlFree,
-                                       (GDestroyNotify)
-                                       free_restrictions_struct);
-        data->profile_ids =
-                g_hash_table_new_full (g_str_hash,
-                                       g_str_equal,
-                                       (GDestroyNotify) xmlFree,
-                                       (GDestroyNotify)
-                                       g_object_unref);
-
-        GList *profiles = NULL;
-
-        if ((dir = g_dir_open (profile_dir, 0, NULL))) {
-                const gchar *entry;
-
-                while ((entry = g_dir_read_name (dir))) {
-                        gchar *path = g_strconcat (profile_dir,
-                                                   G_DIR_SEPARATOR_S,
-                                                   entry,
-                                                   NULL);
-
-                        if (g_str_has_suffix (entry, ".xml") &&
-                            g_file_test (path, G_FILE_TEST_IS_REGULAR)) {
-                                profiles = g_list_concat (profiles,
-                                        gupnp_dlna_load_profiles_from_file (
-                                                path,
-                                                data));
-                        }
-
-                        g_free (path);
-                }
-
-                g_dir_close (dir);
-        }
-
-        g_hash_table_unref (data->restrictions);
-        g_hash_table_unref (data->profile_ids);
-
-        return profiles;
-}
-
-GList *
-gupnp_dlna_load_profiles_from_disk (gboolean relaxed_mode,
-                                    gboolean extended_mode)
-{
-        GUPnPDLNALoadState *load_data;
-        GList *ret, *i;
-
-        load_data = g_new0 (GUPnPDLNALoadState, 1);
-
-        load_data->files_hash = g_hash_table_new_full (g_str_hash,
-                                                       g_str_equal,
-                                                       g_free,
-                                                       NULL);
-        load_data->relaxed_mode = relaxed_mode;
-        load_data->extended_mode = extended_mode;
-
-        ret = gupnp_dlna_load_profiles_from_dir (DLNA_DATA_DIR,
-                                                 load_data);
-
-        /* Now that we're done loading profiles, remove all profiles with no
-         * name which are only used for inheritance and not matching. */
-        i = ret;
-        while (i) {
-                const gchar *name;
-                GUPnPDLNAProfile *profile = i->data;
-                GstEncodingProfile *enc_profile =
-                                        gupnp_dlna_profile_get_encoding_profile
-                                                  (profile);
-                GList *tmp = g_list_next (i);
-
-                name = gst_encoding_profile_get_name (enc_profile);
-                if (name[0] == '\0') {
-                        ret = g_list_delete_link (ret, i);
-                        g_object_unref (profile);
-                }
-
-                i = tmp;
-        }
-
-        g_hash_table_unref (load_data->files_hash);
-        g_free (load_data);
-        load_data = NULL;
-
-        return ret;
-}
diff --git a/libgupnp-dlna/profile-loading.h b/libgupnp-dlna/profile-loading.h
deleted file mode 100644 (file)
index fa1f966..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2009 Nokia Corporation.
- *
- * Authors: Zeeshan Ali <zeeshanak@gnome.org>
- *                      <zeeshan.ali@nokia.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __GUPNP_DLNA_LOAD_H__
-#define __GUPNP_DLNA_LOAD_H__
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-typedef struct {
-        GHashTable *restrictions;
-        GHashTable *profile_ids;
-        GHashTable *files_hash;
-        gboolean   relaxed_mode;
-        gboolean   extended_mode;
-} GUPnPDLNALoadState;
-
-typedef struct {
-        GstCaps *caps;
-        GType   type;
-} GUPnPDLNARestrictions;
-
-GList *
-gupnp_dlna_load_profiles_from_file (const gchar  *file_name,
-                                   GUPnPDLNALoadState  *data);
-GList *
-gupnp_dlna_load_profiles_from_dir (gchar         *profile_dir,
-                                   GUPnPDLNALoadState *data);
-
-GList *
-gupnp_dlna_load_profiles_from_disk (gboolean relaxed_mode,
-                                    gboolean extended_mode);
-
-G_END_DECLS
-
-#endif /* __GUPNP_DLNA_LOAD_H__ */
diff --git a/m4/vapigen.m4 b/m4/vapigen.m4
new file mode 100644 (file)
index 0000000..df6395d
--- /dev/null
@@ -0,0 +1,41 @@
+
+dnl vala.m4
+dnl
+dnl Copyright 2010 Marc-Andre Lureau
+dnl Copyright 2011 Rodney Dawes <dobey.pwns@gmail.com>
+dnl
+dnl This library is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Lesser General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2.1 of the License, or (at your option) any later version.
+dnl
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+dnl Lesser General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU Lesser General Public
+dnl License along with this library; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+
+dnl dropped everything but VALA_PROG_VAPIGEN - Jens Georg <mail@jensge.org>
+
+# Check whether the Vala API Generator exists in `PATH'. If it is found,
+# the variable VAPIGEN is set. Optionally a minimum release number of the
+# generator can be requested.
+#
+# VALA_PROG_VAPIGEN([MINIMUM-VERSION])
+# ------------------------------------
+AC_DEFUN([VALA_PROG_VAPIGEN],
+[AC_PATH_PROG([VAPIGEN], [vapigen], [])
+  AS_IF([test -z "$VAPIGEN"],
+    [AC_MSG_WARN([No Vala API Generator found. You will not be able to generate .vapi files.])],
+    [AS_IF([test -n "$1"],
+        [AC_MSG_CHECKING([$VAPIGEN is at least version $1])
+         am__vapigen_version=`$VAPIGEN --version | sed 's/Vala API Generator  *//'`
+         AS_VERSION_COMPARE([$1], ["$am__vapigen_version"],
+           [AC_MSG_RESULT([yes])],
+           [AC_MSG_RESULT([yes])],
+           [AC_MSG_RESULT([no])
+            AC_MSG_WARN([Vala API Generator $1 not found.])])])])
+])
index 40d3d46..e99faec 100644 (file)
@@ -1,2 +1,5 @@
+* Thu Mar 07 2013 Regis Merlino <regis.merlino@intel.com>
+- Submit version 0.10.0 of GUPnP-DLNA ( a245d94 )
+
 * Mon Nov 26 14:57:34 CET 2012 - Mark Ryan <mark.d.ryan@intel.com>
 - Submit version 0.6.6 ( fae1d4e ) of GUPnP-DLNA 
index e80deb8..75ea49d 100644 (file)
@@ -7,12 +7,12 @@
 
 Name:       gupnp-dlna
 Summary:    Utility library for easing DLNA-related tasks
-Version:    0.6.6
+Version:    0.10.0
 Release:    0
 Group:      Applications/Multimedia
 License:    LGPLv2.1
 URL:        http://www.gupnp.org
-Source0:    http://download.gnome.org/sources/%{name}/0.6/%{name}-%{version}.tar.gz
+Source0:    http://download.gnome.org/sources/%{name}/0.10/%{name}-%{version}.tar.gz
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 BuildRequires:  pkgconfig(glib-2.0)
@@ -51,7 +51,7 @@ Files for development with gupnp-dlna
 # >> build pre
 # << build pre
 
-%configure --disable-static
+%configure --disable-static --disable-gstreamer-metadata-backend --enable-legacy-gstreamer-metadata-backend --with-default-metadata-backend=gstreamer-legacy 
 make %{?jobs:-j%jobs}
 
 # >> build post
@@ -79,33 +79,50 @@ rm -rf  $RPM_BUILD_ROOT%{_datadir}/gtk-doc
 %files
 %defattr(-,root,root,-)
 # >> files
-%{_bindir}/gupnp-dlna-info
-%{_bindir}/gupnp-dlna-ls-profiles
-%{_libdir}/libgupnp-dlna-1.0.so.*
-%{_datadir}/gupnp-dlna/dlna-profiles/aac.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/ac3.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/amr.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/avc.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/common.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/dlna-profiles.rng
-%{_datadir}/gupnp-dlna/dlna-profiles/jpeg.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/lpcm.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/mp3.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/mpeg-ts.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/mpeg1.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/mpeg4.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/png.xml
-%{_datadir}/gupnp-dlna/dlna-profiles/wma.xml
+%{_bindir}/gupnp-dlna-info-2.0
+%{_bindir}/gupnp-dlna-ls-profiles-2.0
+%{_libdir}/libgupnp-dlna-2.0.so.*
+%{_libdir}/libgupnp-dlna-gst-legacy-2.0.so.*
+%{_libdir}/gupnp-dlna/libgstreamer-legacy.so
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/aac.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/ac3.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/amr.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/avc.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/common.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/dlna-profiles.rng
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/jpeg.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/lpcm.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/mp3.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/mpeg-ts.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/mpeg1.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/mpeg4.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/png.xml
+%{_datadir}/gupnp-dlna-2.0/dlna-profiles/wma.xml
 # << files
 
 
 %files devel
 %defattr(-,root,root,-)
 # >> files devel
-%{_includedir}/gupnp-dlna-1.0/libgupnp-dlna/gupnp-dlna-discoverer.h
-%{_includedir}/gupnp-dlna-1.0/libgupnp-dlna/gupnp-dlna-information.h
-%{_includedir}/gupnp-dlna-1.0/libgupnp-dlna/gupnp-dlna-profile.h
-%{_libdir}/pkgconfig/gupnp-dlna-1.0.pc
-%{_libdir}/libgupnp-dlna-1.0.so
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-audio-information.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-container-information.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-gst-legacy-utils.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-g-values.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-image-information.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-information.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-profile.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-profile-guesser.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-restriction.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-value-list.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-values.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/gupnp-dlna-video-information.h
+%{_includedir}/gupnp-dlna-2.0/libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.h
+%{_libdir}/pkgconfig/gupnp-dlna-2.0.pc
+%{_libdir}/pkgconfig/gupnp-dlna-metadata-2.0.pc
+%{_libdir}/pkgconfig/gupnp-dlna-gst-legacy-2.0.pc
+%{_libdir}/libgupnp-dlna-2.0.so
+%{_libdir}/libgupnp-dlna-gst-legacy-2.0.so
+%{_libdir}/gupnp-dlna/libgstreamer-legacy.so
 # << files devel
 
index cbd7766..a916937 100644 (file)
@@ -1,13 +1,19 @@
-noinst_PROGRAMS = dlna-profile-parser dlna-encoding
+noinst_PROGRAMS = sets
 
-AM_CFLAGS = -I$(top_srcdir) $(GST_CFLAGS) $(GST_PBU_CFLAGS) $(LIBXML_CFLAGS)
-LIBS = $(GST_LIBS) \
-       $(LIBXML_LIBS) \
-       $(GST_PBU_LIBS) \
-       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-1.0.la
-
-dlna_profile_parser_SOURCES = dlna-profile-parser.c
-dlna_encoding_SOURCES = dlna-encoding.c
-
-TESTS_ENVIRONMENT = MEDIA_DIR="$(srcdir)/media" FILE_LIST="$(srcdir)/media/media-list.txt" ${SHELL}
-TESTS = test-discoverer.sh
+sets_SOURCES = \
+       sets.c
+sets_LDADD = \
+       $(GLIB_LIBS) \
+       $(GOBJECT_LIBS) \
+       $(LIBXML_LIBS) \
+       $(GMODULE_LIBS) \
+       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
+sets_CFLAGS = \
+       $(GLIB_CFLAGS) \
+       $(GOBJECT_CFLAGS) \
+       $(LIBXML_CFLAGS) \
+       $(GMODULE_CFLAGS) \
+       -I$(top_srcdir) \
+       -I$(top_srcdir)/libgupnp-dlna \
+       -I$(top_srcdir)/libgupnp-dlna/profile-backends/native \
+       -I$(top_srcdir)/libgupnp-dlna/profile-backends/native/sets
index d255377..c6fa6dc 100644 (file)
@@ -51,7 +51,7 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-noinst_PROGRAMS = dlna-profile-parser$(EXEEXT) dlna-encoding$(EXEEXT)
+noinst_PROGRAMS = sets$(EXEEXT)
 subdir = tests
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
        $(srcdir)/test-discoverer.sh.in
@@ -60,7 +60,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -68,15 +68,18 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES = test-discoverer.sh
 CONFIG_CLEAN_VPATH_FILES =
 PROGRAMS = $(noinst_PROGRAMS)
-am_dlna_encoding_OBJECTS = dlna-encoding.$(OBJEXT)
-dlna_encoding_OBJECTS = $(am_dlna_encoding_OBJECTS)
-dlna_encoding_LDADD = $(LDADD)
+am_sets_OBJECTS = sets-sets.$(OBJEXT)
+sets_OBJECTS = $(am_sets_OBJECTS)
+am__DEPENDENCIES_1 =
+sets_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
-am_dlna_profile_parser_OBJECTS = dlna-profile-parser.$(OBJEXT)
-dlna_profile_parser_OBJECTS = $(am_dlna_profile_parser_OBJECTS)
-dlna_profile_parser_LDADD = $(LDADD)
+sets_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sets_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
@@ -103,8 +106,8 @@ am__v_CCLD_0 = @echo "  CCLD  " $@;
 AM_V_GEN = $(am__v_GEN_@AM_V@)
 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(dlna_encoding_SOURCES) $(dlna_profile_parser_SOURCES)
-DIST_SOURCES = $(dlna_encoding_SOURCES) $(dlna_profile_parser_SOURCES)
+SOURCES = $(sets_SOURCES)
+DIST_SOURCES = $(sets_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -112,8 +115,6 @@ am__can_run_installinfo = \
   esac
 ETAGS = etags
 CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
@@ -141,18 +142,30 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
 GST_LIBS = @GST_LIBS@
 GST_MAJORMINOR = @GST_MAJORMINOR@
 GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
 GST_PBU_LIBS = @GST_PBU_LIBS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
 GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
 HTML_DIR = @HTML_DIR@
 INSTALL = @INSTALL@
@@ -171,19 +184,17 @@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
-LIBS = $(GST_LIBS) \
-       $(LIBXML_LIBS) \
-       $(GST_PBU_LIBS) \
-       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-1.0.la
-
+LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
 LIBXML_CFLAGS = @LIBXML_CFLAGS@
 LIBXML_LIBS = @LIBXML_LIBS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -207,6 +218,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -260,16 +272,31 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CFLAGS = -I$(top_srcdir) $(GST_CFLAGS) $(GST_PBU_CFLAGS) $(LIBXML_CFLAGS)
-dlna_profile_parser_SOURCES = dlna-profile-parser.c
-dlna_encoding_SOURCES = dlna-encoding.c
-TESTS_ENVIRONMENT = MEDIA_DIR="$(srcdir)/media" FILE_LIST="$(srcdir)/media/media-list.txt" ${SHELL}
-TESTS = test-discoverer.sh
+sets_SOURCES = \
+       sets.c
+
+sets_LDADD = \
+       $(GLIB_LIBS) \
+       $(GOBJECT_LIBS) \
+       $(LIBXML_LIBS) \
+       $(GMODULE_LIBS) \
+       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
+
+sets_CFLAGS = \
+       $(GLIB_CFLAGS) \
+       $(GOBJECT_CFLAGS) \
+       $(LIBXML_CFLAGS) \
+       $(GMODULE_CFLAGS) \
+       -I$(top_srcdir) \
+       -I$(top_srcdir)/libgupnp-dlna \
+       -I$(top_srcdir)/libgupnp-dlna/profile-backends/native \
+       -I$(top_srcdir)/libgupnp-dlna/profile-backends/native/sets
+
 all: all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
            *$$dep*) \
@@ -294,9 +321,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-$(top_srcdir)/configure:  $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 test-discoverer.sh: $(top_builddir)/config.status $(srcdir)/test-discoverer.sh.in
@@ -310,12 +337,9 @@ clean-noinstPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
-dlna-encoding$(EXEEXT): $(dlna_encoding_OBJECTS) $(dlna_encoding_DEPENDENCIES) $(EXTRA_dlna_encoding_DEPENDENCIES) 
-       @rm -f dlna-encoding$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(dlna_encoding_OBJECTS) $(dlna_encoding_LDADD) $(LIBS)
-dlna-profile-parser$(EXEEXT): $(dlna_profile_parser_OBJECTS) $(dlna_profile_parser_DEPENDENCIES) $(EXTRA_dlna_profile_parser_DEPENDENCIES) 
-       @rm -f dlna-profile-parser$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(dlna_profile_parser_OBJECTS) $(dlna_profile_parser_LDADD) $(LIBS)
+sets$(EXEEXT): $(sets_OBJECTS) $(sets_DEPENDENCIES) $(EXTRA_sets_DEPENDENCIES) 
+       @rm -f sets$(EXEEXT)
+       $(AM_V_CCLD)$(sets_LINK) $(sets_OBJECTS) $(sets_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -323,8 +347,7 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlna-encoding.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlna-profile-parser.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sets-sets.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -347,6 +370,20 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+sets-sets.o: sets.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sets_CFLAGS) $(CFLAGS) -MT sets-sets.o -MD -MP -MF $(DEPDIR)/sets-sets.Tpo -c -o sets-sets.o `test -f 'sets.c' || echo '$(srcdir)/'`sets.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/sets-sets.Tpo $(DEPDIR)/sets-sets.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sets.c' object='sets-sets.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sets_CFLAGS) $(CFLAGS) -c -o sets-sets.o `test -f 'sets.c' || echo '$(srcdir)/'`sets.c
+
+sets-sets.obj: sets.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sets_CFLAGS) $(CFLAGS) -MT sets-sets.obj -MD -MP -MF $(DEPDIR)/sets-sets.Tpo -c -o sets-sets.obj `if test -f 'sets.c'; then $(CYGPATH_W) 'sets.c'; else $(CYGPATH_W) '$(srcdir)/sets.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/sets-sets.Tpo $(DEPDIR)/sets-sets.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='sets.c' object='sets-sets.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sets_CFLAGS) $(CFLAGS) -c -o sets-sets.obj `if test -f 'sets.c'; then $(CYGPATH_W) 'sets.c'; else $(CYGPATH_W) '$(srcdir)/sets.c'; fi`
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -405,99 +442,6 @@ GTAGS:
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-check-TESTS: $(TESTS)
-       @failed=0; all=0; xfail=0; xpass=0; skip=0; \
-       srcdir=$(srcdir); export srcdir; \
-       list=' $(TESTS) '; \
-       $(am__tty_colors); \
-       if test -n "$$list"; then \
-         for tst in $$list; do \
-           if test -f ./$$tst; then dir=./; \
-           elif test -f $$tst; then dir=; \
-           else dir="$(srcdir)/"; fi; \
-           if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-             all=`expr $$all + 1`; \
-             case " $(XFAIL_TESTS) " in \
-             *[\ \     ]$$tst[\ \      ]*) \
-               xpass=`expr $$xpass + 1`; \
-               failed=`expr $$failed + 1`; \
-               col=$$red; res=XPASS; \
-             ;; \
-             *) \
-               col=$$grn; res=PASS; \
-             ;; \
-             esac; \
-           elif test $$? -ne 77; then \
-             all=`expr $$all + 1`; \
-             case " $(XFAIL_TESTS) " in \
-             *[\ \     ]$$tst[\ \      ]*) \
-               xfail=`expr $$xfail + 1`; \
-               col=$$lgn; res=XFAIL; \
-             ;; \
-             *) \
-               failed=`expr $$failed + 1`; \
-               col=$$red; res=FAIL; \
-             ;; \
-             esac; \
-           else \
-             skip=`expr $$skip + 1`; \
-             col=$$blu; res=SKIP; \
-           fi; \
-           echo "$${col}$$res$${std}: $$tst"; \
-         done; \
-         if test "$$all" -eq 1; then \
-           tests="test"; \
-           All=""; \
-         else \
-           tests="tests"; \
-           All="All "; \
-         fi; \
-         if test "$$failed" -eq 0; then \
-           if test "$$xfail" -eq 0; then \
-             banner="$$All$$all $$tests passed"; \
-           else \
-             if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-             banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-           fi; \
-         else \
-           if test "$$xpass" -eq 0; then \
-             banner="$$failed of $$all $$tests failed"; \
-           else \
-             if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-             banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
-           fi; \
-         fi; \
-         dashes="$$banner"; \
-         skipped=""; \
-         if test "$$skip" -ne 0; then \
-           if test "$$skip" -eq 1; then \
-             skipped="($$skip test was not run)"; \
-           else \
-             skipped="($$skip tests were not run)"; \
-           fi; \
-           test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-             dashes="$$skipped"; \
-         fi; \
-         report=""; \
-         if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-           report="Please report to $(PACKAGE_BUGREPORT)"; \
-           test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-             dashes="$$report"; \
-         fi; \
-         dashes=`echo "$$dashes" | sed s/./=/g`; \
-         if test "$$failed" -eq 0; then \
-           col="$$grn"; \
-         else \
-           col="$$red"; \
-         fi; \
-         echo "$${col}$$dashes$${std}"; \
-         echo "$${col}$$banner$${std}"; \
-         test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
-         test -z "$$report" || echo "$${col}$$report$${std}"; \
-         echo "$${col}$$dashes$${std}"; \
-         test "$$failed" -eq 0; \
-       else :; fi
-
 distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -529,7 +473,6 @@ distdir: $(DISTFILES)
          fi; \
        done
 check-am: all-am
-       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: check-am
 all-am: Makefile $(PROGRAMS)
 installdirs:
@@ -634,21 +577,20 @@ ps-am:
 
 uninstall-am:
 
-.MAKE: check-am install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
-       clean-generic clean-libtool clean-noinstPROGRAMS ctags \
-       distclean distclean-compile distclean-generic \
-       distclean-libtool distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-libtool clean-noinstPROGRAMS ctags distclean \
+       distclean-compile distclean-generic distclean-libtool \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+       pdf pdf-am ps ps-am tags uninstall uninstall-am
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/tests/dlna-encoding.c b/tests/dlna-encoding.c
deleted file mode 100644 (file)
index 95e4f3f..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-/* Example application for using GstProfile and encodebin
- * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <glib.h>
-#include <gst/gst.h>
-#include <gst/pbutils/pbutils.h>
-#include <gst/pbutils/encoding-profile.h>
-#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
-
-static gboolean silent = FALSE;
-
-static void
-pad_added_cb (GstElement * uridecodebin, GstPad * pad, GstElement * encodebin)
-{
-  GstPad *sinkpad;
-
-  sinkpad = gst_element_get_compatible_pad (encodebin, pad, NULL);
-
-  if (sinkpad == NULL) {
-    GstCaps *caps;
-
-    /* Ask encodebin for a compatible pad */
-    caps = gst_pad_get_caps (pad);
-    g_signal_emit_by_name (encodebin, "request-pad", caps, &sinkpad);
-    if (caps)
-      gst_caps_unref (caps);
-  }
-  if (sinkpad == NULL) {
-    g_print ("Couldn't get an encoding channel for pad %s:%s\n",
-        GST_DEBUG_PAD_NAME (pad));
-    return;
-  }
-
-  if (G_UNLIKELY (gst_pad_link (pad, sinkpad) != GST_PAD_LINK_OK)) {
-    g_print ("Couldn't link pads\n");
-  }
-
-  return;
-}
-
-static gboolean
-autoplug_continue_cb (GstElement * uridecodebin, GstPad * somepad,
-    GstCaps * caps, GstElement * encodebin)
-{
-  GstPad *sinkpad;
-
-  g_signal_emit_by_name (encodebin, "request-pad", caps, &sinkpad);
-
-  if (sinkpad == NULL)
-    return TRUE;
-
-  return FALSE;
-}
-
-static void
-bus_message_cb (GstBus * bus, GstMessage * message, GMainLoop * mainloop)
-{
-  switch (GST_MESSAGE_TYPE (message)) {
-    case GST_MESSAGE_ERROR:
-      g_print ("ERROR\n");
-      g_main_loop_quit (mainloop);
-      break;
-    case GST_MESSAGE_EOS:
-      g_print ("Done\n");
-      g_main_loop_quit (mainloop);
-      break;
-    default:
-      break;
-  }
-}
-
-static void
-transcode_file (gchar * uri, gchar * outputuri, GstEncodingProfile * prof)
-{
-  GstElement *pipeline;
-  GstElement *src;
-  GstElement *ebin;
-  GstElement *sink;
-  GstBus *bus;
-  GstCaps *profilecaps, *rescaps;
-  GMainLoop *mainloop;
-
-  g_print (" Input URI  : %s\n", uri);
-  g_print (" Output URI : %s\n", outputuri);
-
-  sink = gst_element_make_from_uri (GST_URI_SINK, outputuri, "sink");
-  if (G_UNLIKELY (sink == NULL)) {
-    g_print ("Can't create output sink, most likely invalid output URI !\n");
-    return;
-  }
-
-  src = gst_element_factory_make ("uridecodebin", NULL);
-  if (G_UNLIKELY (src == NULL)) {
-    g_print ("Can't create uridecodebin for input URI, aborting!\n");
-    return;
-  }
-
-  /* Figure out the streams that can be passed as-is to encodebin */
-  g_object_get (src, "caps", &rescaps, NULL);
-  rescaps = gst_caps_copy (rescaps);
-  profilecaps = gst_encoding_profile_get_input_caps (prof);
-  gst_caps_append (rescaps, profilecaps);
-
-  /* Set properties */
-  g_object_set (src, "uri", uri, "caps", rescaps, NULL);
-
-  ebin = gst_element_factory_make ("encodebin", NULL);
-  g_object_set (ebin, "profile", prof, NULL);
-
-  g_signal_connect (src, "autoplug-continue", G_CALLBACK (autoplug_continue_cb),
-      ebin);
-  g_signal_connect (src, "pad-added", G_CALLBACK (pad_added_cb), ebin);
-
-  pipeline = gst_pipeline_new ("encoding-pipeline");
-
-  gst_bin_add_many (GST_BIN (pipeline), src, ebin, sink, NULL);
-
-  gst_element_link (ebin, sink);
-
-  mainloop = g_main_loop_new (NULL, FALSE);
-
-  bus = gst_pipeline_get_bus ((GstPipeline *) pipeline);
-  gst_bus_add_signal_watch (bus);
-  g_signal_connect (bus, "message", G_CALLBACK (bus_message_cb), mainloop);
-
-  if (gst_element_set_state (pipeline,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
-    g_print ("Failed to start the encoding\n");
-    return;
-  }
-
-  g_main_loop_run (mainloop);
-
-  gst_element_set_state (pipeline, GST_STATE_NULL);
-  gst_object_unref (pipeline);
-}
-
-static gchar *
-ensure_uri (gchar * location)
-{
-  gchar *res;
-  gchar *path;
-
-  if (gst_uri_is_valid (location))
-    return g_strdup (location);
-
-  if (!g_path_is_absolute (location)) {
-    gchar *cur_dir;
-    cur_dir = g_get_current_dir ();
-    path = g_build_filename (cur_dir, location, NULL);
-    g_free (cur_dir);
-  } else
-    path = g_strdup (location);
-
-  res = g_filename_to_uri (path, NULL, NULL);
-  g_free (path);
-
-  return res;
-}
-
-int
-main (int argc, char **argv)
-{
-  GError *err = NULL;
-  gchar *outputuri = NULL;
-  gchar *format = NULL;
-  GOptionEntry options[] = {
-    {"silent", 's', 0, G_OPTION_ARG_NONE, &silent,
-        "Don't output the information structure", NULL},
-    {"outputuri", 'o', 0, G_OPTION_ARG_STRING, &outputuri,
-        "URI to encode to", "URI (<protocol>://<location>)"},
-    {"format", 'f', 0, G_OPTION_ARG_STRING, &format,
-        "DLNA profile to use", NULL},
-    {NULL}
-  };
-  GOptionContext *ctx;
-  GUPnPDLNADiscoverer *discoverer;
-  GUPnPDLNAProfile *profile;
-  gchar *inputuri;
-
-  if (!g_thread_supported ())
-    g_thread_init (NULL);
-
-  ctx = g_option_context_new ("- encode URIs with GstProfile and encodebin");
-  g_option_context_add_main_entries (ctx, options, NULL);
-  g_option_context_add_group (ctx, gst_init_get_option_group ());
-
-  if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
-    g_print ("Error initializing: %s\n", err->message);
-    exit (1);
-  }
-
-  g_option_context_free (ctx);
-
-  if (outputuri == NULL || argc != 2) {
-    g_print ("usage: %s <inputuri> -o <outputuri> --format <profile>\n",
-        argv[0]);
-    exit (-1);
-  }
-
-  gst_init(&argc, &argv);
-
-  /* Create the profile */
-  discoverer = gupnp_dlna_discoverer_new ((GstClockTime) GST_SECOND,
-                                          FALSE,
-                                          FALSE);
-  profile = gupnp_dlna_discoverer_get_profile (discoverer, format);
-  if (G_UNLIKELY (profile == NULL)) {
-    g_print ("Encoding arguments are not valid !\n");
-    return 1;
-  }
-
-  /* Fixup outputuri to be a URI */
-  inputuri = ensure_uri (argv[1]);
-  outputuri = ensure_uri (outputuri);
-
-  /* Trancode file */
-  transcode_file (inputuri,
-                  outputuri,
-                  gupnp_dlna_profile_get_encoding_profile (profile));
-
-  /* cleanup */
-  g_object_unref (profile);
-  g_object_unref (discoverer);
-
-  return 0;
-}
diff --git a/tests/dlna-profile-parser.c b/tests/dlna-profile-parser.c
deleted file mode 100644 (file)
index ee45d10..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2010 Nokia Corporation.
- *
- * Authors: Arun Raghavan <arun.raghavan@collabora.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <gst/gst.h>
-#include <libgupnp-dlna/profile-loading.h>
-#include <libgupnp-dlna/gupnp-dlna-profile.h>
-#include <gst/pbutils/pbutils.h>
-#include <libxml/xmlmemory.h>
-#include <stdlib.h>
-
-static void usage (void)
-{
-        g_print ("Usage: dlna-profile-parser file1 file2 ... dir1 dir2 ...\n");
-}
-
-static void print_caps (const GstCaps *caps)
-{
-        int i;
-
-        for (i = 0; i < gst_caps_get_size (caps); i++) {
-                GstStructure *structure = gst_caps_get_structure (caps, i);
-                gchar *tmp = gst_structure_to_string (structure);
-
-                g_print ("%s`- %s\n", i ? "    " : "", tmp);
-
-                g_free (tmp);
-        }
-}
-
-static void print_profile (GUPnPDLNAProfile *profile, gpointer unused)
-{
-        GstEncodingProfile *enc_profile;
-        const GList *tmp;
-        gchar *caps_str;
-
-        enc_profile = gupnp_dlna_profile_get_encoding_profile (profile);
-        tmp = gst_encoding_container_profile_get_profiles (GST_ENCODING_CONTAINER_PROFILE (enc_profile));
-        caps_str = gst_caps_to_string ((GstCaps *)gst_encoding_profile_get_format (enc_profile));
-
-        g_print ("Loaded DLNA Profile: %s, %s - format %s\n",
-                 gupnp_dlna_profile_get_name (profile),
-                 gupnp_dlna_profile_get_mime (profile),
-                 caps_str);
-
-        while (tmp) {
-                print_caps (gst_encoding_profile_get_format
-                                        (GST_ENCODING_PROFILE(tmp->data)));
-                tmp = tmp->next;
-        }
-
-        g_print ("\n");
-        g_free (caps_str);
-        gst_encoding_profile_unref (enc_profile);
-}
-
-static void
-free_restrictions_struct (gpointer data, gpointer user_data)
-{
-        GUPnPDLNARestrictions *restr = (GUPnPDLNARestrictions *)data;
-        if (restr) {
-                if (restr->caps)
-                        gst_caps_unref (restr->caps);
-
-                g_free (restr);
-        }
-}
-
-int
-main (int argc, char **argv)
-{
-        GList *profiles = NULL;
-        GUPnPDLNALoadState *data;
-        gboolean relaxed_mode = FALSE;
-        gboolean extended_mode = FALSE;
-        GError *err = NULL;
-        gint i;
-
-        GOptionEntry options[] = {
-                {"relaxed mode", 'r', 0, G_OPTION_ARG_NONE, &relaxed_mode,
-                 "Enable Relaxed mode", NULL},
-                {"extended mode", 'e', 0, G_OPTION_ARG_NONE, &extended_mode,
-                 "Enable extended mode", NULL},
-                {NULL}
-        };
-
-        GOptionContext *ctx;
-
-        if (!g_thread_supported ())
-                g_thread_init (NULL);
-
-        ctx = g_option_context_new (" - test to parse dlna profiles");
-        g_option_context_add_main_entries (ctx, options, NULL);
-        g_option_context_add_group (ctx, gst_init_get_option_group ());
-
-        if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
-
-                g_print ("Error initializing: %s\n", err->message);
-                exit (1);
-        }
-
-        g_option_context_free (ctx);
-
-        gst_init (&argc, &argv);
-
-        if (argc < 2) {
-                usage ();
-                return EXIT_FAILURE;
-        }
-
-        data = g_new (GUPnPDLNALoadState, 1);
-
-        data->restrictions = g_hash_table_new_full (g_str_hash,
-                                                    g_str_equal,
-                                                    (GDestroyNotify) xmlFree,
-                                                    (GDestroyNotify)
-                                                    free_restrictions_struct);
-        data->profile_ids = g_hash_table_new_full (g_str_hash,
-                                                   g_str_equal,
-                                                   (GDestroyNotify) xmlFree,
-                                                   (GDestroyNotify)
-                                                   g_object_unref);
-        data->files_hash = g_hash_table_new_full (g_str_hash,
-                                                  g_str_equal,
-                                                  g_free,
-                                                  NULL);
-
-        data->relaxed_mode = relaxed_mode;
-        data->extended_mode = extended_mode;
-
-        for (i = 1; i < argc; i++) {
-                GList *tmp;
-
-                if (g_file_test (argv[i], G_FILE_TEST_IS_DIR))
-                        tmp = gupnp_dlna_load_profiles_from_dir (argv[i],
-                                                                 data);
-                else
-                        tmp = gupnp_dlna_load_profiles_from_file (argv[i],
-                                                                  data);
-
-                profiles = g_list_concat (profiles, tmp);
-        }
-
-        g_list_foreach (profiles, (GFunc)print_profile, NULL);
-        g_list_foreach (profiles, (GFunc)g_object_unref, NULL);
-
-        g_hash_table_unref (data->restrictions);
-        g_hash_table_unref (data->profile_ids);
-        g_hash_table_unref (data->files_hash);
-        g_free (data);
-        data = NULL;
-        return EXIT_SUCCESS;
-}
diff --git a/tests/sets.c b/tests/sets.c
new file mode 100644 (file)
index 0000000..5e208cf
--- /dev/null
@@ -0,0 +1,415 @@
+/*
+ * Copyright (C) 2012, 2013 Intel Corporation.
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <glib.h>
+
+#include "gupnp-dlna-value-type.h"
+#include "gupnp-dlna-value-list-private.h"
+#include "gupnp-dlna-restriction-private.h"
+#include "gupnp-dlna-info-set.h"
+
+static void
+value_type_not_null (void)
+{
+        g_assert (gupnp_dlna_value_type_bool () != NULL);
+        g_assert (gupnp_dlna_value_type_fraction () != NULL);
+        g_assert (gupnp_dlna_value_type_int () != NULL);
+        g_assert (gupnp_dlna_value_type_string () != NULL);
+}
+
+static void
+value_list_single (void)
+{
+        GUPnPDLNAValueList *list;
+        gboolean result;
+
+        /* bool */
+        list = gupnp_dlna_value_list_new
+                                     (gupnp_dlna_value_type_bool ());
+        g_assert (list != NULL);
+        result = gupnp_dlna_value_list_add_single (list, "true");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "false");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "wrong");
+        g_assert (result == FALSE);
+        gupnp_dlna_value_list_free (list);
+
+        /* fraction */
+        list = gupnp_dlna_value_list_new
+                                 (gupnp_dlna_value_type_fraction ());
+        g_assert (list != NULL);
+        result = gupnp_dlna_value_list_add_single (list, "1/2");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "15/3");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "wrong");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_single (list, "1/0");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_single (list, "1/2/3");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_single (list, "wrong/bad");
+        g_assert (result == FALSE);
+        gupnp_dlna_value_list_free (list);
+
+        /* int */
+        list = gupnp_dlna_value_list_new
+                                      (gupnp_dlna_value_type_int ());
+        g_assert (list != NULL);
+        result = gupnp_dlna_value_list_add_single (list, "1");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "-15");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "wrong");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_single (list, "1.4");
+        g_assert (result == FALSE);
+        gupnp_dlna_value_list_free (list);
+
+        /* string */
+        list = gupnp_dlna_value_list_new
+                                   (gupnp_dlna_value_type_string ());
+        g_assert (list != NULL);
+        result = gupnp_dlna_value_list_add_single (list, "1");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "-15");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "wrong");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_single (list, "1.4");
+        g_assert (result == TRUE);
+        gupnp_dlna_value_list_free (list);
+}
+
+static void
+value_list_range (void)
+{
+        GUPnPDLNAValueList *list;
+        gboolean result;
+
+        /* bool ranges have no sense. */
+        list = gupnp_dlna_value_list_new
+                                     (gupnp_dlna_value_type_bool ());
+        g_assert (list != NULL);
+        result = gupnp_dlna_value_list_add_range (list, "true", "true");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "false", "true");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "false", "false");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "false", "true");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "false", "wrong");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "wrong", "true");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "wrong", "bad");
+        g_assert (result == FALSE);
+        gupnp_dlna_value_list_free (list);
+
+        /* fraction */
+        list = gupnp_dlna_value_list_new
+                                 (gupnp_dlna_value_type_fraction ());
+        g_assert (list != NULL);
+        result = gupnp_dlna_value_list_add_range (list, "1/2", "3/4");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_range (list, "-8/3", "15/3");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_range (list, "wrong", "bad");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "1/0", "-4/3");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "1/2/3", "3/2");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "a/b", "c/d");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "1/2", "1/4");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "1/2", "-1/2");
+        g_assert (result == FALSE);
+        gupnp_dlna_value_list_free (list);
+
+        /* int */
+        list = gupnp_dlna_value_list_new
+                                      (gupnp_dlna_value_type_int ());
+        g_assert (list != NULL);
+        result = gupnp_dlna_value_list_add_range (list, "1", "3");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_range (list, "-15", "15");
+        g_assert (result == TRUE);
+        result = gupnp_dlna_value_list_add_range (list, "wrong", "bad");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "1.4", "3");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "1", "-3");
+        g_assert (result == FALSE);
+        gupnp_dlna_value_list_free (list);
+
+        /* string ranges have no sense */
+        list = gupnp_dlna_value_list_new
+                                   (gupnp_dlna_value_type_string ());
+        g_assert (list != NULL);
+        result = gupnp_dlna_value_list_add_range (list, "1", "3");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "-15", "x");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "wrong", "bad");
+        g_assert (result == FALSE);
+        result = gupnp_dlna_value_list_add_range (list, "1.4", "-1");
+        g_assert (result == FALSE);
+        gupnp_dlna_value_list_free (list);
+}
+
+static void
+restriction_construction (void)
+{
+        GUPnPDLNARestriction *r = gupnp_dlna_restriction_new
+                                        (NULL);
+        GHashTable *e = gupnp_dlna_restriction_get_entries (r);
+
+        g_assert_cmpstr (gupnp_dlna_restriction_get_mime (r), ==, NULL);
+        g_assert_cmpuint (g_hash_table_size (e), ==, 0);
+        gupnp_dlna_restriction_free (r);
+
+        r = gupnp_dlna_restriction_new ("mime");
+        e = gupnp_dlna_restriction_get_entries (r);
+        g_assert_cmpstr (gupnp_dlna_restriction_get_mime (r), ==, "mime");
+        g_assert_cmpuint (g_hash_table_size (e), ==, 0);
+        gupnp_dlna_restriction_free (r);
+}
+
+static void
+restriction_empty (void)
+{
+        GUPnPDLNARestriction *r =
+                                       gupnp_dlna_restriction_new (NULL);
+        GUPnPDLNAValueList *list = gupnp_dlna_value_list_new
+                                         (gupnp_dlna_value_type_bool ());
+
+        g_assert (gupnp_dlna_restriction_is_empty (r));
+        gupnp_dlna_value_list_add_single (list, "true");
+        g_assert (gupnp_dlna_restriction_add_value_list (r,
+                                                                "bool",
+                                                                list));
+        g_assert (!gupnp_dlna_restriction_is_empty (r));
+        gupnp_dlna_restriction_free (r);
+        r = gupnp_dlna_restriction_new ("mime");
+        g_assert (!gupnp_dlna_restriction_is_empty (r));
+        gupnp_dlna_restriction_free (r);
+}
+
+static void
+restriction_adding_value_lists (void)
+{
+        GUPnPDLNARestriction *r =
+                                       gupnp_dlna_restriction_new (NULL);
+        GUPnPDLNAValueList *list = gupnp_dlna_value_list_new
+                                         (gupnp_dlna_value_type_bool ());
+
+        g_assert (gupnp_dlna_restriction_is_empty (r));
+        /* adding empty value list should fail */
+        g_assert (!gupnp_dlna_restriction_add_value_list (r,
+                                                                 "bool",
+                                                                 list));
+        g_assert (gupnp_dlna_restriction_is_empty (r));
+        gupnp_dlna_value_list_add_single (list, "true");
+        g_assert (gupnp_dlna_restriction_add_value_list (r,
+                                                                "bool",
+                                                                list));
+        g_assert (!gupnp_dlna_restriction_is_empty (r));
+        list = gupnp_dlna_value_list_new
+                                         (gupnp_dlna_value_type_bool ());
+        gupnp_dlna_value_list_add_single (list, "false");
+        /* adding value list with already existing name should fail */
+        g_assert (!gupnp_dlna_restriction_add_value_list (r,
+                                                                 "bool",
+                                                                 list));
+        gupnp_dlna_value_list_free (list);
+        gupnp_dlna_restriction_free (r);
+}
+
+static void
+restriction_merge (void)
+{
+        /* TODO: Write a test. */
+}
+
+static void
+info_set_adding_values (void)
+{
+        GUPnPDLNAInfoSet *info_set = gupnp_dlna_info_set_new ("mime");
+
+        g_assert (info_set != NULL);
+        g_assert (gupnp_dlna_info_set_add_bool (info_set, "b", TRUE));
+        /* invalid fraction */
+        g_assert (!gupnp_dlna_info_set_add_fraction (info_set, "f", 1, 0));
+        g_assert (gupnp_dlna_info_set_add_fraction (info_set, "f", 1, 2));
+        g_assert (gupnp_dlna_info_set_add_int (info_set, "i", 42));
+        g_assert (gupnp_dlna_info_set_add_string (info_set, "s", "str"));
+        /* that name already exists */
+        g_assert (!gupnp_dlna_info_set_add_bool (info_set, "b", FALSE));
+
+        gupnp_dlna_info_set_free (info_set);
+}
+
+static void
+info_set_fit (void)
+{
+        GUPnPDLNARestriction *r = gupnp_dlna_restriction_new ("mime");
+        GUPnPDLNAValueList *v = gupnp_dlna_value_list_new
+                                        (gupnp_dlna_value_type_bool());
+        GUPnPDLNAInfoSet *s;
+
+        /* restriction */
+        g_assert (gupnp_dlna_value_list_add_single (v, "true"));
+        g_assert (gupnp_dlna_restriction_add_value_list (r, "b1", v));
+        v = gupnp_dlna_value_list_new
+                                      (gupnp_dlna_value_type_fraction());
+        g_assert (gupnp_dlna_value_list_add_single (v, "1/2"));
+        g_assert (gupnp_dlna_restriction_add_value_list (r, "f1", v));
+        v = gupnp_dlna_value_list_new
+                                      (gupnp_dlna_value_type_fraction());
+        g_assert (gupnp_dlna_value_list_add_range (v, "1/4", "2/3"));
+        g_assert (gupnp_dlna_restriction_add_value_list (r, "f2", v));
+        v = gupnp_dlna_value_list_new
+                                           (gupnp_dlna_value_type_int());
+        g_assert (gupnp_dlna_value_list_add_single (v, "13"));
+        g_assert (gupnp_dlna_restriction_add_value_list (r, "i1", v));
+        v = gupnp_dlna_value_list_new
+                                           (gupnp_dlna_value_type_int());
+        g_assert (gupnp_dlna_value_list_add_range (v, "42", "55"));
+        g_assert (gupnp_dlna_restriction_add_value_list (r, "i2", v));
+        v = gupnp_dlna_value_list_new
+                                        (gupnp_dlna_value_type_string());
+        g_assert (gupnp_dlna_value_list_add_single (v, "aaa"));
+        g_assert (gupnp_dlna_restriction_add_value_list (r, "s1", v));
+
+        /* info set with exactly fitting values and same mime*/
+        s = gupnp_dlna_info_set_new ("mime");
+        g_assert (gupnp_dlna_info_set_add_bool (s, "b1", TRUE));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f1", 1, 2));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f2", 1, 3));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i1", 13));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i2", 50));
+        g_assert (gupnp_dlna_info_set_add_string (s, "s1", "aaa"));
+
+        g_assert (gupnp_dlna_info_set_fits_restriction (s, r));
+
+        /* add some more values not considered by restriction */
+        g_assert (gupnp_dlna_info_set_add_bool (s, "b2", FALSE));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f3", 4, 5));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i3", 7));
+        g_assert (gupnp_dlna_info_set_add_string (s, "s2", "bbb"));
+
+        g_assert (gupnp_dlna_info_set_fits_restriction (s, r));
+
+        gupnp_dlna_info_set_free (s);
+
+        /* info set with exactly fitting values but different mime */
+        s = gupnp_dlna_info_set_new ("asdf");
+        g_assert (gupnp_dlna_info_set_add_bool (s, "b1", TRUE));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f1", 1, 2));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f2", 1, 3));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i1", 13));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i2", 50));
+        g_assert (gupnp_dlna_info_set_add_string (s, "s1", "aaa"));
+
+        g_assert (!gupnp_dlna_info_set_fits_restriction (s, r));
+
+        /* add some more values not considered by restriction */
+        g_assert (gupnp_dlna_info_set_add_bool (s, "b2", FALSE));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f3", 4, 5));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i3", 7));
+        g_assert (gupnp_dlna_info_set_add_string (s, "s2", "bbb"));
+
+        g_assert (!gupnp_dlna_info_set_fits_restriction (s, r));
+
+        gupnp_dlna_info_set_free (s);
+
+        /* info set with same mime, exact fitting set but not fitting values */
+        s = gupnp_dlna_info_set_new ("mime");
+        g_assert (gupnp_dlna_info_set_add_bool (s, "b1", FALSE));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f1", 3, 2));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f2", 3, 3));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i1", 17));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i2", 57));
+        g_assert (gupnp_dlna_info_set_add_string (s, "s1", "aaaa"));
+
+        g_assert (!gupnp_dlna_info_set_fits_restriction (s, r));
+
+        /* add some more values not considered by restriction */
+        g_assert (gupnp_dlna_info_set_add_bool (s, "b2", FALSE));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f3", 4, 5));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i3", 7));
+        g_assert (gupnp_dlna_info_set_add_string (s, "s2", "bbb"));
+
+        g_assert (!gupnp_dlna_info_set_fits_restriction (s, r));
+
+        gupnp_dlna_info_set_free (s);
+
+        /* info set with same mime but with too few values */
+        s = gupnp_dlna_info_set_new ("mime");
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f2", 1, 3));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i1", 13));
+
+        g_assert (!gupnp_dlna_info_set_fits_restriction (s, r));
+
+        /* add some more values not considered by restriction */
+        g_assert (gupnp_dlna_info_set_add_bool (s, "b2", FALSE));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f3", 4, 5));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i3", 7));
+        g_assert (gupnp_dlna_info_set_add_string (s, "s2", "bbb"));
+
+        g_assert (!gupnp_dlna_info_set_fits_restriction (s, r));
+
+        /* add missing values */
+        g_assert (gupnp_dlna_info_set_add_bool (s, "b1", TRUE));
+        g_assert (gupnp_dlna_info_set_add_fraction (s, "f1", 1, 2));
+        g_assert (gupnp_dlna_info_set_add_int (s, "i2", 50));
+        g_assert (gupnp_dlna_info_set_add_string (s, "s1", "aaa"));
+
+        g_assert (gupnp_dlna_info_set_fits_restriction (s, r));
+
+        gupnp_dlna_info_set_free (s);
+        gupnp_dlna_restriction_free (r);
+}
+
+int
+main (int argc, char **argv)
+{
+        g_test_init (&argc, &argv, NULL);
+
+        g_test_add_func ("/value-type/not-null", value_type_not_null);
+        g_test_add_func ("/value-list/single", value_list_single);
+        g_test_add_func ("/value-list/range", value_list_range);
+        g_test_add_func ("/restriction/construction", restriction_construction);
+        g_test_add_func ("/restriction/empty", restriction_empty);
+        g_test_add_func ("/restriction/adding-value-lists",
+                         restriction_adding_value_lists);
+        g_test_add_func ("/restriction/merge", restriction_merge);
+        g_test_add_func ("/info-set/adding-values", info_set_adding_values);
+        g_test_add_func ("/info-set/fit", info_set_fit);
+
+        g_test_run ();
+
+        return 0;
+}
index 0310942..a8d616c 100644 (file)
@@ -26,7 +26,7 @@
 #   git clone git://git.gnome.org/gupnp-dlna-media tests/media
 
 if [[ "x${GUPNP_DLNA_INFO}" = "x" ]]; then
-  GUPNP_DLNA_INFO=@abs_top_builddir@/tools/gupnp-dlna-info
+  GUPNP_DLNA_INFO=@abs_top_builddir@/tools/gupnp-dlna-info-2.0
 fi
 
 # See if params are available in the environment - if yes, carry on, else read
index 122be05..959bee1 100644 (file)
@@ -1,6 +1,22 @@
-bin_PROGRAMS = gupnp-dlna-info gupnp-dlna-ls-profiles
+bin_PROGRAMS = \
+       gupnp-dlna-info-2.0 \
+       gupnp-dlna-ls-profiles-2.0
 
-AM_CFLAGS = -I$(top_srcdir) $(GST_CFLAGS) $(GST_PBU_CFLAGS)
-LIBS = $(GST_LIBS) \
-       $(GST_PBU_LIBS) \
-       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-1.0.la
+AM_CFLAGS = \
+       -I$(top_srcdir) \
+       $(GLIB_CFLAGS) \
+       $(GOBJECT_CFLAGS) \
+       $(LIBXML_CFLAGS) \
+       $(GMODULE_CFLAGS)
+LIBS = \
+       $(GLIB_LIBS) \
+       $(GOBJECT_LIBS) \
+       $(LIBXML_LIBS) \
+       $(GMODULE_LIBS) \
+       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
+
+gupnp_dlna_info_2_0_SOURCES = \
+       gupnp-dlna-info.c
+
+gupnp_dlna_ls_profiles_2_0_SOURCES = \
+       gupnp-dlna-ls-profiles.c
index 2c431c1..5d22ee7 100644 (file)
@@ -51,8 +51,8 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-bin_PROGRAMS = gupnp-dlna-info$(EXEEXT) \
-       gupnp-dlna-ls-profiles$(EXEEXT)
+bin_PROGRAMS = gupnp-dlna-info-2.0$(EXEEXT) \
+       gupnp-dlna-ls-profiles-2.0$(EXEEXT)
 subdir = tools
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -60,7 +60,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -69,15 +69,17 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
-gupnp_dlna_info_SOURCES = gupnp-dlna-info.c
-gupnp_dlna_info_OBJECTS = gupnp-dlna-info.$(OBJEXT)
-gupnp_dlna_info_LDADD = $(LDADD)
+am_gupnp_dlna_info_2_0_OBJECTS = gupnp-dlna-info.$(OBJEXT)
+gupnp_dlna_info_2_0_OBJECTS = $(am_gupnp_dlna_info_2_0_OBJECTS)
+gupnp_dlna_info_2_0_LDADD = $(LDADD)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
-gupnp_dlna_ls_profiles_SOURCES = gupnp-dlna-ls-profiles.c
-gupnp_dlna_ls_profiles_OBJECTS = gupnp-dlna-ls-profiles.$(OBJEXT)
-gupnp_dlna_ls_profiles_LDADD = $(LDADD)
+am_gupnp_dlna_ls_profiles_2_0_OBJECTS =  \
+       gupnp-dlna-ls-profiles.$(OBJEXT)
+gupnp_dlna_ls_profiles_2_0_OBJECTS =  \
+       $(am_gupnp_dlna_ls_profiles_2_0_OBJECTS)
+gupnp_dlna_ls_profiles_2_0_LDADD = $(LDADD)
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
@@ -104,8 +106,10 @@ am__v_CCLD_0 = @echo "  CCLD  " $@;
 AM_V_GEN = $(am__v_GEN_@AM_V@)
 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = gupnp-dlna-info.c gupnp-dlna-ls-profiles.c
-DIST_SOURCES = gupnp-dlna-info.c gupnp-dlna-ls-profiles.c
+SOURCES = $(gupnp_dlna_info_2_0_SOURCES) \
+       $(gupnp_dlna_ls_profiles_2_0_SOURCES)
+DIST_SOURCES = $(gupnp_dlna_info_2_0_SOURCES) \
+       $(gupnp_dlna_ls_profiles_2_0_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -140,18 +144,30 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
-GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
 GST_LIBS = @GST_LIBS@
 GST_MAJORMINOR = @GST_MAJORMINOR@
 GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
 GST_PBU_LIBS = @GST_PBU_LIBS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
 GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
 GTKDOC_MKPDF = @GTKDOC_MKPDF@
 GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
 GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
 HTML_DIR = @HTML_DIR@
 INSTALL = @INSTALL@
@@ -170,9 +186,12 @@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBOBJS = @LIBOBJS@
-LIBS = $(GST_LIBS) \
-       $(GST_PBU_LIBS) \
-       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-1.0.la
+LIBS = \
+       $(GLIB_LIBS) \
+       $(GOBJECT_LIBS) \
+       $(LIBXML_LIBS) \
+       $(GMODULE_LIBS) \
+       $(top_builddir)/libgupnp-dlna/libgupnp-dlna-2.0.la
 
 LIBTOOL = @LIBTOOL@
 LIBXML_CFLAGS = @LIBXML_CFLAGS@
@@ -180,8 +199,10 @@ LIBXML_LIBS = @LIBXML_LIBS@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -205,6 +226,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -258,12 +280,24 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AM_CFLAGS = -I$(top_srcdir) $(GST_CFLAGS) $(GST_PBU_CFLAGS)
+AM_CFLAGS = \
+       -I$(top_srcdir) \
+       $(GLIB_CFLAGS) \
+       $(GOBJECT_CFLAGS) \
+       $(LIBXML_CFLAGS) \
+       $(GMODULE_CFLAGS)
+
+gupnp_dlna_info_2_0_SOURCES = \
+       gupnp-dlna-info.c
+
+gupnp_dlna_ls_profiles_2_0_SOURCES = \
+       gupnp-dlna-ls-profiles.c
+
 all: all-am
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
            *$$dep*) \
@@ -288,9 +322,9 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
-$(top_srcdir)/configure:  $(am__configure_deps)
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 install-binPROGRAMS: $(bin_PROGRAMS)
@@ -339,12 +373,12 @@ clean-binPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
-gupnp-dlna-info$(EXEEXT): $(gupnp_dlna_info_OBJECTS) $(gupnp_dlna_info_DEPENDENCIES) $(EXTRA_gupnp_dlna_info_DEPENDENCIES) 
-       @rm -f gupnp-dlna-info$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(gupnp_dlna_info_OBJECTS) $(gupnp_dlna_info_LDADD) $(LIBS)
-gupnp-dlna-ls-profiles$(EXEEXT): $(gupnp_dlna_ls_profiles_OBJECTS) $(gupnp_dlna_ls_profiles_DEPENDENCIES) $(EXTRA_gupnp_dlna_ls_profiles_DEPENDENCIES) 
-       @rm -f gupnp-dlna-ls-profiles$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(gupnp_dlna_ls_profiles_OBJECTS) $(gupnp_dlna_ls_profiles_LDADD) $(LIBS)
+gupnp-dlna-info-2.0$(EXEEXT): $(gupnp_dlna_info_2_0_OBJECTS) $(gupnp_dlna_info_2_0_DEPENDENCIES) $(EXTRA_gupnp_dlna_info_2_0_DEPENDENCIES) 
+       @rm -f gupnp-dlna-info-2.0$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(gupnp_dlna_info_2_0_OBJECTS) $(gupnp_dlna_info_2_0_LDADD) $(LIBS)
+gupnp-dlna-ls-profiles-2.0$(EXEEXT): $(gupnp_dlna_ls_profiles_2_0_OBJECTS) $(gupnp_dlna_ls_profiles_2_0_DEPENDENCIES) $(EXTRA_gupnp_dlna_ls_profiles_2_0_DEPENDENCIES) 
+       @rm -f gupnp-dlna-ls-profiles-2.0$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(gupnp_dlna_ls_profiles_2_0_OBJECTS) $(gupnp_dlna_ls_profiles_2_0_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
index 961cc76..7fc0fb4 100644 (file)
@@ -3,8 +3,10 @@
  *
  * Copyright (C) 2010 Nokia Corporation
  * Copyright (C) 2010 Collabora Multimedia
+ * Copyright (C) 2012, 2013 Intel Corporation
  *
  * Authors: Parthasarathi Susarla <partha.susarla@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * Based on 'gst-discoverer.c' by
  * Edward Hervey <edward.hervey@collabora.co.uk>
@@ -21,8 +23,8 @@
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
 
 #include <glib.h>
 #include <glib-object.h>
-#include <gio/gio.h>
 
-#include <gst/gst.h>
-#include <gst/pbutils/pbutils.h>
-
-#include <libgupnp-dlna/profile-loading.h>
 #include <libgupnp-dlna/gupnp-dlna-profile.h>
-#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
-#include <libgupnp-dlna/gupnp-dlna-information.h>
+#include <libgupnp-dlna/gupnp-dlna-profile-guesser.h>
 
 
 static gboolean async = FALSE;
-static gboolean verbose = FALSE;
 static gint timeout = 10;
-
+static guint files_to_guess = 0;
 
 typedef struct
 {
-        GUPnPDLNADiscoverer *dc;
+        GUPnPDLNAProfileGuesser *guesser;
         int argc;
         char **argv;
 } PrivStruct;
 
-/*
- * The following functions are from gst-discoverer.c (gst-convenience/tools)
- */
-#define my_g_string_append_printf(str, format, ...)                    \
-        g_string_append_printf (str, "%*s" format, 2*depth, " ", ##__VA_ARGS__)
-
-static gchar *
-gst_stream_audio_information_to_string (GstDiscovererStreamInfo * info,
-                                       gint depth)
-{
-        GString *s;
-        gchar *tmp;
-        GstCaps *caps;
-        const GstStructure *misc;
-        const GstTagList *taglist;
-        const GstDiscovererAudioInfo *audio_info;
-        int len = 400;
-
-        g_return_val_if_fail (info != NULL, NULL);
-
-        audio_info = GST_DISCOVERER_AUDIO_INFO (info);
-        s = g_string_sized_new (len);
-
-        my_g_string_append_printf (s, "Codec:\n");
-        caps = gst_discoverer_stream_info_get_caps (info);
-        tmp = gst_caps_to_string (caps);
-        my_g_string_append_printf (s, "  %s\n", tmp);
-        gst_caps_unref (caps);
-        g_free (tmp);
-
-        my_g_string_append_printf (s, "Additional info:\n");
-        misc = gst_discoverer_stream_info_get_misc (info);
-        if (misc) {
-                tmp = gst_structure_to_string (misc);
-                my_g_string_append_printf (s, "  %s\n", tmp);
-                g_free (tmp);
-        } else {
-                my_g_string_append_printf (s, "  None\n");
-        }
-
-        my_g_string_append_printf (s, "Channels: %u\n",
-                                   gst_discoverer_audio_info_get_channels (audio_info));
-        my_g_string_append_printf (s, "Sample rate: %u\n",
-                                   gst_discoverer_audio_info_get_sample_rate (audio_info));
-        my_g_string_append_printf (s, "Depth: %u\n",
-                                   gst_discoverer_audio_info_get_depth (audio_info));
-
-        my_g_string_append_printf (s, "Bitrate: %u\n",
-                                   gst_discoverer_audio_info_get_bitrate (audio_info));
-        my_g_string_append_printf (s, "Max bitrate: %u\n",
-                                   gst_discoverer_audio_info_get_max_bitrate (audio_info));
-
-        my_g_string_append_printf (s, "Tags:\n");
-        taglist = gst_discoverer_stream_info_get_tags (info);
-        if (taglist) {
-                tmp = gst_structure_to_string ((GstStructure *) taglist);
-                my_g_string_append_printf (s, "  %s\n", tmp);
-                g_free (tmp);
-        } else {
-                my_g_string_append_printf (s, "  None\n");
-        }
-
-        return g_string_free (s, FALSE);
-}
-
-static gchar *
-gst_stream_video_information_to_string (GstDiscovererStreamInfo * info,
-                                       gint depth)
+static void
+print_dlna_profile (GUPnPDLNAProfile *profile,
+                    const gchar      *uri,
+                    GError           *err)
 {
-        GString *s;
-        gchar *tmp;
-        const GstStructure *misc;
-        const GstTagList *taglist;
-        const GstDiscovererVideoInfo *video_info;
-        GstCaps *caps;
-        int len = 500;
-
-        g_return_val_if_fail (info != NULL, NULL);
-
-        video_info = GST_DISCOVERER_VIDEO_INFO (info);
-
-        s = g_string_sized_new (len);
-
-        my_g_string_append_printf (s, "Codec:\n");
-        caps = gst_discoverer_stream_info_get_caps (info);
-        tmp = gst_caps_to_string (caps);
-        my_g_string_append_printf (s, "  %s\n", tmp);
-        gst_caps_unref (caps);
-        g_free (tmp);
-
-        my_g_string_append_printf (s, "Additional info:\n");
-        misc = gst_discoverer_stream_info_get_misc (info);
-        if (misc) {
-                tmp = gst_structure_to_string (misc);
-                my_g_string_append_printf (s, "  %s\n", tmp);
-                g_free (tmp);
+        g_print ("\nURI: %s\n", uri);
+        if (err) {
+                g_print ("Failed to guess: %s\n", err->message);
+        } else if (profile == NULL) {
+                g_print ("No error reported, but no matching profile found.\n");
         } else {
-                my_g_string_append_printf (s, "  None\n");
+                g_print ("Profile Name: %s\n", gupnp_dlna_profile_get_name (profile));
+                g_print ("Profile MIME: %s\n", gupnp_dlna_profile_get_mime (profile));
         }
-
-        my_g_string_append_printf (s, "Width: %u\n",
-                                   gst_discoverer_video_info_get_width (video_info));
-        my_g_string_append_printf (s, "Height: %u\n",
-                                   gst_discoverer_video_info_get_height (video_info));
-        my_g_string_append_printf (s, "Depth: %u\n",
-                                   gst_discoverer_video_info_get_depth (video_info));
-
-        my_g_string_append_printf (s, "Frame rate: %u/%u\n",
-                                   gst_discoverer_video_info_get_framerate_num (video_info),
-                                   gst_discoverer_video_info_get_framerate_denom (video_info));
-
-        my_g_string_append_printf (s, "Pixel aspect ratio: %u/%u\n",
-                                   gst_discoverer_video_info_get_par_num (video_info),
-                                   gst_discoverer_video_info_get_par_denom (video_info));
-
-        my_g_string_append_printf (s, "Interlaced: %s\n",
-                                   gst_discoverer_video_info_is_interlaced (video_info) ? "true" : "false");
-
-        my_g_string_append_printf (s, "Bitrate: %u\n",
-                                   gst_discoverer_video_info_get_bitrate (video_info));
-
-        my_g_string_append_printf (s, "Max bitrate: %u\n",
-                                   gst_discoverer_video_info_get_max_bitrate (video_info));
-
-        my_g_string_append_printf (s, "Tags:\n");
-        taglist = gst_discoverer_stream_info_get_tags (info);
-        if (taglist) {
-                tmp = gst_structure_to_string ((GstStructure *) taglist);
-                my_g_string_append_printf (s, "  %s\n", tmp);
-                g_free (tmp);
-        } else {
-                my_g_string_append_printf (s, "  None\n");
-        }
-
-
-        return g_string_free (s, FALSE);
+        return;
 }
 
 static void
-print_stream_info (GstDiscovererStreamInfo * info, void *depth)
+guesser_done (GUPnPDLNAProfileGuesser *guesser G_GNUC_UNUSED,
+              GUPnPDLNAInformation    *info,
+              GUPnPDLNAProfile        *profile,
+              GError                  *err,
+              GMainLoop               *ml)
 {
-        gchar *desc = NULL;
-        GstCaps *caps;
-
-        caps = gst_discoverer_stream_info_get_caps (info);
-        if (caps) {
-                desc = gst_caps_to_string (caps);
-        }
-
-        g_print ("%*s%s: %s\n", 2 * GPOINTER_TO_INT (depth), " ",
-                 gst_discoverer_stream_info_get_stream_type_nick (info),
-                 desc);
-
-        if (desc) {
-                g_free (desc);
-                desc = NULL;
-        }
+        const gchar *uri = gupnp_dlna_information_get_uri (info);
 
-        if (GST_IS_DISCOVERER_AUDIO_INFO (info))
-                desc = gst_stream_audio_information_to_string (
-                                        info,
-                                        GPOINTER_TO_INT (depth) + 1);
-        else if (GST_IS_DISCOVERER_VIDEO_INFO (info))
-                desc = gst_stream_video_information_to_string (
-                                         info,
-                                         GPOINTER_TO_INT (depth) + 1);
-
-        if (desc) {
-                g_print ("%s", desc);
-                g_free (desc);
-        }
+        print_dlna_profile (profile, uri, err);
+        --files_to_guess;
+        if (!files_to_guess)
+                g_main_loop_quit (ml);
+        return;
 }
 
-static void
-print_topology (GstDiscovererStreamInfo * info, gint depth)
+static gboolean
+is_uri (const gchar *filename)
 {
-        GstDiscovererStreamInfo *next;
-        if (!info)
-                return;
-
-        print_stream_info (info, GINT_TO_POINTER (depth));
-
-        next = gst_discoverer_stream_info_get_next (info);
-        if (next) {
-                print_topology (next, depth + 1);
-                gst_discoverer_stream_info_unref (next);
-        } else if (GST_IS_DISCOVERER_CONTAINER_INFO (info)) {
-                GList *tmp, *streams;
-                GstDiscovererContainerInfo *container =
-                        GST_DISCOVERER_CONTAINER_INFO (info);
-
-                streams = gst_discoverer_container_info_get_streams (container);
-                for (tmp = streams; tmp; tmp = tmp->next) {
-                        GstDiscovererStreamInfo *tmpinf =
-                                GST_DISCOVERER_STREAM_INFO (tmp->data);
-                        print_topology (tmpinf, depth + 1);
-                }
-        }
-}
+        gchar *uri = g_uri_parse_scheme (filename);
+        gboolean result = (uri != NULL);
 
-static void
-print_duration (GstDiscovererInfo * info, gint tab)
-{
-        g_print ("%*s%" GST_TIME_FORMAT "\n", tab + 1, " ",
-                 GST_TIME_ARGS (gst_discoverer_info_get_duration (info)));
+        g_free (uri);
+
+        return result;
 }
 
 static void
-print_gst_info (GstDiscovererInfo *info, GError *err)
-{
-        GstDiscovererResult result = gst_discoverer_info_get_result (info);
-        GstDiscovererStreamInfo *sinfo;
-
-        switch (result) {
-        case GST_DISCOVERER_OK:
-                break;
-        case GST_DISCOVERER_URI_INVALID:
-                g_print ("URI is not valid\n");
-                break;
-        case GST_DISCOVERER_ERROR:
-                g_print ("An error was encountered while discovering the file\n");
-                g_print (" %s\n", err->message);
-                break;
-        case GST_DISCOVERER_TIMEOUT:
-                g_print ("Analyzing URI timed out\n");
-                break;
-        case GST_DISCOVERER_BUSY:
-                g_print ("Discoverer was busy\n");
-                break;
-        case GST_DISCOVERER_MISSING_PLUGINS:
-                g_print ("Missing plugins\n");
-                if (verbose) {
-                        gchar *tmp =
-                                gst_structure_to_string (gst_discoverer_info_get_misc (info));
-                        g_print (" (%s)\n", tmp);
-                        g_free (tmp);
-                }
-                break;
-        }
-
-        if (verbose) {
-                if ((sinfo = gst_discoverer_info_get_stream_info (info))) {
-                        g_print ("\nTopology:\n");
-                        print_topology (sinfo, 1);
-                        g_print ("\nDuration:\n");
-                        print_duration (info, 1);
-                        gst_discoverer_stream_info_unref (sinfo);
-                }
-        }
-
-        g_print ("\n");
-}
+process_file (GUPnPDLNAProfileGuesser *guesser,
+              const gchar             *filename);
 
 static void
-print_dlna_info (GUPnPDLNAInformation *dlna, GError *err)
+process_directory (GUPnPDLNAProfileGuesser *guesser,
+                   const gchar             *directory)
 {
-        GstDiscovererInfo *info;
+        GError *err = NULL;
+        GDir *dir = g_dir_open (directory, 0, &err);
 
-        info = (GstDiscovererInfo *)gupnp_dlna_information_get_info (dlna);
+        if (dir) {
+                const gchar *entry;
 
-        g_print ("\nURI: %s\n", gst_discoverer_info_get_uri (info));
-        g_print ("Profile Name: %s\n", gupnp_dlna_information_get_name (dlna));
-        g_print ("Profile MIME: %s\n", gupnp_dlna_information_get_mime (dlna));
+                while ((entry = g_dir_read_name (dir))) {
+                        gchar *entry_path;
 
-        print_gst_info ((GstDiscovererInfo *)info, err);
+                        entry_path = g_build_filename (directory,
+                                                       entry,
+                                                       NULL);
+                        process_file (guesser, entry_path);
+                        g_free (entry_path);
+                }
 
-        g_print ("\n");
-        return;
+                g_dir_close (dir);
+        } else {
+                g_warning ("Couldn't open directory: %s.\n",
+                           err->message);
+                g_error_free (err);
+                err = NULL;
+        }
 }
 
 static void
-discoverer_done (GUPnPDLNADiscoverer *discover,
-                 GUPnPDLNAInformation *dlna,
-                 GError *err)
+process_file (GUPnPDLNAProfileGuesser *guesser,
+              const gchar             *filename)
 {
-        print_dlna_info (dlna, err);
-        return;
-}
+        gchar *uri;
 
-static void
-discoverer_ready (GUPnPDLNADiscoverer *dc, GMainLoop *ml)
-{
-        g_main_loop_quit (ml);
-}
+        if(!is_uri (filename)) {
+                gchar *abs_path;
+                GError *err = NULL;
 
-static void
-process_file (GUPnPDLNADiscoverer *discover, const gchar *filename)
-{
-        GError *err = NULL;
-        GDir *dir;
-        gchar *uri, *path;
-        GUPnPDLNAInformation *dlna;
-
-        if(!gst_uri_is_valid (filename)) {
-                if((dir = g_dir_open (filename, 0, NULL))) {
-                        const gchar *entry;
-
-                        while ((entry = g_dir_read_name (dir))) {
-                                gchar *path;
-                                path = g_strconcat (filename,
-                                                    G_DIR_SEPARATOR_S,
-                                                    entry,
-                                                    NULL);
-                                process_file (discover, path);
-                                g_free(path);
-                        }
-
-                        g_dir_close (dir);
+                if (g_file_test (filename, G_FILE_TEST_IS_DIR)) {
+                        process_directory (guesser, filename);
                         return;
                 }
 
                 if (!g_path_is_absolute (filename)) {
-                        gchar *cur_dir;
+                        gchar *cur_dir = g_get_current_dir ();
 
-                        cur_dir = g_get_current_dir ();
-                        path = g_build_filename (cur_dir, filename, NULL);
+                        abs_path = g_build_filename (cur_dir, filename, NULL);
                         g_free (cur_dir);
                 } else {
-                        path = g_strdup (filename);
+                        abs_path = g_strdup (filename);
                 }
 
-                uri = g_filename_to_uri (path, NULL, &err);
-                g_free (path);
-                path = NULL;
+                uri = g_filename_to_uri (abs_path, NULL, &err);
+                g_free (abs_path);
 
                 if (err) {
-                        g_warning ("Couldn't convert filename to URI: %s\n",
+                        g_warning ("Couldn't convert filename (%s) to URI: %s\n",
+                                   filename,
                                    err->message);
                         g_error_free (err);
                         err = NULL;
@@ -394,44 +169,58 @@ process_file (GUPnPDLNADiscoverer *discover, const gchar *filename)
                 uri = g_strdup (filename);
         }
 
-        if (async == FALSE) {
-                dlna = gupnp_dlna_discoverer_discover_uri_sync (discover,
-                                                                uri,
-                                                                &err);
+        if (async) {
+                GError *err = NULL;
+
+                if (!gupnp_dlna_profile_guesser_guess_profile_async (guesser, uri, timeout, &err)) {
+                        const gchar *message;
+
+                        if (err) {
+                                message = err->message;
+                        } else {
+                                message = "Unknown error, probably programming mistake";
+                        }
+                        g_warning ("Unable to queue file for guessing: %s\n",
+                                   message);
+                        if (err) {
+                                g_error_free (err);
+                        }
+                } else {
+                        ++files_to_guess;
+                }
+        } else {
+                GError *err = NULL;
+                GUPnPDLNAProfile *profile = gupnp_dlna_profile_guesser_guess_profile_sync (guesser, uri, timeout, NULL, &err);
+
                 if (err) {
-                        /* Report error to user, and free error */
-                        fprintf (stderr,
-                                 "Unable to read file: %s\n",
-                                 err->message);
+                        g_warning ("Unable to read file: %s\n",
+                                   err->message);
                         g_error_free (err);
                         err = NULL;
                 } else {
-                        print_dlna_info (dlna, err);
+                        print_dlna_profile (profile, uri, err);
                 }
-        } else {
-                gupnp_dlna_discoverer_discover_uri (discover, uri);
         }
-
         g_free (uri);
 }
 
 static gboolean
-async_idle_loop (PrivStruct * ps)
+async_idle_loop (PrivStruct *ps)
 {
-        gint i;
+        gint iter;
 
-        for (i = 1; i < ps->argc; i++)
-                process_file (ps->dc, ps->argv[i]);
+        for (iter = 1; iter < ps->argc; iter++)
+                process_file (ps->guesser, ps->argv[iter]);
 
         return FALSE;
 }
 
 /* Main */
 int
-main (int argc, char **argv)
+main (int argc,
+      char **argv)
 {
-        gint i;
-        GUPnPDLNADiscoverer *discover;
+        GUPnPDLNAProfileGuesser *guesser;
         gboolean relaxed_mode = FALSE;
         gboolean extended_mode = FALSE;
         GError *err = NULL;
@@ -441,8 +230,6 @@ main (int argc, char **argv)
                  "Specify timeout (in seconds, defaults to 10)", "T"},
                 {"async", 'a', 0, G_OPTION_ARG_NONE, &async,
                  "Run asynchronously", NULL},
-                {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
-                 "Print lot more information", NULL},
                 {"relaxed mode", 'r', 0, G_OPTION_ARG_NONE, &relaxed_mode,
                  "Enable Relaxed mode", NULL},
                 {"extended mode", 'e', 0, G_OPTION_ARG_NONE, &extended_mode,
@@ -452,16 +239,17 @@ main (int argc, char **argv)
 
         GOptionContext *ctx;
 
-        if (!g_thread_supported ())
-                g_thread_init(NULL);
+#if !GLIB_CHECK_VERSION(2,35,0)
+        g_type_init ();
+#endif
 
         ctx = g_option_context_new (" - program to extract DLNA and related metadata");
         g_option_context_add_main_entries (ctx, options, NULL);
-        g_option_context_add_group (ctx, gst_init_get_option_group ());
 
         if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
 
                 g_print ("Error initializing: %s\n", err->message);
+                g_error_free (err);
                 exit (1);
         }
 
@@ -472,38 +260,36 @@ main (int argc, char **argv)
                 return -1;
         }
 
-        gst_init(&argc, &argv);
+        /* Option was passed in seconds, but guesser takes
+           miliseconds. */
+        timeout *= 1000;
 
-        discover = gupnp_dlna_discoverer_new ((GstClockTime)
-                                              (timeout * GST_SECOND),
-                                              relaxed_mode,
-                                              extended_mode);
+        guesser = gupnp_dlna_profile_guesser_new (relaxed_mode,
+                                                  extended_mode);
 
         if (async == FALSE) {
-                for ( i = 1 ; i < argc ; i++ )
-                        process_file (discover, argv[i]);
+                gint iter;
+
+                for (iter = 1; iter < argc; ++iter)
+                        process_file (guesser, argv[iter]);
         } else {
-                PrivStruct *ps = g_new0 (PrivStruct, 1);
+                PrivStruct *ps = g_slice_new0 (PrivStruct);
                 GMainLoop *ml = g_main_loop_new (NULL, FALSE);
 
-                ps->dc = discover;
+                ps->guesser = guesser;
                 ps->argc = argc;
                 ps->argv = argv;
 
                 g_idle_add ((GSourceFunc) async_idle_loop, ps);
 
-                g_signal_connect (discover, "done",
-                                  (GCallback) discoverer_done, 0);
-                g_signal_connect (discover, "finished",
-                                  (GCallback) discoverer_ready, ml);
-
-                gupnp_dlna_discoverer_start (discover);
+                g_signal_connect (guesser, "done",
+                                  G_CALLBACK (guesser_done), ml);
 
                 g_main_loop_run (ml);
-
-                gupnp_dlna_discoverer_stop (discover);
-
+                g_main_loop_unref (ml);
+                g_slice_free (PrivStruct, ps);
         }
-        g_object_unref (discover);
+        g_object_unref (guesser);
+        gupnp_dlna_profile_guesser_cleanup ();
         return 0;
 }
index 567ef8d..09f3a76 100644 (file)
@@ -3,8 +3,10 @@
  *
  * Copyright (C) 2010 Nokia Corporation
  * Copyright (C) 2010 Collabora Multimedia
+ * Copyright (C) 2012 Intel Corporation
  *
  * Authors: Parthasarathi Susarla <partha.susarla@collabora.co.uk>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include <stdlib.h>
-#include <string.h>
 
 #include <glib.h>
 #include <glib-object.h>
-#include <gio/gio.h>
 
 #include <libgupnp-dlna/gupnp-dlna-profile.h>
-#include <libgupnp-dlna/gupnp-dlna-discoverer.h>
+#include <libgupnp-dlna/gupnp-dlna-profile-guesser.h>
 
-#include <gst/pbutils/pbutils.h>
-
-static gboolean verbose = FALSE, relaxed = FALSE;
-
-static void print_caps (const GstCaps *caps)
-{
-        int i;
-
-        for (i = 0; i < gst_caps_get_size (caps); i++) {
-                GstStructure *structure = gst_caps_get_structure (caps, i);
-                gchar *tmp = gst_structure_to_string (structure);
-
-                g_print ("%s`- %s\n", i ? "    " : "", tmp);
-
-                g_free (tmp);
-        }
-}
+static gboolean relaxed = FALSE;
 
 static void
-print_profile (GUPnPDLNAProfile *profile, gpointer unused)
+print_profile (GUPnPDLNAProfile *profile)
 {
-        GstEncodingProfile *enc_profile;
-        const GList *tmp;
-        gchar *caps_str;
-
-        enc_profile = gupnp_dlna_profile_get_encoding_profile (profile);
-        tmp = gst_encoding_container_profile_get_profiles
-                                        (GST_ENCODING_CONTAINER_PROFILE (enc_profile));
-
-        g_print ("%s %-30s%-35s",
+        g_print ("%s %-30s%-35s\n",
                  gupnp_dlna_profile_get_extended (profile) ? "*" : " ",
                  gupnp_dlna_profile_get_name (profile),
                  gupnp_dlna_profile_get_mime (profile));
-
-        if (verbose) {
-                caps_str = gst_caps_to_string
-                        (gst_encoding_profile_get_format (enc_profile));
-                g_print ("\n`- container: %s\n", caps_str);
-                g_free (caps_str);
-
-                while (tmp) {
-                        print_caps (gst_encoding_profile_get_format
-                                        (GST_ENCODING_PROFILE (tmp->data)));
-                        tmp = tmp->next;
-                }
-        }
-
-        g_print ("\n");
-        gst_encoding_profile_unref (enc_profile);
 }
 
 int
 main (int argc, char **argv)
 {
         GError *err = NULL;
-        GList *profiles = NULL;
-        GUPnPDLNADiscoverer *discover;
+        const GList *profiles = NULL;
+        GUPnPDLNAProfileGuesser *guesser;
 
         GOptionEntry options[] = {
-                {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
-                 "Print (very) verbose output", NULL},
                 {"relaxed", 'r', 0, G_OPTION_ARG_NONE, &relaxed,
-                 "Read profiles in relaxed mode (only useful with -v)", NULL},
+                 "Read profiles in relaxed mode", NULL},
                 {NULL}
         };
 
         GOptionContext *ctx;
 
-        if (!g_thread_supported ())
-                g_thread_init(NULL);
+#if !GLIB_CHECK_VERSION(2,35,0)
+        g_type_init ();
+#endif
 
         ctx = g_option_context_new (" - program to list all the DLNA profiles supported by gupnp-dlna");
         g_option_context_add_main_entries (ctx, options, NULL);
-        g_option_context_add_group (ctx, gst_init_get_option_group ());
-
         if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
 
                 g_print ("Error initializing: %s\n", err->message);
+                g_error_free (err);
                 exit (1);
         }
 
         g_option_context_free (ctx);
 
-        gst_init (&argc, &argv);
-
-        discover = gupnp_dlna_discoverer_new ((GstClockTime) GST_SECOND,
-                                              relaxed,
-                                              TRUE);
+        guesser = gupnp_dlna_profile_guesser_new (relaxed, TRUE);
+        profiles = gupnp_dlna_profile_guesser_list_profiles (guesser);
 
-        profiles = (GList *) gupnp_dlna_discoverer_list_profiles (discover);
-
-        if (!verbose) {
-                g_print ("  %-30s%s\n", "Name", "MIME type");
-                g_print ("---------------------------------------------------"
+        g_print ("  %-30s%s\n", "Name", "MIME type");
+        g_print ("---------------------------------------------------"
                          "---------------------\n");
-        }
-        g_list_foreach (profiles, (GFunc) print_profile, NULL);
+g_list_foreach ((GList *) profiles, (GFunc) print_profile, NULL);
         g_print ("\nProfiles with a '*' against their name are extended "
                  "(non-standard) profiles.\n\n");
 
-        g_object_unref (discover);
+        g_object_unref (guesser);
+        gupnp_dlna_profile_guesser_cleanup ();
 
         return 0;
 }
diff --git a/vala/GUPnPDLNA-2.0.metadata b/vala/GUPnPDLNA-2.0.metadata
new file mode 100644 (file)
index 0000000..c52832e
--- /dev/null
@@ -0,0 +1 @@
+GUPnPDLNA cheader_filename="libgupnp-dlna/gupnp-dlna.h"
diff --git a/vala/Makefile.am b/vala/Makefile.am
new file mode 100644 (file)
index 0000000..d3e148b
--- /dev/null
@@ -0,0 +1,67 @@
+if HAVE_INTROSPECTION
+if HAVE_VAPIGEN
+gupnp-dlna-2.0.vapi: gupnp-dlna-2.0.stamp
+       @true
+
+gupnp-dlna-2.0.stamp: $(builddir)/../libgupnp-dlna/GUPnPDLNA-2.0.gir \
+               $(srcdir)/GUPnPDLNA-2.0.metadata \
+               $(srcdir)/gupnp-dlna-2.0-custom.vala
+       $(AM_V_GEN)$(VAPIGEN) --metadatadir=$(srcdir) \
+                             --library=gupnp-dlna-2.0 \
+                             $(builddir)/../libgupnp-dlna/GUPnPDLNA-2.0.gir \
+                             $(srcdir)/gupnp-dlna-2.0-custom.vala && \
+       echo timestamp > $(@F)
+
+vapidir = $(datadir)/vala/vapi
+vapi_DATA = \
+       gupnp-dlna-2.0.vapi \
+       $(srcdir)/gupnp-dlna-2.0.deps
+CLEANFILES = \
+       gupnp-dlna-2.0.vapi \
+       gupnp-dlna-2.0.stamp
+EXTRA_DIST = \
+       gupnp-dlna-2.0.deps \
+       GUPnPDLNA-2.0.metadata \
+       gupnp-dlna-2.0-custom.vala
+
+if GSTREAMER_METADATA_BACKEND_ENABLED
+gupnp-dlna-gst-2.0.vapi: gupnp-dlna-gst-2.0.stamp
+       @true
+
+gupnp-dlna-gst-2.0.stamp: $(builddir)/../libgupnp-dlna/GUPnPDLNAGst-2.0.gir \
+               $(srcdir)/GUPnPDLNAGst-2.0.metadata \
+               $(srcdir)/gupnp-dlna-gst-2.0-custom.vala \
+               gupnp-dlna-2.0.vapi
+       $(AM_V_GEN)$(VAPIGEN) --metadatadir=$(srcdir) \
+                             --library=gupnp-dlna-gst-2.0 \
+                             --vapidir=$(builddir) \
+                             --girdir=$(builddir)/../libgupnp-dlna \
+                             --pkg gupnp-dlna-2.0 \
+                             --pkg gstreamer-1.0 \
+                             --pkg gstreamer-pbutils-1.0 \
+                             --pkg gstreamer-video-1.0 \
+                             --pkg gstreamer-base-1.0 \
+                             $(builddir)/../libgupnp-dlna/GUPnPDLNAGst-2.0.gir \
+                             $(srcdir)/gupnp-dlna-gst-2.0-custom.vala && \
+       echo timestamp > $(@F)
+
+
+vapi_DATA += \
+       gupnp-dlna-gst-2.0.vapi \
+       $(srcdir)/gupnp-dlna-gst-2.0.deps
+CLEANFILES += \
+       gupnp-dlna-gst-2.0.vapi \
+       gupnp-dlna-gst-2.0.stamp
+EXTRA_DIST += \
+       gupnp-dlna-gst-2.0.deps \
+       GUPnPDLNAGst-2.0.metadata \
+       gupnp-dlna-gst-2.0-custom.vala
+endif
+
+if GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED
+vapi_DATA += \
+       gupnp-dlna-gst-legacy-2.0.vapi \
+       $(srcdir)/gupnp-dlna-gst-legacy-2.0.deps
+endif
+endif
+endif
diff --git a/vala/Makefile.in b/vala/Makefile.in
new file mode 100644 (file)
index 0000000..97d1fc6
--- /dev/null
@@ -0,0 +1,545 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@am__append_1 = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  gupnp-dlna-gst-2.0.vapi \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  $(srcdir)/gupnp-dlna-gst-2.0.deps
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@am__append_2 = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  gupnp-dlna-gst-2.0.vapi \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  gupnp-dlna-gst-2.0.stamp
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@am__append_3 = \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  gupnp-dlna-gst-2.0.deps \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  GUPnPDLNAGst-2.0.metadata \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  gupnp-dlna-gst-2.0-custom.vala
+
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@am__append_4 = \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   gupnp-dlna-gst-legacy-2.0.vapi \
+@GSTREAMER_LEGACY_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   $(srcdir)/gupnp-dlna-gst-legacy-2.0.deps
+
+subdir = vala
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(vapidir)"
+DATA = $(vapi_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GMODULE_CFLAGS = @GMODULE_CFLAGS@
+GMODULE_LIBS = @GMODULE_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GST_CFLAGS = @GST_CFLAGS@
+GST_LEGACY_CFLAGS = @GST_LEGACY_CFLAGS@
+GST_LEGACY_LIBS = @GST_LEGACY_LIBS@
+GST_LEGACY_MAJORMINOR = @GST_LEGACY_MAJORMINOR@
+GST_LIBS = @GST_LIBS@
+GST_MAJORMINOR = @GST_MAJORMINOR@
+GST_PBU_CFLAGS = @GST_PBU_CFLAGS@
+GST_PBU_LEGACY_CFLAGS = @GST_PBU_LEGACY_CFLAGS@
+GST_PBU_LEGACY_LIBS = @GST_PBU_LEGACY_LIBS@
+GST_PBU_LIBS = @GST_PBU_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GUPNP_DLNA_METADATA_BACKEND_CFLAGS = @GUPNP_DLNA_METADATA_BACKEND_CFLAGS@
+GUPNP_DLNA_VERSION_INFO = @GUPNP_DLNA_VERSION_INFO@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBXML_CFLAGS = @LIBXML_CFLAGS@
+LIBXML_LIBS = @LIBXML_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+METADATA_DIRECTORY = @METADATA_DIRECTORY@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@vapidir = $(datadir)/vala/vapi
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@vapi_DATA = gupnp-dlna-2.0.vapi \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   $(srcdir)/gupnp-dlna-2.0.deps \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   $(am__append_1) \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   $(am__append_4)
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@CLEANFILES = gupnp-dlna-2.0.vapi \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   gupnp-dlna-2.0.stamp \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   $(am__append_2)
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@EXTRA_DIST = gupnp-dlna-2.0.deps \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   GUPnPDLNA-2.0.metadata \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   gupnp-dlna-2.0-custom.vala \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   $(am__append_3)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu vala/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu vala/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-vapiDATA: $(vapi_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(vapidir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(vapidir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(vapidir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(vapidir)" || exit $$?; \
+       done
+
+uninstall-vapiDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(vapidir)'; $(am__uninstall_files_from_dir)
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+       for dir in "$(DESTDIR)$(vapidir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-vapiDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-vapiDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+       distclean distclean-generic distclean-libtool distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       install-vapiDATA installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       uninstall uninstall-am uninstall-vapiDATA
+
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@gupnp-dlna-2.0.vapi: gupnp-dlna-2.0.stamp
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   @true
+
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@gupnp-dlna-2.0.stamp: $(builddir)/../libgupnp-dlna/GUPnPDLNA-2.0.gir \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@           $(srcdir)/GUPnPDLNA-2.0.metadata \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@           $(srcdir)/gupnp-dlna-2.0-custom.vala
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   $(AM_V_GEN)$(VAPIGEN) --metadatadir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                         --library=gupnp-dlna-2.0 \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                         $(builddir)/../libgupnp-dlna/GUPnPDLNA-2.0.gir \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                         $(srcdir)/gupnp-dlna-2.0-custom.vala && \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   echo timestamp > $(@F)
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@gupnp-dlna-gst-2.0.vapi: gupnp-dlna-gst-2.0.stamp
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  @true
+
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@gupnp-dlna-gst-2.0.stamp: $(builddir)/../libgupnp-dlna/GUPnPDLNAGst-2.0.gir \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@          $(srcdir)/GUPnPDLNAGst-2.0.metadata \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@          $(srcdir)/gupnp-dlna-gst-2.0-custom.vala \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@          gupnp-dlna-2.0.vapi
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  $(AM_V_GEN)$(VAPIGEN) --metadatadir=$(srcdir) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        --library=gupnp-dlna-gst-2.0 \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        --vapidir=$(builddir) \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        --girdir=$(builddir)/../libgupnp-dlna \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        --pkg gupnp-dlna-2.0 \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        --pkg gstreamer-1.0 \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        --pkg gstreamer-pbutils-1.0 \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        --pkg gstreamer-video-1.0 \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        --pkg gstreamer-base-1.0 \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        $(builddir)/../libgupnp-dlna/GUPnPDLNAGst-2.0.gir \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                        $(srcdir)/gupnp-dlna-gst-2.0-custom.vala && \
+@GSTREAMER_METADATA_BACKEND_ENABLED_TRUE@@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@  echo timestamp > $(@F)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/vala/gupnp-dlna-2.0-custom.vala b/vala/gupnp-dlna-2.0-custom.vala
new file mode 100644 (file)
index 0000000..e527483
--- /dev/null
@@ -0,0 +1,2 @@
+namespace GUPnP.DLNA {
+}
diff --git a/vala/gupnp-dlna-2.0.deps b/vala/gupnp-dlna-2.0.deps
new file mode 100644 (file)
index 0000000..1899619
--- /dev/null
@@ -0,0 +1 @@
+libxml-2.0