[gupnp-dlna/wip/new-api: 1/15] Add metadata extractor base classes
- From: Krzesimir Nowak <krnowak src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gupnp-dlna/wip/new-api: 1/15] Add metadata extractor base classes
- Date: Tue, 27 Nov 2012 11:44:43 +0000 (UTC)
commit 9f94adc761076551bebe5b6283e70c82bc68c0a0
Author: Krzesimir Nowak <krnowak openismus com>
Date: Thu Nov 15 14:48:05 2012 +0100
Add metadata extractor base classes
Main purpose of those classes is to be subclassed by metadata
extractor plugins. These interfaces are going to be used by code doing
DLNA profiles guessing to get the metadata of given URI.
.../metadata/gupnp-dlna-audio-information.c | 390 +++++++++++++++++++
.../metadata/gupnp-dlna-audio-information.h | 179 +++++++++
.../metadata/gupnp-dlna-container-information.c | 240 ++++++++++++
.../metadata/gupnp-dlna-container-information.h | 134 +++++++
.../metadata/gupnp-dlna-image-information.c | 181 +++++++++
.../metadata/gupnp-dlna-image-information.h | 113 ++++++
libgupnp-dlna/metadata/gupnp-dlna-information.c | 408 ++++++++++++++++++++
libgupnp-dlna/metadata/gupnp-dlna-information.h | 117 ++++++
.../metadata/gupnp-dlna-metadata-extractor.c | 216 +++++++++++
.../metadata/gupnp-dlna-metadata-extractor.h | 124 ++++++
libgupnp-dlna/metadata/gupnp-dlna-values.h | 270 +++++++++++++
.../metadata/gupnp-dlna-video-information.c | 365 +++++++++++++++++
.../metadata/gupnp-dlna-video-information.h | 170 ++++++++
libgupnp-dlna/metadata/metadata.am | 18 +
14 files changed, 2925 insertions(+), 0 deletions(-)
---
diff --git a/libgupnp-dlna/metadata/gupnp-dlna-audio-information.c b/libgupnp-dlna/metadata/gupnp-dlna-audio-information.c
new file mode 100644
index 0000000..3fd7ca6
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-audio-information.c
@@ -0,0 +1,390 @@
+/*
+ * 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.
+ */
+
+/**
+ * SECTION:gupnp-dlna-audio-information
+ * @short_description: Base class representing audio metadata needed
+ * for DLNA profiles matching.
+ *
+ * #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.
+ *
+ * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
+ */
+
+#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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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/metadata/gupnp-dlna-audio-information.h b/libgupnp-dlna/metadata/gupnp-dlna-audio-information.h
new file mode 100644
index 0000000..487723a
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-audio-information.h
@@ -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 "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/metadata/gupnp-dlna-container-information.c b/libgupnp-dlna/metadata/gupnp-dlna-container-information.c
new file mode 100644
index 0000000..b96c2fb
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-container-information.c
@@ -0,0 +1,240 @@
+/*
+ * 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.
+ */
+
+/**
+ * SECTION:gupnp-dlna-container-information
+ * @short_description: Base class representing container metadata
+ * needed for DLNA profiles matching.
+ *
+ * #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.
+ *
+ * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
+ */
+
+#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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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/metadata/gupnp-dlna-container-information.h b/libgupnp-dlna/metadata/gupnp-dlna-container-information.h
new file mode 100644
index 0000000..d130fc2
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-container-information.h
@@ -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 "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/metadata/gupnp-dlna-image-information.c b/libgupnp-dlna/metadata/gupnp-dlna-image-information.c
new file mode 100644
index 0000000..9551cc3
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-image-information.c
@@ -0,0 +1,181 @@
+/*
+ * 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.
+ */
+
+/**
+ * SECTION:gupnp-dlna-image-information
+ * @short_description: Base class representing image metadata needed
+ * for DLNA profiles matching.
+ *
+ * #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.
+ *
+ * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
+ */
+
+#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:
+ * @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:
+ * @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:
+ * @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:
+ * @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/metadata/gupnp-dlna-image-information.h b/libgupnp-dlna/metadata/gupnp-dlna-image-information.h
new file mode 100644
index 0000000..79e47d9
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-image-information.h
@@ -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 "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/metadata/gupnp-dlna-information.c b/libgupnp-dlna/metadata/gupnp-dlna-information.c
new file mode 100644
index 0000000..7d1ea8d
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-information.c
@@ -0,0 +1,408 @@
+/*
+ * 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.
+ */
+
+/**
+ * SECTION:gupnp-dlna-information
+ * @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.
+ *
+ * When instantiating a subclass of #GUPnPDLNAInformation make sure
+ * that "uri" with a URI to media file is passed to g_object_new().
+ */
+
+#include "gupnp-dlna-information.h"
+
+G_DEFINE_ABSTRACT_TYPE (GUPnPDLNAInformation,
+ gupnp_dlna_information,
+ G_TYPE_OBJECT)
+
+struct _GUPnPDLNAInformationPrivate {
+ 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_URI,
+ PROP_AUDIO_INFO,
+ PROP_CONTAINER_INFO,
+ PROP_IMAGE_INFO,
+ PROP_VIDEO_INFO
+};
+
+static void
+gupnp_dlna_information_dispose (GObject *object)
+{
+ 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);
+}
+
+static void
+gupnp_dlna_information_finalize (GObject *object)
+{
+ GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+
+ g_free (info->priv->uri);
+ G_OBJECT_CLASS (gupnp_dlna_information_parent_class)->finalize (object);
+}
+
+static void
+gupnp_dlna_information_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+ GUPnPDLNAInformationPrivate *priv = info->priv;
+
+ switch (property_id) {
+ 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_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GUPnPDLNAInformation *info = GUPNP_DLNA_INFORMATION (object);
+ GUPnPDLNAInformationPrivate *priv = info->priv;
+
+ 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 *info_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (info_class);
+ GParamSpec *pspec;
+
+ object_class->dispose = gupnp_dlna_information_dispose;
+ object_class->finalize = gupnp_dlna_information_finalize;
+ 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_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_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 *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;
+
+ 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->audio_info = info_class->get_audio_information (info);
+ priv->got_audio_info = TRUE;
+ }
+
+ return priv->audio_info;
+}
+
+/**
+ * gupnp_dlna_information_get_container_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an container information of media file if applicable (e.g. for
+ * video and audio files).
+ *
+ * Returns: (transfer none): A #GUPnPDLNAContainerInformation object or %NULL.
+ */
+GUPnPDLNAContainerInformation *
+gupnp_dlna_information_get_container_information (GUPnPDLNAInformation *info)
+{
+ 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_image_information:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Get an container information of media file if applicable (e.g. for
+ * image files).
+ *
+ * Returns: (transfer none): A #GUPnPDLNAImageInformation object or %NULL.
+ */
+GUPnPDLNAImageInformation *
+gupnp_dlna_information_get_image_information (GUPnPDLNAInformation *info)
+{
+ 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->image_info;
+}
+
+/**
+ * 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: (transfer none): A #GUPnPDLNAVideoInformation object or %NULL.
+ */
+GUPnPDLNAVideoInformation *
+gupnp_dlna_information_get_video_information (GUPnPDLNAInformation *info)
+{
+ 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);
+
+ 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;
+}
+
+/**
+ * gupnp_dlna_information_get_uri:
+ * @info: A #GUPnPDLNAInformation object.
+ *
+ * Returns: (transfer none): An URI of a file.
+ */
+const gchar *
+gupnp_dlna_information_get_uri (GUPnPDLNAInformation *info)
+{
+ g_return_val_if_fail (GUPNP_IS_DLNA_INFORMATION (info), NULL);
+
+ return info->priv->uri;
+}
diff --git a/libgupnp-dlna/metadata/gupnp-dlna-information.h b/libgupnp-dlna/metadata/gupnp-dlna-information.h
new file mode 100644
index 0000000..a5155e9
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-information.h
@@ -0,0 +1,117 @@
+/*
+ * 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_INFORMATION_H__
+#define __GUPNP_DLNA_INFORMATION_H__
+
+#include <glib-object.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"
+
+G_BEGIN_DECLS
+
+#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, \
+ GUPnPDLNAInformation))
+
+#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_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, \
+ 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);
+
+GUPnPDLNAAudioInformation*
+gupnp_dlna_information_get_audio_information (GUPnPDLNAInformation *info);
+
+GUPnPDLNAContainerInformation*
+gupnp_dlna_information_get_container_information (GUPnPDLNAInformation *info);
+
+GUPnPDLNAImageInformation*
+gupnp_dlna_information_get_image_information (GUPnPDLNAInformation *info);
+
+GUPnPDLNAVideoInformation*
+gupnp_dlna_information_get_video_information (GUPnPDLNAInformation *info);
+
+const gchar *
+gupnp_dlna_information_get_uri (GUPnPDLNAInformation *info);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DLNA_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
index 0000000..65c2524
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.c
@@ -0,0 +1,216 @@
+/*
+ * 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.
+ */
+
+/**
+ * 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: The results as #GUPnPDLNAInformation.
+ * @error: contains details of the error if discovery fails,
+ * else 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: A #GUPnPDLNAInformation about discovered URI.
+ * @error: A #GError.
+ *
+ * Emits ::done signal. This function is intended to be used by
+ * subclasses of #GUPnPDLNAMetadataExtractor. It would be good 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_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
index 0000000..d92bb87
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-metadata-extractor.h
@@ -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 "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/gupnp-dlna-values.h b/libgupnp-dlna/metadata/gupnp-dlna-values.h
new file mode 100644
index 0000000..c80dfe0
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-values.h
@@ -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/metadata/gupnp-dlna-video-information.c b/libgupnp-dlna/metadata/gupnp-dlna-video-information.c
new file mode 100644
index 0000000..eff3a92
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-video-information.c
@@ -0,0 +1,365 @@
+/*
+ * 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.
+ */
+
+/**
+ * SECTION:gupnp-dlna-video-information
+ * @short_description: Base class representing video metadata needed
+ * for DLNA profiles matching.
+ *
+ * #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.
+ *
+ * @see_also: #GUPnPDLNABoolValue, #GUPnPDLNAFractionValue,
+ * #GUPnPDLNAIntValue, #GUPnPDLNAStringValue
+ */
+
+#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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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:
+ * @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/metadata/gupnp-dlna-video-information.h b/libgupnp-dlna/metadata/gupnp-dlna-video-information.h
new file mode 100644
index 0000000..4d25c90
--- /dev/null
+++ b/libgupnp-dlna/metadata/gupnp-dlna-video-information.h
@@ -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 "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/metadata/metadata.am b/libgupnp-dlna/metadata/metadata.am
new file mode 100644
index 0000000..2a19138
--- /dev/null
+++ b/libgupnp-dlna/metadata/metadata.am
@@ -0,0 +1,18 @@
+metadata_metadata_sources = \
+ metadata/gupnp-dlna-metadata-extractor.c
+
+metadata_general_sources = \
+ metadata/gupnp-dlna-audio-information.c \
+ metadata/gupnp-dlna-container-information.c \
+ metadata/gupnp-dlna-image-information.c \
+ metadata/gupnp-dlna-information.c \
+ metadata/gupnp-dlna-video-information.c
+
+metadata_semi_public_headers = \
+ metadata/gupnp-dlna-audio-information.h \
+ metadata/gupnp-dlna-container-information.h \
+ metadata/gupnp-dlna-image-information.h \
+ metadata/gupnp-dlna-information.h \
+ metadata/gupnp-dlna-metadata-extractor.h \
+ metadata/gupnp-dlna-values.h \
+ metadata/gupnp-dlna-video-information.h
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]