cpw.maiku.media_refactor: ca6a00ea: Break PurpleMediaCodec out into its own ...
maiku at pidgin.im
maiku at pidgin.im
Wed Oct 21 20:31:14 EDT 2009
-----------------------------------------------------------------
Revision: ca6a00ea47ebc632d265f1e0f37603c0b285aab1
Ancestor: 58006e4f2e6e772717996113541e3c8450c1c323
Author: maiku at pidgin.im
Date: 2009-10-22T00:22:59
Branch: im.pidgin.cpw.maiku.media_refactor
URL: http://d.pidgin.im/viewmtn/revision/info/ca6a00ea47ebc632d265f1e0f37603c0b285aab1
Added files:
libpurple/media/codec.c libpurple/media/codec.h
Modified files:
ChangeLog.API libpurple/Makefile.am libpurple/Makefile.mingw
libpurple/media/media.c libpurple/media.h
ChangeLog:
Break PurpleMediaCodec out into its own file.
-------------- next part --------------
============================================================
--- libpurple/media/codec.c 3cb37cf90c251d4dd95c079ade2224fa739ef55f
+++ libpurple/media/codec.c 3cb37cf90c251d4dd95c079ade2224fa739ef55f
@@ -0,0 +1,419 @@
+/**
+ * @file codec.c Codec for Media API
+ * @ingroup core
+ */
+
+/* purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here. Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+ */
+
+#include "codec.h"
+
+/** @copydoc _PurpleMediaCodecClass */
+typedef struct _PurpleMediaCodecClass PurpleMediaCodecClass;
+/** @copydoc _PurpleMediaCodecPrivate */
+typedef struct _PurpleMediaCodecPrivate PurpleMediaCodecPrivate;
+
+#define PURPLE_MEDIA_CODEC_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE((obj), \
+ PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodecPrivate))
+
+struct _PurpleMediaCodecClass
+{
+ GObjectClass parent_class;
+};
+
+struct _PurpleMediaCodec
+{
+ GObject parent;
+};
+
+G_DEFINE_TYPE(PurpleMediaCodec, purple_media_codec, G_TYPE_OBJECT);
+
+struct _PurpleMediaCodecPrivate
+{
+ gint id;
+ char *encoding_name;
+ PurpleMediaSessionType media_type;
+ guint clock_rate;
+ guint channels;
+ GList *optional_params;
+};
+
+enum {
+ PROP_CODEC_0,
+ PROP_ID,
+ PROP_ENCODING_NAME,
+ PROP_MEDIA_TYPE,
+ PROP_CLOCK_RATE,
+ PROP_CHANNELS,
+ PROP_OPTIONAL_PARAMS,
+};
+
+static void
+purple_media_codec_init(PurpleMediaCodec *info)
+{
+ PurpleMediaCodecPrivate *priv =
+ PURPLE_MEDIA_CODEC_GET_PRIVATE(info);
+ priv->encoding_name = NULL;
+ priv->optional_params = NULL;
+}
+
+static void
+purple_media_codec_finalize(GObject *info)
+{
+ PurpleMediaCodecPrivate *priv =
+ PURPLE_MEDIA_CODEC_GET_PRIVATE(info);
+ g_free(priv->encoding_name);
+ for (; priv->optional_params; priv->optional_params =
+ g_list_delete_link(priv->optional_params,
+ priv->optional_params)) {
+ g_free(priv->optional_params->data);
+ }
+}
+
+static void
+purple_media_codec_set_property (GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ PurpleMediaCodecPrivate *priv;
+ g_return_if_fail(PURPLE_IS_MEDIA_CODEC(object));
+
+ priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(object);
+
+ switch (prop_id) {
+ case PROP_ID:
+ priv->id = g_value_get_uint(value);
+ break;
+ case PROP_ENCODING_NAME:
+ g_free(priv->encoding_name);
+ priv->encoding_name = g_value_dup_string(value);
+ break;
+ case PROP_MEDIA_TYPE:
+ priv->media_type = g_value_get_flags(value);
+ break;
+ case PROP_CLOCK_RATE:
+ priv->clock_rate = g_value_get_uint(value);
+ break;
+ case PROP_CHANNELS:
+ priv->channels = g_value_get_uint(value);
+ break;
+ case PROP_OPTIONAL_PARAMS:
+ priv->optional_params = g_value_get_pointer(value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(
+ object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_media_codec_get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ PurpleMediaCodecPrivate *priv;
+ g_return_if_fail(PURPLE_IS_MEDIA_CODEC(object));
+
+ priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(object);
+
+ switch (prop_id) {
+ case PROP_ID:
+ g_value_set_uint(value, priv->id);
+ break;
+ case PROP_ENCODING_NAME:
+ g_value_set_string(value, priv->encoding_name);
+ break;
+ case PROP_MEDIA_TYPE:
+ g_value_set_flags(value, priv->media_type);
+ break;
+ case PROP_CLOCK_RATE:
+ g_value_set_uint(value, priv->clock_rate);
+ break;
+ case PROP_CHANNELS:
+ g_value_set_uint(value, priv->channels);
+ break;
+ case PROP_OPTIONAL_PARAMS:
+ g_value_set_pointer(value, priv->optional_params);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(
+ object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_media_codec_class_init(PurpleMediaCodecClass *klass)
+{
+ GObjectClass *gobject_class = (GObjectClass*)klass;
+
+ gobject_class->finalize = purple_media_codec_finalize;
+ gobject_class->set_property = purple_media_codec_set_property;
+ gobject_class->get_property = purple_media_codec_get_property;
+
+ g_object_class_install_property(gobject_class, PROP_ID,
+ g_param_spec_uint("id",
+ "ID",
+ "The numeric identifier of the codec.",
+ 0, G_MAXUINT, 0,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
+
+ g_object_class_install_property(gobject_class, PROP_ENCODING_NAME,
+ g_param_spec_string("encoding-name",
+ "Encoding Name",
+ "The name of the codec.",
+ NULL,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
+
+ g_object_class_install_property(gobject_class, PROP_MEDIA_TYPE,
+ g_param_spec_flags("media-type",
+ "Media Type",
+ "Whether this is an audio of video codec.",
+ PURPLE_TYPE_MEDIA_SESSION_TYPE,
+ PURPLE_MEDIA_NONE,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
+
+ g_object_class_install_property(gobject_class, PROP_CLOCK_RATE,
+ g_param_spec_uint("clock-rate",
+ "Create Callback",
+ "The function called to create this element.",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property(gobject_class, PROP_CHANNELS,
+ g_param_spec_uint("channels",
+ "Channels",
+ "The number of channels in this codec.",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READWRITE));
+ g_object_class_install_property(gobject_class, PROP_OPTIONAL_PARAMS,
+ g_param_spec_pointer("optional-params",
+ "Optional Params",
+ "A list of optional parameters for the codec.",
+ G_PARAM_READWRITE));
+
+ g_type_class_add_private(klass, sizeof(PurpleMediaCodecPrivate));
+}
+
+PurpleMediaCodec *
+purple_media_codec_new(int id, const char *encoding_name,
+ PurpleMediaSessionType media_type, guint clock_rate)
+{
+ PurpleMediaCodec *codec =
+ g_object_new(PURPLE_TYPE_MEDIA_CODEC,
+ "id", id,
+ "encoding_name", encoding_name,
+ "media_type", media_type,
+ "clock-rate", clock_rate, NULL);
+ return codec;
+}
+
+guint
+purple_media_codec_get_id(PurpleMediaCodec *codec)
+{
+ guint id;
+ g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), 0);
+ g_object_get(codec, "id", &id, NULL);
+ return id;
+}
+
+gchar *
+purple_media_codec_get_encoding_name(PurpleMediaCodec *codec)
+{
+ gchar *name;
+ g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), NULL);
+ g_object_get(codec, "encoding-name", &name, NULL);
+ return name;
+}
+
+guint
+purple_media_codec_get_clock_rate(PurpleMediaCodec *codec)
+{
+ guint clock_rate;
+ g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), 0);
+ g_object_get(codec, "clock-rate", &clock_rate, NULL);
+ return clock_rate;
+}
+
+guint
+purple_media_codec_get_channels(PurpleMediaCodec *codec)
+{
+ guint channels;
+ g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), 0);
+ g_object_get(codec, "channels", &channels, NULL);
+ return channels;
+}
+
+GList *
+purple_media_codec_get_optional_parameters(PurpleMediaCodec *codec)
+{
+ GList *optional_params;
+ g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), NULL);
+ g_object_get(codec, "optional-params", &optional_params, NULL);
+ return optional_params;
+}
+
+void
+purple_media_codec_add_optional_parameter(PurpleMediaCodec *codec,
+ const gchar *name, const gchar *value)
+{
+ PurpleMediaCodecPrivate *priv;
+ PurpleKeyValuePair *new_param;
+
+ g_return_if_fail(codec != NULL);
+ g_return_if_fail(name != NULL && value != NULL);
+
+ priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
+
+ new_param = g_new0(PurpleKeyValuePair, 1);
+ new_param->key = g_strdup(name);
+ new_param->value = g_strdup(value);
+ priv->optional_params = g_list_append(
+ priv->optional_params, new_param);
+}
+
+void
+purple_media_codec_remove_optional_parameter(PurpleMediaCodec *codec,
+ PurpleKeyValuePair *param)
+{
+ PurpleMediaCodecPrivate *priv;
+
+ g_return_if_fail(codec != NULL && param != NULL);
+
+ priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
+
+ g_free(param->key);
+ g_free(param->value);
+ g_free(param);
+
+ priv->optional_params =
+ g_list_remove(priv->optional_params, param);
+}
+
+PurpleKeyValuePair *
+purple_media_codec_get_optional_parameter(PurpleMediaCodec *codec,
+ const gchar *name, const gchar *value)
+{
+ PurpleMediaCodecPrivate *priv;
+ GList *iter;
+
+ g_return_val_if_fail(codec != NULL, NULL);
+ g_return_val_if_fail(name != NULL, NULL);
+
+ priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
+
+ for (iter = priv->optional_params; iter; iter = g_list_next(iter)) {
+ PurpleKeyValuePair *param = iter->data;
+ if (!g_ascii_strcasecmp(param->key, name) &&
+ (value == NULL ||
+ !g_ascii_strcasecmp(param->value, value)))
+ return param;
+ }
+
+ return NULL;
+}
+
+PurpleMediaCodec *
+purple_media_codec_copy(PurpleMediaCodec *codec)
+{
+ PurpleMediaCodecPrivate *priv;
+ PurpleMediaCodec *new_codec;
+ GList *iter;
+
+ if (codec == NULL)
+ return NULL;
+
+ priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
+
+ new_codec = purple_media_codec_new(priv->id, priv->encoding_name,
+ priv->media_type, priv->clock_rate);
+ g_object_set(codec, "channels", priv->channels, NULL);
+
+ for (iter = priv->optional_params; iter; iter = g_list_next(iter)) {
+ PurpleKeyValuePair *param =
+ (PurpleKeyValuePair*)iter->data;
+ purple_media_codec_add_optional_parameter(new_codec,
+ param->key, param->value);
+ }
+
+ return new_codec;
+}
+
+GList *
+purple_media_codec_list_copy(GList *codecs)
+{
+ GList *new_list = NULL;
+
+ for (; codecs; codecs = g_list_next(codecs)) {
+ new_list = g_list_prepend(new_list,
+ purple_media_codec_copy(codecs->data));
+ }
+
+ new_list = g_list_reverse(new_list);
+ return new_list;
+}
+
+void
+purple_media_codec_list_free(GList *codecs)
+{
+ for (; codecs; codecs =
+ g_list_delete_link(codecs, codecs)) {
+ g_object_unref(codecs->data);
+ }
+}
+
+gchar *
+purple_media_codec_to_string(const PurpleMediaCodec *codec)
+{
+ PurpleMediaCodecPrivate *priv;
+ GString *string = NULL;
+ GList *item;
+ gchar *charstring;
+ const gchar *media_type_str = NULL;
+
+ if (codec == NULL)
+ return g_strdup("(NULL)");
+
+ priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
+
+ string = g_string_new("");
+
+ if (priv->media_type & PURPLE_MEDIA_AUDIO)
+ media_type_str = "audio";
+ else if (priv->media_type & PURPLE_MEDIA_VIDEO)
+ media_type_str = "video";
+
+ g_string_printf(string, "%d: %s %s clock:%d channels:%d", priv->id,
+ media_type_str, priv->encoding_name,
+ priv->clock_rate, priv->channels);
+
+ for (item = priv->optional_params; item; item = g_list_next (item)) {
+ PurpleKeyValuePair *param = item->data;
+ g_string_append_printf (string, " %s=%s",
+ param->key, (gchar *)param->value);
+ }
+
+ charstring = string->str;
+ g_string_free (string, FALSE);
+
+ return charstring;
+}
+
============================================================
--- libpurple/media/codec.h 92ffbe395b3e4434224440acb50df2d039fc2c65
+++ libpurple/media/codec.h 92ffbe395b3e4434224440acb50df2d039fc2c65
@@ -0,0 +1,162 @@
+/**
+ * @file codec.h Codec for Media API
+ * @ingroup core
+ */
+
+/* purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here. Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+ */
+
+#ifndef _PURPLE_MEDIA_CODEC_H_
+#define _PURPLE_MEDIA_CODEC_H_
+
+#include "enum-types.h"
+
+/** An opaque structure representing an audio or video codec. */
+typedef struct _PurpleMediaCodec PurpleMediaCodec;
+
+#include "util.h"
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define PURPLE_TYPE_MEDIA_CODEC (purple_media_codec_get_type())
+#define PURPLE_IS_MEDIA_CODEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_CODEC))
+#define PURPLE_IS_MEDIA_CODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_CODEC))
+#define PURPLE_MEDIA_CODEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
+#define PURPLE_MEDIA_CODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
+#define PURPLE_MEDIA_CODEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
+
+
+/**
+ * Gets the type of the media codec structure.
+ *
+ * @return The media codec's GType
+ *
+ * @since 2.6.0
+ */
+GType purple_media_codec_get_type(void);
+
+/**
+ * Creates a new PurpleMediaCodec instance.
+ *
+ * @param id Codec identifier.
+ * @param encoding_name Name of the media type this encodes.
+ * @param media_type PurpleMediaSessionType of this codec.
+ * @param clock_rate The clock rate this codec encodes at, if applicable.
+ *
+ * @return The newly created PurpleMediaCodec.
+ *
+ * @since 2.6.0
+ */
+PurpleMediaCodec *purple_media_codec_new(int id, const char *encoding_name,
+ PurpleMediaSessionType media_type, guint clock_rate);
+
+guint purple_media_codec_get_id(PurpleMediaCodec *codec);
+gchar *purple_media_codec_get_encoding_name(PurpleMediaCodec *codec);
+guint purple_media_codec_get_clock_rate(PurpleMediaCodec *codec);
+guint purple_media_codec_get_channels(PurpleMediaCodec *codec);
+GList *purple_media_codec_get_optional_parameters(PurpleMediaCodec *codec);
+
+/**
+ * Adds an optional parameter to the codec.
+ *
+ * @param codec The codec to add the parameter to.
+ * @param name The name of the parameter to add.
+ * @param value The value of the parameter to add.
+ *
+ * @since 2.6.0
+ */
+void purple_media_codec_add_optional_parameter(PurpleMediaCodec *codec,
+ const gchar *name, const gchar *value);
+
+/**
+ * Removes an optional parameter from the codec.
+ *
+ * @param codec The codec to remove the parameter from.
+ * @param param A pointer to the parameter to remove.
+ *
+ * @since 2.6.0
+ */
+void purple_media_codec_remove_optional_parameter(PurpleMediaCodec *codec,
+ PurpleKeyValuePair *param);
+
+/**
+ * Gets an optional parameter based on the values given.
+ *
+ * @param codec The codec to find the parameter in.
+ * @param name The name of the parameter to search for.
+ * @param value The value to search for or NULL.
+ *
+ * @return The value found or NULL.
+ *
+ * @since 2.6.0
+ */
+PurpleKeyValuePair *purple_media_codec_get_optional_parameter(
+ PurpleMediaCodec *codec, const gchar *name,
+ const gchar *value);
+
+/**
+ * Copies a PurpleMediaCodec object.
+ *
+ * @param codec The codec to copy.
+ *
+ * @return The copy of the codec.
+ *
+ * @since 2.7.0
+ */
+PurpleMediaCodec *purple_media_codec_copy(PurpleMediaCodec *codec);
+
+/**
+ * Copies a GList of PurpleMediaCodec and its contents.
+ *
+ * @param codecs The list of codecs to be copied.
+ *
+ * @return The copy of the GList.
+ *
+ * @since 2.6.0
+ */
+GList *purple_media_codec_list_copy(GList *codecs);
+
+/**
+ * Frees a GList of PurpleMediaCodec and its contents.
+ *
+ * @param codecs The list of codecs to be freed.
+ *
+ * @since 2.6.0
+ */
+void purple_media_codec_list_free(GList *codecs);
+
+/**
+ * Creates a string representation of the codec.
+ *
+ * @param codec The codec to create the string of.
+ *
+ * @return The new string representation.
+ *
+ * @since 2.6.0
+ */
+gchar *purple_media_codec_to_string(const PurpleMediaCodec *codec);
+
+G_END_DECLS
+
+#endif /* _PURPLE_MEDIA_CODEC_H_ */
+
============================================================
--- ChangeLog.API 6f70759f63bf7359ec98c556a1014d0b83a9837f
+++ ChangeLog.API a3fc5227674d42a4b45ef4084d1e61659b432e5c
@@ -4,6 +4,7 @@ version 2.7.0 (??/??/????):
libpurple:
Added:
* purple_account_get_name_for_display
+ * purple_media_codec_copy
* purple_network_get_all_local_system_ips
* purple_prpl_got_media_caps
* purple_uuid_random
============================================================
--- libpurple/Makefile.am 73dd547e589ab22c7a6b6e45e80157a46e535937
+++ libpurple/Makefile.am 9bf2cad78a6e6fc01a316b4b11d9e3add5f8b680
@@ -54,6 +54,7 @@ purple_coresources = \
imgstore.c \
log.c \
media/candidate.c \
+ media/codec.c \
media/enum-types.c \
media/media.c \
mediamanager.c \
@@ -119,6 +120,7 @@ purple_coreheaders = \
imgstore.h \
log.h \
media/candidate.h \
+ media/codec.h \
media/enum-types.h \
media.h \
media-gst.h \
============================================================
--- libpurple/Makefile.mingw cb4bb16d874d55cf9c6418e46e1985164eace85f
+++ libpurple/Makefile.mingw b37f9b7081dd2dd5dba90b06adbdbb140b04b2f8
@@ -49,6 +49,7 @@ C_SRC = \
imgstore.c \
log.c \
media/candidate.c \
+ media/codec.c \
media/enum-types.c \
media/media.c \
mediamanager.c \
============================================================
--- libpurple/media/media.c 1197ae3a6e7474575a8936746ea29d174634f70c
+++ libpurple/media/media.c 80bab8dfc586c460a5b70794fb4f50e8a1b4a236
@@ -53,10 +53,6 @@ typedef struct _PurpleMediaPrivate Purpl
typedef struct _PurpleMediaClass PurpleMediaClass;
/** @copydoc _PurpleMediaPrivate */
typedef struct _PurpleMediaPrivate PurpleMediaPrivate;
-/** @copydoc _PurpleMediaCodecClass */
-typedef struct _PurpleMediaCodecClass PurpleMediaCodecClass;
-/** @copydoc _PurpleMediaCodecPrivate */
-typedef struct _PurpleMediaCodecPrivate PurpleMediaCodecPrivate;
/** The media class */
struct _PurpleMediaClass
@@ -129,7 +125,6 @@ struct _PurpleMediaPrivate
#ifdef USE_VV
#define PURPLE_MEDIA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA, PurpleMediaPrivate))
-#define PURPLE_MEDIA_CODEC_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodecPrivate))
static void purple_media_class_init (PurpleMediaClass *klass);
static void purple_media_init (PurpleMedia *media);
@@ -653,377 +648,42 @@ purple_media_from_fs(FsMediaType type, F
}
return result;
}
-#endif
-/*
- * PurpleMediaCodec
- */
-
-struct _PurpleMediaCodecClass
+static FsCodec *
+purple_media_codec_to_fs(const PurpleMediaCodec *codec)
{
- GObjectClass parent_class;
-};
-
-struct _PurpleMediaCodec
-{
- GObject parent;
-};
-
-#ifdef USE_VV
-struct _PurpleMediaCodecPrivate
-{
+ FsCodec *new_codec;
gint id;
char *encoding_name;
PurpleMediaSessionType media_type;
guint clock_rate;
guint channels;
- GList *optional_params;
-};
-
-enum {
- PROP_CODEC_0,
- PROP_ID,
- PROP_ENCODING_NAME,
- PROP_MEDIA_TYPE,
- PROP_CLOCK_RATE,
- PROP_CHANNELS,
- PROP_OPTIONAL_PARAMS,
-};
-
-static void
-purple_media_codec_init(PurpleMediaCodec *info)
-{
- PurpleMediaCodecPrivate *priv =
- PURPLE_MEDIA_CODEC_GET_PRIVATE(info);
- priv->encoding_name = NULL;
- priv->optional_params = NULL;
-}
-
-static void
-purple_media_codec_finalize(GObject *info)
-{
- PurpleMediaCodecPrivate *priv =
- PURPLE_MEDIA_CODEC_GET_PRIVATE(info);
- g_free(priv->encoding_name);
- for (; priv->optional_params; priv->optional_params =
- g_list_delete_link(priv->optional_params,
- priv->optional_params)) {
- g_free(priv->optional_params->data);
- }
-}
-
-static void
-purple_media_codec_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- PurpleMediaCodecPrivate *priv;
- g_return_if_fail(PURPLE_IS_MEDIA_CODEC(object));
-
- priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(object);
-
- switch (prop_id) {
- case PROP_ID:
- priv->id = g_value_get_uint(value);
- break;
- case PROP_ENCODING_NAME:
- g_free(priv->encoding_name);
- priv->encoding_name = g_value_dup_string(value);
- break;
- case PROP_MEDIA_TYPE:
- priv->media_type = g_value_get_flags(value);
- break;
- case PROP_CLOCK_RATE:
- priv->clock_rate = g_value_get_uint(value);
- break;
- case PROP_CHANNELS:
- priv->channels = g_value_get_uint(value);
- break;
- case PROP_OPTIONAL_PARAMS:
- priv->optional_params = g_value_get_pointer(value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(
- object, prop_id, pspec);
- break;
- }
-}
-
-static void
-purple_media_codec_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- PurpleMediaCodecPrivate *priv;
- g_return_if_fail(PURPLE_IS_MEDIA_CODEC(object));
-
- priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(object);
-
- switch (prop_id) {
- case PROP_ID:
- g_value_set_uint(value, priv->id);
- break;
- case PROP_ENCODING_NAME:
- g_value_set_string(value, priv->encoding_name);
- break;
- case PROP_MEDIA_TYPE:
- g_value_set_flags(value, priv->media_type);
- break;
- case PROP_CLOCK_RATE:
- g_value_set_uint(value, priv->clock_rate);
- break;
- case PROP_CHANNELS:
- g_value_set_uint(value, priv->channels);
- break;
- case PROP_OPTIONAL_PARAMS:
- g_value_set_pointer(value, priv->optional_params);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(
- object, prop_id, pspec);
- break;
- }
-}
-
-static void
-purple_media_codec_class_init(PurpleMediaCodecClass *klass)
-{
- GObjectClass *gobject_class = (GObjectClass*)klass;
-
- gobject_class->finalize = purple_media_codec_finalize;
- gobject_class->set_property = purple_media_codec_set_property;
- gobject_class->get_property = purple_media_codec_get_property;
-
- g_object_class_install_property(gobject_class, PROP_ID,
- g_param_spec_uint("id",
- "ID",
- "The numeric identifier of the codec.",
- 0, G_MAXUINT, 0,
- G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
-
- g_object_class_install_property(gobject_class, PROP_ENCODING_NAME,
- g_param_spec_string("encoding-name",
- "Encoding Name",
- "The name of the codec.",
- NULL,
- G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
-
- g_object_class_install_property(gobject_class, PROP_MEDIA_TYPE,
- g_param_spec_flags("media-type",
- "Media Type",
- "Whether this is an audio of video codec.",
- PURPLE_TYPE_MEDIA_SESSION_TYPE,
- PURPLE_MEDIA_NONE,
- G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
-
- g_object_class_install_property(gobject_class, PROP_CLOCK_RATE,
- g_param_spec_uint("clock-rate",
- "Create Callback",
- "The function called to create this element.",
- 0, G_MAXUINT, 0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property(gobject_class, PROP_CHANNELS,
- g_param_spec_uint("channels",
- "Channels",
- "The number of channels in this codec.",
- 0, G_MAXUINT, 0,
- G_PARAM_READWRITE));
- g_object_class_install_property(gobject_class, PROP_OPTIONAL_PARAMS,
- g_param_spec_pointer("optional-params",
- "Optional Params",
- "A list of optional parameters for the codec.",
- G_PARAM_READWRITE));
-
- g_type_class_add_private(klass, sizeof(PurpleMediaCodecPrivate));
-}
-
-G_DEFINE_TYPE(PurpleMediaCodec,
- purple_media_codec, G_TYPE_OBJECT);
-#else
-GType
-purple_media_codec_get_type()
-{
- return G_TYPE_NONE;
-}
-#endif
-
-guint
-purple_media_codec_get_id(PurpleMediaCodec *codec)
-{
- guint id;
- g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), 0);
- g_object_get(codec, "id", &id, NULL);
- return id;
-}
-
-gchar *
-purple_media_codec_get_encoding_name(PurpleMediaCodec *codec)
-{
- gchar *name;
- g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), NULL);
- g_object_get(codec, "encoding-name", &name, NULL);
- return name;
-}
-
-guint
-purple_media_codec_get_clock_rate(PurpleMediaCodec *codec)
-{
- guint clock_rate;
- g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), 0);
- g_object_get(codec, "clock-rate", &clock_rate, NULL);
- return clock_rate;
-}
-
-guint
-purple_media_codec_get_channels(PurpleMediaCodec *codec)
-{
- guint channels;
- g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), 0);
- g_object_get(codec, "channels", &channels, NULL);
- return channels;
-}
-
-GList *
-purple_media_codec_get_optional_parameters(PurpleMediaCodec *codec)
-{
- GList *optional_params;
- g_return_val_if_fail(PURPLE_IS_MEDIA_CODEC(codec), NULL);
- g_object_get(codec, "optional-params", &optional_params, NULL);
- return optional_params;
-}
-
-void
-purple_media_codec_add_optional_parameter(PurpleMediaCodec *codec,
- const gchar *name, const gchar *value)
-{
-#ifdef USE_VV
- PurpleMediaCodecPrivate *priv;
- PurpleKeyValuePair *new_param;
-
- g_return_if_fail(codec != NULL);
- g_return_if_fail(name != NULL && value != NULL);
-
- priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
-
- new_param = g_new0(PurpleKeyValuePair, 1);
- new_param->key = g_strdup(name);
- new_param->value = g_strdup(value);
- priv->optional_params = g_list_append(
- priv->optional_params, new_param);
-#endif
-}
-
-void
-purple_media_codec_remove_optional_parameter(PurpleMediaCodec *codec,
- PurpleKeyValuePair *param)
-{
-#ifdef USE_VV
- PurpleMediaCodecPrivate *priv;
-
- g_return_if_fail(codec != NULL && param != NULL);
-
- priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
-
- g_free(param->key);
- g_free(param->value);
- g_free(param);
-
- priv->optional_params =
- g_list_remove(priv->optional_params, param);
-#endif
-}
-
-PurpleKeyValuePair *
-purple_media_codec_get_optional_parameter(PurpleMediaCodec *codec,
- const gchar *name, const gchar *value)
-{
-#ifdef USE_VV
- PurpleMediaCodecPrivate *priv;
GList *iter;
- g_return_val_if_fail(codec != NULL, NULL);
- g_return_val_if_fail(name != NULL, NULL);
-
- priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
-
- for (iter = priv->optional_params; iter; iter = g_list_next(iter)) {
- PurpleKeyValuePair *param = iter->data;
- if (!g_ascii_strcasecmp(param->key, name) &&
- (value == NULL ||
- !g_ascii_strcasecmp(param->value, value)))
- return param;
- }
-#endif
-
- return NULL;
-}
-
-PurpleMediaCodec *
-purple_media_codec_new(int id, const char *encoding_name,
- PurpleMediaSessionType media_type, guint clock_rate)
-{
- PurpleMediaCodec *codec =
- g_object_new(PURPLE_TYPE_MEDIA_CODEC,
- "id", id,
- "encoding_name", encoding_name,
- "media_type", media_type,
- "clock-rate", clock_rate, NULL);
- return codec;
-}
-
-static PurpleMediaCodec *
-purple_media_codec_copy(PurpleMediaCodec *codec)
-{
-#ifdef USE_VV
- PurpleMediaCodecPrivate *priv;
- PurpleMediaCodec *new_codec;
- GList *iter;
-
if (codec == NULL)
return NULL;
- priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
+ g_object_get(G_OBJECT(codec),
+ "id", &id,
+ "encoding-name", &encoding_name,
+ "media-type", &media_type,
+ "clock-rate", &clock_rate,
+ "channels", &channels,
+ "optional-params", &iter,
+ NULL);
- new_codec = purple_media_codec_new(priv->id, priv->encoding_name,
- priv->media_type, priv->clock_rate);
- g_object_set(codec, "channels", priv->channels, NULL);
+ new_codec = fs_codec_new(id, encoding_name,
+ purple_media_to_fs_media_type(media_type),
+ clock_rate);
+ new_codec->channels = channels;
- for (iter = priv->optional_params; iter; iter = g_list_next(iter)) {
- PurpleKeyValuePair *param =
- (PurpleKeyValuePair*)iter->data;
- purple_media_codec_add_optional_parameter(new_codec,
- param->key, param->value);
- }
-
- return new_codec;
-#else
- return NULL;
-#endif
-}
-
-#ifdef USE_VV
-static FsCodec *
-purple_media_codec_to_fs(const PurpleMediaCodec *codec)
-{
- PurpleMediaCodecPrivate *priv;
- FsCodec *new_codec;
- GList *iter;
-
- if (codec == NULL)
- return NULL;
-
- priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(codec);
-
- new_codec = fs_codec_new(priv->id, priv->encoding_name,
- purple_media_to_fs_media_type(priv->media_type),
- priv->clock_rate);
- new_codec->channels = priv->channels;
-
- for (iter = priv->optional_params; iter; iter = g_list_next(iter)) {
+ for (; iter; iter = g_list_next(iter)) {
PurpleKeyValuePair *param = (PurpleKeyValuePair*)iter->data;
fs_codec_add_optional_parameter(new_codec,
param->key, param->value);
}
+ g_free(encoding_name);
return new_codec;
}
@@ -1049,22 +709,7 @@ purple_media_codec_from_fs(const FsCodec
return new_codec;
}
-#endif
-gchar *
-purple_media_codec_to_string(const PurpleMediaCodec *codec)
-{
-#ifdef USE_VV
- FsCodec *fscodec = purple_media_codec_to_fs(codec);
- gchar *str = fs_codec_to_string(fscodec);
- fs_codec_destroy(fscodec);
- return str;
-#else
- return g_strdup("");
-#endif
-}
-
-#ifdef USE_VV
static GList *
purple_media_codec_list_from_fs(GList *codecs)
{
@@ -1094,32 +739,7 @@ purple_media_codec_list_to_fs(GList *cod
new_list = g_list_reverse(new_list);
return new_list;
}
-#endif
-GList *
-purple_media_codec_list_copy(GList *codecs)
-{
- GList *new_list = NULL;
-
- for (; codecs; codecs = g_list_next(codecs)) {
- new_list = g_list_prepend(new_list,
- purple_media_codec_copy(codecs->data));
- }
-
- new_list = g_list_reverse(new_list);
- return new_list;
-}
-
-void
-purple_media_codec_list_free(GList *codecs)
-{
- for (; codecs; codecs =
- g_list_delete_link(codecs, codecs)) {
- g_object_unref(codecs->data);
- }
-}
-
-#ifdef USE_VV
static PurpleMediaSession*
purple_media_get_session(PurpleMedia *media, const gchar *sess_id)
{
============================================================
--- libpurple/media.h 5549da45a462eda115425b9968a8be48441b4361
+++ libpurple/media.h cc807b528f43992d96c9fe19e139a0aaba4f8c2e
@@ -28,6 +28,7 @@
#define _PURPLE_MEDIA_H_
#include "media/candidate.h"
+#include "media/codec.h"
#include "media/enum-types.h"
#include <glib.h>
@@ -35,13 +36,6 @@ G_BEGIN_DECLS
G_BEGIN_DECLS
-#define PURPLE_TYPE_MEDIA_CODEC (purple_media_codec_get_type())
-#define PURPLE_MEDIA_CODEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
-#define PURPLE_MEDIA_CODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
-#define PURPLE_IS_MEDIA_CODEC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), PURPLE_TYPE_MEDIA_CODEC))
-#define PURPLE_IS_MEDIA_CODEC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MEDIA_CODEC))
-#define PURPLE_MEDIA_CODEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MEDIA_CODEC, PurpleMediaCodec))
-
#define PURPLE_TYPE_MEDIA (purple_media_get_type())
#define PURPLE_MEDIA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), PURPLE_TYPE_MEDIA, PurpleMedia))
#define PURPLE_MEDIA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MEDIA, PurpleMediaClass))
@@ -51,8 +45,6 @@ typedef struct _PurpleMedia PurpleMedia;
/** An opaque structure representing a media call. */
typedef struct _PurpleMedia PurpleMedia;
-/** An opaque structure representing an audio or video codec. */
-typedef struct _PurpleMediaCodec PurpleMediaCodec;
#include "signals.h"
#include "util.h"
@@ -71,105 +63,6 @@ GType purple_media_get_type(void);
GType purple_media_get_type(void);
/**
- * Gets the type of the media codec structure.
- *
- * @return The media codec's GType
- *
- * @since 2.6.0
- */
-GType purple_media_codec_get_type(void);
-
-/**
- * Creates a new PurpleMediaCodec instance.
- *
- * @param id Codec identifier.
- * @param encoding_name Name of the media type this encodes.
- * @param media_type PurpleMediaSessionType of this codec.
- * @param clock_rate The clock rate this codec encodes at, if applicable.
- *
- * @return The newly created PurpleMediaCodec.
- *
- * @since 2.6.0
- */
-PurpleMediaCodec *purple_media_codec_new(int id, const char *encoding_name,
- PurpleMediaSessionType media_type, guint clock_rate);
-
-guint purple_media_codec_get_id(PurpleMediaCodec *codec);
-gchar *purple_media_codec_get_encoding_name(PurpleMediaCodec *codec);
-guint purple_media_codec_get_clock_rate(PurpleMediaCodec *codec);
-guint purple_media_codec_get_channels(PurpleMediaCodec *codec);
-GList *purple_media_codec_get_optional_parameters(PurpleMediaCodec *codec);
-
-/**
- * Creates a string representation of the codec.
- *
- * @param codec The codec to create the string of.
- *
- * @return The new string representation.
- *
- * @since 2.6.0
- */
-gchar *purple_media_codec_to_string(const PurpleMediaCodec *codec);
-
-/**
- * Adds an optional parameter to the codec.
- *
- * @param codec The codec to add the parameter to.
- * @param name The name of the parameter to add.
- * @param value The value of the parameter to add.
- *
- * @since 2.6.0
- */
-void purple_media_codec_add_optional_parameter(PurpleMediaCodec *codec,
- const gchar *name, const gchar *value);
-
-/**
- * Removes an optional parameter from the codec.
- *
- * @param codec The codec to remove the parameter from.
- * @param param A pointer to the parameter to remove.
- *
- * @since 2.6.0
- */
-void purple_media_codec_remove_optional_parameter(PurpleMediaCodec *codec,
- PurpleKeyValuePair *param);
-
-/**
- * Gets an optional parameter based on the values given.
- *
- * @param codec The codec to find the parameter in.
- * @param name The name of the parameter to search for.
- * @param value The value to search for or NULL.
- *
- * @return The value found or NULL.
- *
- * @since 2.6.0
- */
-PurpleKeyValuePair *purple_media_codec_get_optional_parameter(
- PurpleMediaCodec *codec, const gchar *name,
- const gchar *value);
-
-/**
- * Copies a GList of PurpleMediaCodec and its contents.
- *
- * @param codecs The list of codecs to be copied.
- *
- * @return The copy of the GList.
- *
- * @since 2.6.0
- */
-GList *purple_media_codec_list_copy(GList *codecs);
-
-/**
- * Frees a GList of PurpleMediaCodec and its contents.
- *
- * @param codecs The list of codecs to be freed.
- *
- * @since 2.6.0
- */
-void purple_media_codec_list_free(GList *codecs);
-
-/**
* Gets a list of session IDs.
*
* @param media The media session from which to retrieve session IDs.
More information about the Commits
mailing list