/* * Farstream - Farstream Codec * * Copyright 2007 Collabora Ltd. * @author: Philippe Kalaf * Copyright 2007 Nokia Corp. * * Copyright 2005 Collabora Ltd. * @author: Rob Taylor * * fs-codec.h - A Farstream codec * * 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.1 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 __FS_CODEC_H__ #define __FS_CODEC_H__ #include G_BEGIN_DECLS typedef struct _FsCodec FsCodec; typedef struct _FsCodecParameter FsCodecParameter; typedef struct _FsFeedbackParameter FsFeedbackParameter; #define FS_TYPE_CODEC \ (fs_codec_get_type ()) #define FS_TYPE_CODEC_LIST \ (fs_codec_list_get_type ()) /** * FsMediaType: * @FS_MEDIA_TYPE_AUDIO: A media type that encodes audio. * @FS_MEDIA_TYPE_VIDEO: A media type that encodes video. * @FS_MEDIA_TYPE_APPLICATION: A media type for application data. * @FS_MEDIA_TYPE_LAST: Largest valid #FsMediaType * * Enum used to signify the media type of a codec or stream. */ typedef enum { FS_MEDIA_TYPE_AUDIO, FS_MEDIA_TYPE_VIDEO, FS_MEDIA_TYPE_APPLICATION, FS_MEDIA_TYPE_LAST = FS_MEDIA_TYPE_APPLICATION } FsMediaType; /** * FS_CODEC_ID_ANY: * * If the id of a #FsCodec is #FS_CODEC_ID_ANY, then it will be replaced * with a dynamic payload type at runtime */ /** * FS_CODEC_ID_DISABLE: * * If the id of a #FsCodec is #FS_CODEC_ID_DISABLE, then this codec will * not be used */ #define FS_CODEC_ID_ANY (-1) #define FS_CODEC_ID_DISABLE (-2) /** * FsCodec: * @id: numeric identifier for encoding, eg. PT for SDP * @encoding_name: the name of the codec * @media_type: type of media this codec is for * @clock_rate: clock rate of this stream * @channels: Number of channels codec should decode * @optional_params: (element-type FsCodecParameter): key pairs of param name to param data * @minimum_reporting_interval: The minimum interval between two RTCP reports, * If it is not specified (G_MAXUINT), it is up to the protocol to decide * (it is 5 seconds for RTP). * @feedback_params: (element-type FsFeedbackParameter): key triplets of * feedbck param type, subtype and extra string that is supported for this codec * * This structure reprensents one codec that can be offered or received */ struct _FsCodec { gint id; char *encoding_name; FsMediaType media_type; guint clock_rate; guint channels; guint minimum_reporting_interval; GList *optional_params; GList *feedback_params; }; /** * FsCodecParameter: * @name: paramter name. * @value: parameter value. * * Used to store arbitary parameters for a codec */ struct _FsCodecParameter { gchar *name; gchar *value; }; /** * FsFeedbackParameter: * @type: the type of feedback, like "ack", "name", "ccm" * @subtype: the subtype of feedback (can be an empty string) * @extra_params: a string containing extra parameters (can be empty) * * Use to store feedback parameters */ struct _FsFeedbackParameter { gchar *type; gchar *subtype; gchar *extra_params; }; /** * FS_CODEC_FORMAT: * * A format that can be used in printf like format strings to format a FsCodec */ /** * FS_CODEC_ARGS: * @codec: a #FsCodec * * Formats the codec in args for FS_CODEC_FORMAT */ #define FS_CODEC_FORMAT "%d: %s %s clock:%d channels:%d params:%p" #define FS_CODEC_ARGS(codec) \ (codec)->id, \ fs_media_type_to_string ((codec)->media_type), \ (codec)->encoding_name, \ (codec)->clock_rate, \ (codec)->channels, \ (codec)->optional_params GType fs_codec_get_type (void); GType fs_codec_list_get_type (void); FsCodec *fs_codec_new (int id, const char *encoding_name, FsMediaType media_type, guint clock_rate); void fs_codec_destroy (FsCodec * codec); FsCodec *fs_codec_copy (const FsCodec * codec); void fs_codec_list_destroy (GList *codec_list); GList *fs_codec_list_copy (const GList *codec_list); GList *fs_codec_list_from_keyfile (const gchar *filename, GError **error); gchar *fs_codec_to_string (const FsCodec *codec); const gchar *fs_media_type_to_string (FsMediaType media_type); gboolean fs_codec_are_equal (const FsCodec *codec1, const FsCodec *codec2); gboolean fs_codec_list_are_equal (GList *list1, GList *list2); void fs_codec_add_optional_parameter (FsCodec *codec, const gchar *name, const gchar *value); void fs_codec_remove_optional_parameter (FsCodec *codec, FsCodecParameter *param); FsCodecParameter *fs_codec_get_optional_parameter (FsCodec *codec, const gchar *name, const gchar *value); #define FS_TYPE_CODEC_PARAMETER (fs_codec_parameter_get_type ()) GType fs_codec_parameter_get_type (void); FsCodecParameter *fs_codec_parameter_copy (const FsCodecParameter *param); void fs_codec_parameter_free (FsCodecParameter *param); void fs_codec_add_feedback_parameter (FsCodec *codec, const gchar *type, const gchar *subtype, const gchar *extra_params); FsFeedbackParameter *fs_codec_get_feedback_parameter (FsCodec *codec, const gchar *type, const gchar *subtype, const gchar *extra_params); void fs_codec_remove_feedback_parameter (FsCodec *codec, GList *item); #define FS_TYPE_FEEDBACK_PARAMETER (fs_feedback_parameter_get_type ()) GType fs_feedback_parameter_get_type (void); FsFeedbackParameter *fs_feedback_parameter_copy ( const FsFeedbackParameter *param); void fs_feedback_parameter_free (FsFeedbackParameter *param); G_END_DECLS #endif /* __FS_CODEC_H__ */