2003-11-24 02:09:23 +00:00
/* GStreamer
* Copyright ( C ) 2003 Benjamin Otte < in7y118 @ public . uni - hamburg . de >
*
2005-09-07 13:22:16 +00:00
* gsttaglist . c : tag support ( aka metadata )
2003-11-24 02:09:23 +00:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation ; either
* version 2 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Library General Public License for more details .
*
* You should have received a copy of the GNU Library General Public
* License along with this library ; if not , write to the
* Free Software Foundation , Inc . , 59 Temple Place - Suite 330 ,
* Boston , MA 02111 - 1307 , USA .
*/
2005-10-15 16:01:57 +00:00
2005-09-06 22:03:01 +00:00
/**
* SECTION : gsttaglist
* @ short_description : List of tags and values used to describe media metadata
*
2005-11-24 09:44:07 +00:00
* List of tags and values used to describe media metadata .
*
* Last reviewed on 2005 - 11 - 23 ( 0.9 .5 )
2005-09-06 22:03:01 +00:00
*/
2003-11-24 02:09:23 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "gst_private.h"
2004-01-13 11:04:25 +00:00
# include "gst-i18n-lib.h"
2005-09-07 13:22:16 +00:00
# include "gsttaglist.h"
2003-11-24 02:09:23 +00:00
# include "gstinfo.h"
# include "gstvalue.h"
2006-05-09 10:02:51 +00:00
# include "gstbuffer.h"
2003-11-24 02:09:23 +00:00
# include <gobject/gvaluecollector.h>
# include <string.h>
2005-12-06 19:29:15 +00:00
# define GST_TAG_IS_VALID(tag) (gst_tag_get_info (tag) != NULL)
2003-11-24 02:09:23 +00:00
2006-07-20 16:10:17 +00:00
/* FIXME 0.11: use GParamSpecs or something similar for tag registrations,
* possibly even gst_tag_register ( ) . Especially value ranges might be
* useful for some tags . */
2004-03-13 15:27:01 +00:00
typedef struct
{
2004-03-15 19:27:17 +00:00
GType type ; /* type the data is in */
2003-11-24 02:09:23 +00:00
2004-03-15 19:27:17 +00:00
gchar * nick ; /* translated name */
gchar * blurb ; /* translated description of type */
2003-11-24 02:09:23 +00:00
2004-03-15 19:27:17 +00:00
GstTagMergeFunc merge_func ; /* functions to merge the values */
GstTagFlag flag ; /* type of tag */
}
GstTagInfo ;
2003-11-24 02:09:23 +00:00
# define TAGLIST "taglist"
static GQuark gst_tag_list_quark ;
2008-06-20 08:39:54 +00:00
2003-11-24 02:09:23 +00:00
static GMutex * __tag_mutex ;
2008-06-20 08:39:54 +00:00
2003-11-24 02:09:23 +00:00
static GHashTable * __tags ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
# define TAG_LOCK g_mutex_lock (__tag_mutex)
# define TAG_UNLOCK g_mutex_unlock (__tag_mutex)
2004-02-18 05:26:59 +00:00
GType
gst_tag_list_get_type ( void )
{
2006-06-12 08:55:21 +00:00
static GType _gst_tag_list_type = 0 ;
2004-02-18 05:26:59 +00:00
2006-06-12 08:55:21 +00:00
if ( G_UNLIKELY ( _gst_tag_list_type = = 0 ) ) {
2004-02-18 05:26:59 +00:00
_gst_tag_list_type = g_boxed_type_register_static ( " GstTagList " ,
2004-03-15 19:27:17 +00:00
( GBoxedCopyFunc ) gst_tag_list_copy , ( GBoxedFreeFunc ) gst_tag_list_free ) ;
2004-02-18 05:26:59 +00:00
#if 0
2004-03-13 15:27:01 +00:00
g_value_register_transform_func ( _gst_tag_list_type , G_TYPE_STRING ,
2004-03-15 19:27:17 +00:00
_gst_structure_transform_to_string ) ;
2004-02-18 05:26:59 +00:00
# endif
}
return _gst_tag_list_type ;
}
2003-11-24 02:09:23 +00:00
void
_gst_tag_initialize ( void )
{
gst_tag_list_quark = g_quark_from_static_string ( TAGLIST ) ;
__tag_mutex = g_mutex_new ( ) ;
__tags = g_hash_table_new ( g_direct_hash , g_direct_equal ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_TITLE , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " title " ) , _ ( " commonly used title " ) , gst_tag_merge_strings_with_comma ) ;
2007-10-24 13:13:56 +00:00
gst_tag_register ( GST_TAG_TITLE_SORTNAME , GST_TAG_FLAG_META ,
G_TYPE_STRING ,
_ ( " title sortname " ) , _ ( " commonly used title for sorting purposes " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_ARTIST , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " artist " ) ,
_ ( " person(s) responsible for the recording " ) ,
gst_tag_merge_strings_with_comma ) ;
2007-10-24 13:13:56 +00:00
gst_tag_register ( GST_TAG_ARTIST_SORTNAME , GST_TAG_FLAG_META ,
G_TYPE_STRING ,
_ ( " artist sortname " ) ,
_ ( " person(s) responsible for the recording for sorting purposes " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_ALBUM , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " album " ) ,
_ ( " album containing this data " ) , gst_tag_merge_strings_with_comma ) ;
2007-10-24 13:13:56 +00:00
gst_tag_register ( GST_TAG_ALBUM_SORTNAME , GST_TAG_FLAG_META ,
G_TYPE_STRING ,
_ ( " album sortname " ) ,
_ ( " album containing this data for sorting purposes " ) , NULL ) ;
2005-10-13 15:13:32 +00:00
gst_tag_register ( GST_TAG_DATE , GST_TAG_FLAG_META , GST_TYPE_DATE ,
_ ( " date " ) , _ ( " date the data was created (as a GDate structure) " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_GENRE , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " genre " ) ,
_ ( " genre this data belongs to " ) , gst_tag_merge_strings_with_comma ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_COMMENT , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " comment " ) ,
2006-08-14 19:04:56 +00:00
_ ( " free text commenting the data " ) , gst_tag_merge_use_first ) ;
gst_tag_register ( GST_TAG_EXTENDED_COMMENT , GST_TAG_FLAG_META ,
G_TYPE_STRING ,
_ ( " extended comment " ) ,
_ ( " free text commenting the data in key=value or key[en]=comment form " ) ,
gst_tag_merge_use_first ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_TRACK_NUMBER , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT ,
_ ( " track number " ) ,
_ ( " track number inside a collection " ) , gst_tag_merge_use_first ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_TRACK_COUNT , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT ,
_ ( " track count " ) ,
_ ( " count of tracks inside collection this track belongs to " ) ,
gst_tag_merge_use_first ) ;
2004-02-22 15:09:20 +00:00
gst_tag_register ( GST_TAG_ALBUM_VOLUME_NUMBER , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT ,
_ ( " disc number " ) ,
_ ( " disc number inside a collection " ) , gst_tag_merge_use_first ) ;
2004-02-22 15:09:20 +00:00
gst_tag_register ( GST_TAG_ALBUM_VOLUME_COUNT , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT ,
_ ( " disc count " ) ,
_ ( " count of discs inside collection this disc belongs to " ) ,
gst_tag_merge_use_first ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_LOCATION , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " location " ) ,
2008-09-01 13:35:32 +00:00
_
( " Origin of media as a URI (location, where the original of the file or stream is hosted) " ) ,
2004-03-13 15:27:01 +00:00
gst_tag_merge_strings_with_comma ) ;
2009-02-12 09:38:05 +00:00
gst_tag_register ( GST_TAG_HOMEPAGE , GST_TAG_FLAG_META ,
G_TYPE_STRING ,
_ ( " homepage " ) ,
_
( " Homepage for this media (i.e. artist or movie homepage) " ) ,
gst_tag_merge_strings_with_comma ) ;
2008-09-01 13:35:32 +00:00
gst_tag_register ( GST_TAG_DESCRIPTION , GST_TAG_FLAG_META , G_TYPE_STRING ,
_ ( " description " ) , _ ( " short text describing the content of the data " ) ,
2004-03-13 15:27:01 +00:00
gst_tag_merge_strings_with_comma ) ;
2008-09-01 13:35:32 +00:00
gst_tag_register ( GST_TAG_VERSION , GST_TAG_FLAG_META , G_TYPE_STRING ,
_ ( " version " ) , _ ( " version of this data " ) , NULL ) ;
gst_tag_register ( GST_TAG_ISRC , GST_TAG_FLAG_META , G_TYPE_STRING , _ ( " ISRC " ) ,
2004-03-13 15:27:01 +00:00
_
( " International Standard Recording Code - see http://www.ifpi.org/isrc/ " ) ,
NULL ) ;
2004-03-15 19:27:17 +00:00
gst_tag_register ( GST_TAG_ORGANIZATION , GST_TAG_FLAG_META , G_TYPE_STRING , _ ( " organization " ) , _ ( " organization " ) , /* FIXME */
2004-03-13 15:27:01 +00:00
gst_tag_merge_strings_with_comma ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_COPYRIGHT , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING , _ ( " copyright " ) , _ ( " copyright notice of the data " ) , NULL ) ;
2007-07-26 15:48:40 +00:00
gst_tag_register ( GST_TAG_COPYRIGHT_URI , GST_TAG_FLAG_META ,
G_TYPE_STRING , _ ( " copyright uri " ) ,
_ ( " URI to the copyright notice of the data " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_CONTACT , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " contact " ) , _ ( " contact information " ) , gst_tag_merge_strings_with_comma ) ;
2004-02-22 21:56:00 +00:00
gst_tag_register ( GST_TAG_LICENSE , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING , _ ( " license " ) , _ ( " license of data " ) , NULL ) ;
2007-07-26 15:48:40 +00:00
gst_tag_register ( GST_TAG_LICENSE_URI , GST_TAG_FLAG_META ,
G_TYPE_STRING , _ ( " license uri " ) ,
_ ( " URI to the license of the data " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_PERFORMER , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " performer " ) ,
_ ( " person(s) performing " ) , gst_tag_merge_strings_with_comma ) ;
2007-09-25 18:35:39 +00:00
gst_tag_register ( GST_TAG_COMPOSER , GST_TAG_FLAG_META ,
G_TYPE_STRING ,
_ ( " composer " ) ,
_ ( " person(s) who composed the recording " ) ,
gst_tag_merge_strings_with_comma ) ;
2004-01-23 13:18:46 +00:00
gst_tag_register ( GST_TAG_DURATION , GST_TAG_FLAG_DECODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT64 ,
_ ( " duration " ) , _ ( " length in GStreamer time units (nanoseconds) " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_CODEC , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " codec " ) ,
_ ( " codec the data is stored in " ) , gst_tag_merge_strings_with_comma ) ;
2004-02-22 21:56:00 +00:00
gst_tag_register ( GST_TAG_VIDEO_CODEC , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " video codec " ) , _ ( " codec the video data is stored in " ) , NULL ) ;
2004-02-22 21:56:00 +00:00
gst_tag_register ( GST_TAG_AUDIO_CODEC , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " audio codec " ) , _ ( " codec the audio data is stored in " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_BITRATE , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT , _ ( " bitrate " ) , _ ( " exact or average bitrate in bits/s " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_NOMINAL_BITRATE , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT , _ ( " nominal bitrate " ) , _ ( " nominal bitrate in bits/s " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_MINIMUM_BITRATE , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT , _ ( " minimum bitrate " ) , _ ( " minimum bitrate in bits/s " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_MAXIMUM_BITRATE , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT , _ ( " maximum bitrate " ) , _ ( " maximum bitrate in bits/s " ) , NULL ) ;
2004-01-31 11:17:43 +00:00
gst_tag_register ( GST_TAG_ENCODER , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_STRING ,
_ ( " encoder " ) , _ ( " encoder used to encode this stream " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_ENCODER_VERSION , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT ,
_ ( " encoder version " ) ,
_ ( " version of the encoder used to encode this stream " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_SERIAL , GST_TAG_FLAG_ENCODED ,
2004-03-13 15:27:01 +00:00
G_TYPE_UINT , _ ( " serial " ) , _ ( " serial number of track " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_TRACK_GAIN , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_DOUBLE , _ ( " replaygain track gain " ) , _ ( " track gain in db " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_TRACK_PEAK , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_DOUBLE , _ ( " replaygain track peak " ) , _ ( " peak of the track " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_ALBUM_GAIN , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_DOUBLE , _ ( " replaygain album gain " ) , _ ( " album gain in db " ) , NULL ) ;
2004-01-22 13:59:57 +00:00
gst_tag_register ( GST_TAG_ALBUM_PEAK , GST_TAG_FLAG_META ,
2004-03-13 15:27:01 +00:00
G_TYPE_DOUBLE , _ ( " replaygain album peak " ) , _ ( " peak of the album " ) , NULL ) ;
2007-02-12 10:50:20 +00:00
gst_tag_register ( GST_TAG_REFERENCE_LEVEL , GST_TAG_FLAG_META ,
G_TYPE_DOUBLE , _ ( " replaygain reference level " ) ,
_ ( " reference level of track and album gain values " ) , NULL ) ;
2005-08-13 10:33:22 +00:00
gst_tag_register ( GST_TAG_LANGUAGE_CODE , GST_TAG_FLAG_META , G_TYPE_STRING ,
_ ( " language code " ) ,
_ ( " language code for this stream, conforming to ISO-639-1 " ) , NULL ) ;
2006-05-09 10:02:51 +00:00
gst_tag_register ( GST_TAG_IMAGE , GST_TAG_FLAG_META , GST_TYPE_BUFFER ,
2006-07-24 16:33:31 +00:00
_ ( " image " ) , _ ( " image related to this stream " ) , gst_tag_merge_use_first ) ;
2006-05-30 10:12:02 +00:00
gst_tag_register ( GST_TAG_PREVIEW_IMAGE , GST_TAG_FLAG_META , GST_TYPE_BUFFER ,
_ ( " preview image " ) , _ ( " preview image related to this stream " ) , NULL ) ;
2008-06-20 08:39:54 +00:00
gst_tag_register ( GST_TAG_ATTACHMENT , GST_TAG_FLAG_META , GST_TYPE_BUFFER ,
_ ( " attachment " ) , _ ( " file attached to this stream " ) ,
gst_tag_merge_use_first ) ;
2007-01-15 14:39:51 +00:00
gst_tag_register ( GST_TAG_BEATS_PER_MINUTE , GST_TAG_FLAG_META , G_TYPE_DOUBLE ,
2007-01-15 13:57:12 +00:00
_ ( " beats per minute " ) , _ ( " number of beats per minute in audio " ) , NULL ) ;
2008-08-04 12:30:26 +00:00
gst_tag_register ( GST_TAG_KEYWORDS , GST_TAG_FLAG_META , G_TYPE_STRING ,
_ ( " keywords " ) , _ ( " comma separated keywords describing the content " ) ,
2008-08-04 13:01:35 +00:00
gst_tag_merge_strings_with_comma ) ;
2008-09-01 13:35:32 +00:00
gst_tag_register ( GST_TAG_GEO_LOCATION_NAME , GST_TAG_FLAG_META , G_TYPE_STRING ,
_ ( " geo location name " ) ,
_
( " human readable descriptive location or where the media has been recorded or produced " ) ,
NULL ) ;
gst_tag_register ( GST_TAG_GEO_LOCATION_LATITUDE , GST_TAG_FLAG_META ,
G_TYPE_DOUBLE , _ ( " geo location latitude " ) ,
_
( " geo latitude location of where the media has been recorded or produced in degrees according to WGS84 (zero at the equator, negative values for southern latitudes) " ) ,
NULL ) ;
gst_tag_register ( GST_TAG_GEO_LOCATION_LONGITUDE , GST_TAG_FLAG_META ,
G_TYPE_DOUBLE , _ ( " geo location longitude " ) ,
_
( " geo longitude location of where the media has been recorded or produced in degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, negative values for western longitudes) " ) ,
NULL ) ;
gst_tag_register ( GST_TAG_GEO_LOCATION_ELEVATION , GST_TAG_FLAG_META ,
G_TYPE_DOUBLE , _ ( " geo location elevation " ) ,
_
( " geo elevation of where the media has been recorded or produced in meters according to WGS84 (zero is average sea level) " ) ,
NULL ) ;
2003-11-24 02:09:23 +00:00
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_merge_use_first :
* @ dest : uninitialized GValue to store result in
* @ src : GValue to copy from
*
2005-06-19 11:32:42 +00:00
* This is a convenience function for the func argument of gst_tag_register ( ) .
2003-11-24 02:09:23 +00:00
* It creates a copy of the first value from the list .
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_merge_use_first ( GValue * dest , const GValue * src )
2003-11-24 02:09:23 +00:00
{
const GValue * ret = gst_value_list_get_value ( src , 0 ) ;
g_value_init ( dest , G_VALUE_TYPE ( ret ) ) ;
g_value_copy ( ret , dest ) ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_merge_strings_with_comma :
* @ dest : uninitialized GValue to store result in
* @ src : GValue to copy from
2005-06-19 11:32:42 +00:00
*
2003-11-24 02:09:23 +00:00
* This is a convenience function for the func argument of gst_tag_register ( ) .
* It concatenates all given strings using a comma . The tag must be registered
* as a G_TYPE_STRING or this function will fail .
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_merge_strings_with_comma ( GValue * dest , const GValue * src )
2003-11-24 02:09:23 +00:00
{
GString * str ;
2008-06-20 08:39:54 +00:00
2003-11-24 02:09:23 +00:00
gint i , count ;
count = gst_value_list_get_size ( src ) ;
str = g_string_new ( g_value_get_string ( gst_value_list_get_value ( src , 0 ) ) ) ;
for ( i = 1 ; i < count ; i + + ) {
/* seperator between two string */
str = g_string_append ( str , _ ( " , " ) ) ;
2004-03-13 15:27:01 +00:00
str =
2004-03-15 19:27:17 +00:00
g_string_append ( str , g_value_get_string ( gst_value_list_get_value ( src ,
1 ) ) ) ;
2003-11-24 02:09:23 +00:00
}
g_value_init ( dest , G_TYPE_STRING ) ;
2008-04-19 16:05:58 +00:00
g_value_take_string ( dest , str - > str ) ;
2003-11-24 02:09:23 +00:00
g_string_free ( str , FALSE ) ;
}
2008-06-20 08:39:54 +00:00
2003-11-24 02:09:23 +00:00
static GstTagInfo *
gst_tag_lookup ( GQuark entry )
{
GstTagInfo * ret ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
TAG_LOCK ;
ret = g_hash_table_lookup ( __tags , GUINT_TO_POINTER ( entry ) ) ;
TAG_UNLOCK ;
return ret ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_register :
* @ name : the name or identifier string
2004-01-22 13:59:57 +00:00
* @ flag : a flag describing the type of tag info
2003-11-24 02:09:23 +00:00
* @ type : the type this data is in
* @ nick : human - readable name
* @ blurb : a human - readable description about this tag
2006-07-20 16:10:17 +00:00
* @ func : function for merging multiple values of this tag , or NULL
2003-11-24 02:09:23 +00:00
*
* Registers a new tag type for the use with GStreamer ' s type system . If a type
* with that name is already registered , that one is used .
* The old registration may have used a different type however . So don ' t rely
2004-01-22 13:59:57 +00:00
* on your supplied values .
2006-07-20 16:10:17 +00:00
*
* Important : if you do not supply a merge function the implication will be
* that there can only be one single value for this tag in a tag list and
* any additional values will silenty be discarded when being added ( unless
* # GST_TAG_MERGE_REPLACE , # GST_TAG_MERGE_REPLACE_ALL , or
* # GST_TAG_MERGE_PREPEND is used as merge mode , in which case the new
2007-07-10 20:10:16 +00:00
* value will replace the old one in the list ) .
2006-07-20 16:10:17 +00:00
*
* The merge function will be called from gst_tag_list_copy_value ( ) when
* it is required that one or more values for a tag be condensed into
* one single value . This may happen from gst_tag_list_get_string ( ) ,
* gst_tag_list_get_int ( ) , gst_tag_list_get_double ( ) etc . What will happen
* exactly in that case depends on how the tag was registered and if a
* merge function was supplied and if so which one .
*
* Two default merge functions are provided : gst_tag_merge_use_first ( ) and
* gst_tag_merge_strings_with_commas ( ) .
2003-11-24 02:09:23 +00:00
*/
void
2004-04-13 02:22:02 +00:00
gst_tag_register ( const gchar * name , GstTagFlag flag , GType type ,
const gchar * nick , const gchar * blurb , GstTagMergeFunc func )
2003-11-24 02:09:23 +00:00
{
GQuark key ;
2008-06-20 08:39:54 +00:00
2003-11-24 02:09:23 +00:00
GstTagInfo * info ;
g_return_if_fail ( name ! = NULL ) ;
g_return_if_fail ( nick ! = NULL ) ;
g_return_if_fail ( blurb ! = NULL ) ;
2003-11-29 06:31:10 +00:00
g_return_if_fail ( type ! = 0 & & type ! = GST_TYPE_LIST ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
key = g_quark_from_string ( name ) ;
info = gst_tag_lookup ( key ) ;
2005-08-13 10:33:22 +00:00
if ( info ) {
g_return_if_fail ( info - > type = = type ) ;
return ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
info = g_new ( GstTagInfo , 1 ) ;
2004-01-22 13:59:57 +00:00
info - > flag = flag ;
2003-11-24 02:09:23 +00:00
info - > type = type ;
2004-04-13 02:22:02 +00:00
info - > nick = g_strdup ( nick ) ;
info - > blurb = g_strdup ( blurb ) ;
2003-11-24 02:09:23 +00:00
info - > merge_func = func ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
TAG_LOCK ;
g_hash_table_insert ( __tags , GUINT_TO_POINTER ( key ) , info ) ;
TAG_UNLOCK ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_exists :
* @ tag : name of the tag
*
* Checks if the given type is already registered .
*
* Returns : TRUE if the type is already registered
*/
gboolean
2004-03-13 15:27:01 +00:00
gst_tag_exists ( const gchar * tag )
2003-11-24 02:09:23 +00:00
{
g_return_val_if_fail ( tag ! = NULL , FALSE ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
return gst_tag_lookup ( g_quark_from_string ( tag ) ) ! = NULL ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_get_type :
* @ tag : the tag
*
* Gets the # GType used for this tag .
*
* Returns : the # GType of this tag
*/
GType
2004-03-13 15:27:01 +00:00
gst_tag_get_type ( const gchar * tag )
2003-11-24 02:09:23 +00:00
{
GstTagInfo * info ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
g_return_val_if_fail ( tag ! = NULL , 0 ) ;
info = gst_tag_lookup ( g_quark_from_string ( tag ) ) ;
g_return_val_if_fail ( info ! = NULL , 0 ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
return info - > type ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_get_nick
* @ tag : the tag
*
2005-06-19 11:32:42 +00:00
* Returns the human - readable name of this tag , You must not change or free
2003-11-24 02:09:23 +00:00
* this string .
*
* Returns : the human - readable name of this tag
*/
const gchar *
2004-03-13 15:27:01 +00:00
gst_tag_get_nick ( const gchar * tag )
2003-11-24 02:09:23 +00:00
{
GstTagInfo * info ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
g_return_val_if_fail ( tag ! = NULL , NULL ) ;
info = gst_tag_lookup ( g_quark_from_string ( tag ) ) ;
g_return_val_if_fail ( info ! = NULL , NULL ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
return info - > nick ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_get_description :
* @ tag : the tag
*
2005-06-19 11:32:42 +00:00
* Returns the human - readable description of this tag , You must not change or
2003-11-24 02:09:23 +00:00
* free this string .
*
2004-09-02 14:24:22 +00:00
* Returns : the human - readable description of this tag
2003-11-24 02:09:23 +00:00
*/
const gchar *
2004-03-13 15:27:01 +00:00
gst_tag_get_description ( const gchar * tag )
2003-11-24 02:09:23 +00:00
{
GstTagInfo * info ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
g_return_val_if_fail ( tag ! = NULL , NULL ) ;
info = gst_tag_lookup ( g_quark_from_string ( tag ) ) ;
g_return_val_if_fail ( info ! = NULL , NULL ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
return info - > blurb ;
}
2004-03-06 20:19:23 +00:00
/**
* gst_tag_get_flag :
* @ tag : the tag
*
2004-03-26 03:46:16 +00:00
* Gets the flag of @ tag .
*
2007-07-10 20:10:16 +00:00
* Returns : the flag of this tag .
2004-03-06 20:19:23 +00:00
*/
GstTagFlag
2004-03-13 15:27:01 +00:00
gst_tag_get_flag ( const gchar * tag )
2004-03-06 20:19:23 +00:00
{
GstTagInfo * info ;
g_return_val_if_fail ( tag ! = NULL , GST_TAG_FLAG_UNDEFINED ) ;
info = gst_tag_lookup ( g_quark_from_string ( tag ) ) ;
g_return_val_if_fail ( info ! = NULL , GST_TAG_FLAG_UNDEFINED ) ;
return info - > flag ;
}
2003-11-24 02:09:23 +00:00
/**
2004-03-26 03:46:16 +00:00
* gst_tag_is_fixed :
2003-11-24 02:09:23 +00:00
* @ tag : tag to check
*
* Checks if the given tag is fixed . A fixed tag can only contain one value .
* Unfixed tags can contain lists of values .
*
* Returns : TRUE , if the given tag is fixed .
*/
gboolean
2004-03-13 15:27:01 +00:00
gst_tag_is_fixed ( const gchar * tag )
2003-11-24 02:09:23 +00:00
{
GstTagInfo * info ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
g_return_val_if_fail ( tag ! = NULL , FALSE ) ;
info = gst_tag_lookup ( g_quark_from_string ( tag ) ) ;
g_return_val_if_fail ( info ! = NULL , FALSE ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
return info - > merge_func = = NULL ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_new :
*
* Creates a new empty GstTagList .
*
* Returns : An empty tag list
*/
GstTagList *
gst_tag_list_new ( void )
{
return GST_TAG_LIST ( gst_structure_new ( TAGLIST , NULL ) ) ;
}
2004-03-13 15:27:01 +00:00
2006-10-09 11:20:44 +00:00
/**
* gst_tag_list_is_empty :
2006-10-09 17:15:39 +00:00
* @ list : A # GstTagList .
2006-10-09 11:20:44 +00:00
*
* Checks if the given taglist is empty .
*
* Returns : TRUE if the taglist is empty , otherwise FALSE .
*
* Since : 0.10 .11
*/
gboolean
2006-10-09 17:15:39 +00:00
gst_tag_list_is_empty ( const GstTagList * list )
2006-10-09 11:20:44 +00:00
{
2006-10-09 17:15:39 +00:00
g_return_val_if_fail ( list ! = NULL , FALSE ) ;
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , FALSE ) ;
2006-10-09 11:20:44 +00:00
2006-10-09 17:15:39 +00:00
return ( gst_structure_n_fields ( ( GstStructure * ) list ) = = 0 ) ;
2006-10-09 11:20:44 +00:00
}
2003-11-24 02:09:23 +00:00
/**
* gst_is_tag_list :
* @ p : Object that might be a taglist
*
* Checks if the given pointer is a taglist .
*
* Returns : TRUE , if the given pointer is a taglist
*/
gboolean
gst_is_tag_list ( gconstpointer p )
{
2006-10-07 18:41:19 +00:00
GstStructure * s = ( GstStructure * ) p ;
2004-03-13 15:27:01 +00:00
g_return_val_if_fail ( p ! = NULL , FALSE ) ;
2003-11-24 02:09:23 +00:00
2006-10-07 18:41:19 +00:00
return ( GST_IS_STRUCTURE ( s ) & & s - > name = = gst_tag_list_quark ) ;
2003-11-24 02:09:23 +00:00
}
2008-06-20 08:39:54 +00:00
2004-03-13 15:27:01 +00:00
typedef struct
{
GstStructure * list ;
GstTagMergeMode mode ;
2004-03-15 19:27:17 +00:00
}
GstTagCopyData ;
2008-06-20 08:39:54 +00:00
2003-11-24 02:09:23 +00:00
static void
2004-03-13 15:27:01 +00:00
gst_tag_list_add_value_internal ( GstStructure * list , GstTagMergeMode mode ,
2005-03-07 18:27:42 +00:00
GQuark tag , const GValue * value )
2003-11-24 02:09:23 +00:00
{
GstTagInfo * info = gst_tag_lookup ( tag ) ;
2008-06-20 08:39:54 +00:00
2003-12-22 01:39:35 +00:00
const GValue * value2 ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
g_assert ( info ! = NULL ) ;
2004-03-13 15:27:01 +00:00
if ( info - > merge_func
& & ( value2 = gst_structure_id_get_value ( list , tag ) ) ! = NULL ) {
2003-12-22 01:39:35 +00:00
GValue dest = { 0 , } ;
2004-03-15 19:27:17 +00:00
2003-11-24 02:09:23 +00:00
switch ( mode ) {
case GST_TAG_MERGE_REPLACE_ALL :
case GST_TAG_MERGE_REPLACE :
2004-03-15 19:27:17 +00:00
gst_structure_id_set_value ( list , tag , value ) ;
break ;
2003-11-24 02:09:23 +00:00
case GST_TAG_MERGE_PREPEND :
2004-03-15 19:27:17 +00:00
gst_value_list_concat ( & dest , value , value2 ) ;
gst_structure_id_set_value ( list , tag , & dest ) ;
g_value_unset ( & dest ) ;
break ;
2003-11-24 02:09:23 +00:00
case GST_TAG_MERGE_APPEND :
2004-03-15 19:27:17 +00:00
gst_value_list_concat ( & dest , value2 , value ) ;
gst_structure_id_set_value ( list , tag , & dest ) ;
g_value_unset ( & dest ) ;
break ;
2003-11-24 02:09:23 +00:00
case GST_TAG_MERGE_KEEP :
case GST_TAG_MERGE_KEEP_ALL :
2004-03-15 19:27:17 +00:00
break ;
2003-11-24 02:09:23 +00:00
default :
2004-03-15 19:27:17 +00:00
g_assert_not_reached ( ) ;
break ;
2003-11-24 02:09:23 +00:00
}
} else {
switch ( mode ) {
case GST_TAG_MERGE_APPEND :
case GST_TAG_MERGE_KEEP :
2004-03-15 19:27:17 +00:00
if ( gst_structure_id_get_value ( list , tag ) ! = NULL )
break ;
/* fall through */
2003-11-24 02:09:23 +00:00
case GST_TAG_MERGE_REPLACE_ALL :
case GST_TAG_MERGE_REPLACE :
case GST_TAG_MERGE_PREPEND :
2004-03-15 19:27:17 +00:00
gst_structure_id_set_value ( list , tag , value ) ;
break ;
2003-11-24 02:09:23 +00:00
case GST_TAG_MERGE_KEEP_ALL :
2004-03-15 19:27:17 +00:00
break ;
2003-11-24 02:09:23 +00:00
default :
2004-03-15 19:27:17 +00:00
g_assert_not_reached ( ) ;
break ;
2003-11-24 02:09:23 +00:00
}
}
}
2008-06-20 08:39:54 +00:00
2003-12-22 01:39:35 +00:00
static gboolean
2005-03-07 18:27:42 +00:00
gst_tag_list_copy_foreach ( GQuark tag , const GValue * value , gpointer user_data )
2003-11-24 02:09:23 +00:00
{
GstTagCopyData * copy = ( GstTagCopyData * ) user_data ;
gst_tag_list_add_value_internal ( copy - > list , copy - > mode , tag , value ) ;
2003-12-22 01:39:35 +00:00
return TRUE ;
2003-11-24 02:09:23 +00:00
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_insert :
* @ into : list to merge into
* @ from : list to merge from
* @ mode : the mode to use
2005-06-19 11:32:42 +00:00
*
2008-12-16 09:23:21 +00:00
* Inserts the tags of the @ from list into the first list using the given mode .
2003-11-24 02:09:23 +00:00
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_list_insert ( GstTagList * into , const GstTagList * from ,
GstTagMergeMode mode )
2003-11-24 02:09:23 +00:00
{
GstTagCopyData data ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
g_return_if_fail ( GST_IS_TAG_LIST ( into ) ) ;
g_return_if_fail ( GST_IS_TAG_LIST ( from ) ) ;
g_return_if_fail ( GST_TAG_MODE_IS_VALID ( mode ) ) ;
data . list = ( GstStructure * ) into ;
data . mode = mode ;
if ( mode = = GST_TAG_MERGE_REPLACE_ALL ) {
gst_structure_remove_all_fields ( data . list ) ;
}
2004-03-13 15:27:01 +00:00
gst_structure_foreach ( ( GstStructure * ) from , gst_tag_list_copy_foreach ,
& data ) ;
2003-11-24 02:09:23 +00:00
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_copy :
* @ list : list to copy
*
* Copies a given # GstTagList .
*
* Returns : copy of the given list
*/
GstTagList *
2004-03-13 15:27:01 +00:00
gst_tag_list_copy ( const GstTagList * list )
2003-11-24 02:09:23 +00:00
{
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , NULL ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
return GST_TAG_LIST ( gst_structure_copy ( ( GstStructure * ) list ) ) ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_merge :
* @ list1 : first list to merge
* @ list2 : second list to merge
* @ mode : the mode to use
2005-10-15 15:30:24 +00:00
*
2003-11-24 02:09:23 +00:00
* Merges the two given lists into a new list . If one of the lists is NULL , a
* copy of the other is returned . If both lists are NULL , NULL is returned .
*
* Returns : the new list
*/
GstTagList *
2004-03-13 15:27:01 +00:00
gst_tag_list_merge ( const GstTagList * list1 , const GstTagList * list2 ,
GstTagMergeMode mode )
2003-11-24 02:09:23 +00:00
{
2008-12-16 09:37:53 +00:00
GstTagList * list1_cp ;
const GstTagList * list2_cp ;
2008-12-16 09:23:21 +00:00
2003-11-24 02:09:23 +00:00
g_return_val_if_fail ( list1 = = NULL | | GST_IS_TAG_LIST ( list1 ) , NULL ) ;
g_return_val_if_fail ( list2 = = NULL | | GST_IS_TAG_LIST ( list2 ) , NULL ) ;
g_return_val_if_fail ( GST_TAG_MODE_IS_VALID ( mode ) , NULL ) ;
2008-12-16 09:23:21 +00:00
/* nothing to merge */
2003-11-24 02:09:23 +00:00
if ( ! list1 & & ! list2 ) {
return NULL ;
}
2008-12-16 09:23:21 +00:00
/* create empty list, we need to do this to correctly handling merge modes */
2008-12-16 09:37:53 +00:00
list1_cp = ( list1 ) ? gst_tag_list_copy ( list1 ) : gst_tag_list_new ( ) ;
2008-12-16 09:23:21 +00:00
list2_cp = ( list2 ) ? list2 : gst_tag_list_new ( ) ;
2008-12-16 09:37:53 +00:00
gst_tag_list_insert ( list1_cp , list2_cp , mode ) ;
2008-12-16 09:23:21 +00:00
if ( ! list2 )
gst_tag_list_free ( ( GstTagList * ) list2_cp ) ;
2008-12-16 09:37:53 +00:00
return list1_cp ;
2003-11-24 02:09:23 +00:00
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_free :
* @ list : the list to free
*
* Frees the given list and all associated values .
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_list_free ( GstTagList * list )
2003-11-24 02:09:23 +00:00
{
g_return_if_fail ( GST_IS_TAG_LIST ( list ) ) ;
gst_structure_free ( ( GstStructure * ) list ) ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_get_tag_size :
* @ list : a taglist
* @ tag : the tag to query
*
* Checks how many value are stored in this tag list for the given tag .
*
* Returns : The number of tags stored
*/
guint
2004-03-13 15:27:01 +00:00
gst_tag_list_get_tag_size ( const GstTagList * list , const gchar * tag )
2003-11-24 02:09:23 +00:00
{
const GValue * value ;
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , 0 ) ;
value = gst_structure_get_value ( ( GstStructure * ) list , tag ) ;
if ( value = = NULL )
return 0 ;
2003-11-29 06:31:10 +00:00
if ( G_VALUE_TYPE ( value ) ! = GST_TYPE_LIST )
2003-11-24 02:09:23 +00:00
return 1 ;
return gst_value_list_get_size ( value ) ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_add :
* @ list : list to set tags in
* @ mode : the mode to use
* @ tag : tag
2004-01-15 20:33:53 +00:00
* @ . . . : NULL - terminated list of values to set
2003-11-24 02:09:23 +00:00
*
* Sets the values for the given tags using the specified mode .
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_list_add ( GstTagList * list , GstTagMergeMode mode , const gchar * tag ,
. . . )
2003-11-24 02:09:23 +00:00
{
va_list args ;
g_return_if_fail ( GST_IS_TAG_LIST ( list ) ) ;
g_return_if_fail ( GST_TAG_MODE_IS_VALID ( mode ) ) ;
g_return_if_fail ( tag ! = NULL ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
va_start ( args , tag ) ;
gst_tag_list_add_valist ( list , mode , tag , args ) ;
va_end ( args ) ;
}
2004-03-13 15:27:01 +00:00
2003-12-23 04:50:01 +00:00
/**
* gst_tag_list_add_values :
* @ list : list to set tags in
* @ mode : the mode to use
* @ tag : tag
* @ . . . : GValues to set
*
* Sets the GValues for the given tags using the specified mode .
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_list_add_values ( GstTagList * list , GstTagMergeMode mode ,
const gchar * tag , . . . )
2003-12-23 04:50:01 +00:00
{
va_list args ;
g_return_if_fail ( GST_IS_TAG_LIST ( list ) ) ;
g_return_if_fail ( GST_TAG_MODE_IS_VALID ( mode ) ) ;
g_return_if_fail ( tag ! = NULL ) ;
2004-03-13 15:27:01 +00:00
2003-12-23 04:50:01 +00:00
va_start ( args , tag ) ;
gst_tag_list_add_valist_values ( list , mode , tag , args ) ;
va_end ( args ) ;
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_add_valist :
* @ list : list to set tags in
* @ mode : the mode to use
* @ tag : tag
* @ var_args : tag / value pairs to set
*
* Sets the values for the given tags using the specified mode .
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_list_add_valist ( GstTagList * list , GstTagMergeMode mode ,
const gchar * tag , va_list var_args )
2003-11-24 02:09:23 +00:00
{
GstTagInfo * info ;
GQuark quark ;
gchar * error = NULL ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
g_return_if_fail ( GST_IS_TAG_LIST ( list ) ) ;
g_return_if_fail ( GST_TAG_MODE_IS_VALID ( mode ) ) ;
g_return_if_fail ( tag ! = NULL ) ;
2004-03-13 15:27:01 +00:00
2008-12-16 09:23:21 +00:00
if ( mode = = GST_TAG_MERGE_REPLACE_ALL ) {
gst_structure_remove_all_fields ( list ) ;
}
2003-11-24 02:09:23 +00:00
while ( tag ! = NULL ) {
GValue value = { 0 , } ;
2004-03-15 19:27:17 +00:00
2003-11-24 02:09:23 +00:00
quark = g_quark_from_string ( tag ) ;
info = gst_tag_lookup ( quark ) ;
2004-01-20 13:37:10 +00:00
if ( info = = NULL )
g_warning ( " no GstTag for %s " , tag ) ;
2003-11-24 02:09:23 +00:00
g_return_if_fail ( info ! = NULL ) ;
g_value_init ( & value , info - > type ) ;
G_VALUE_COLLECT ( & value , var_args , 0 , & error ) ;
if ( error ) {
g_warning ( " %s: %s " , G_STRLOC , error ) ;
g_free ( error ) ;
/* we purposely leak the value here, it might not be
* in a sane state if an error condition occoured
*/
return ;
}
gst_tag_list_add_value_internal ( list , mode , quark , & value ) ;
g_value_unset ( & value ) ;
tag = va_arg ( var_args , gchar * ) ;
2003-12-23 04:50:01 +00:00
}
}
2004-03-13 15:27:01 +00:00
2003-12-23 04:50:01 +00:00
/**
* gst_tag_list_add_valist_values :
* @ list : list to set tags in
* @ mode : the mode to use
* @ tag : tag
* @ var_args : tag / GValue pairs to set
*
* Sets the GValues for the given tags using the specified mode .
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_list_add_valist_values ( GstTagList * list , GstTagMergeMode mode ,
const gchar * tag , va_list var_args )
2003-12-23 04:50:01 +00:00
{
GstTagInfo * info ;
GQuark quark ;
2004-03-13 15:27:01 +00:00
2003-12-23 04:50:01 +00:00
g_return_if_fail ( GST_IS_TAG_LIST ( list ) ) ;
g_return_if_fail ( GST_TAG_MODE_IS_VALID ( mode ) ) ;
g_return_if_fail ( tag ! = NULL ) ;
2004-03-13 15:27:01 +00:00
2003-12-23 04:50:01 +00:00
while ( tag ! = NULL ) {
quark = g_quark_from_string ( tag ) ;
info = gst_tag_lookup ( quark ) ;
g_return_if_fail ( info ! = NULL ) ;
2004-03-13 15:27:01 +00:00
gst_tag_list_add_value_internal ( list , mode , quark , va_arg ( var_args ,
2004-03-15 19:27:17 +00:00
GValue * ) ) ;
2003-12-23 04:50:01 +00:00
tag = va_arg ( var_args , gchar * ) ;
2003-11-24 02:09:23 +00:00
}
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_remove_tag :
* @ list : list to remove tag from
* @ tag : tag to remove
*
2006-07-20 16:10:17 +00:00
* Removes the given tag from the taglist .
2003-11-24 02:09:23 +00:00
*/
void
2004-03-13 15:27:01 +00:00
gst_tag_list_remove_tag ( GstTagList * list , const gchar * tag )
2003-11-24 02:09:23 +00:00
{
g_return_if_fail ( GST_IS_TAG_LIST ( list ) ) ;
g_return_if_fail ( tag ! = NULL ) ;
gst_structure_remove_field ( ( GstStructure * ) list , tag ) ;
}
2008-06-20 08:39:54 +00:00
2004-03-13 15:27:01 +00:00
typedef struct
{
GstTagForeachFunc func ;
2005-11-19 16:05:11 +00:00
const GstTagList * tag_list ;
2004-03-13 15:27:01 +00:00
gpointer data ;
2004-03-15 19:27:17 +00:00
}
TagForeachData ;
2008-06-20 08:39:54 +00:00
2003-12-22 01:39:35 +00:00
static int
2005-03-07 18:27:42 +00:00
structure_foreach_wrapper ( GQuark field_id , const GValue * value ,
gpointer user_data )
2003-11-24 02:09:23 +00:00
{
TagForeachData * data = ( TagForeachData * ) user_data ;
2004-03-13 15:27:01 +00:00
2003-12-22 01:39:35 +00:00
data - > func ( data - > tag_list , g_quark_to_string ( field_id ) , data - > data ) ;
return TRUE ;
2003-11-24 02:09:23 +00:00
}
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
/**
* gst_tag_list_foreach :
* @ list : list to iterate over
* @ func : function to be called for each tag
* @ user_data : user specified data
*
* Calls the given function for each tag inside the tag list . Note that if there
* is no tag , the function won ' t be called at all .
*/
void
2005-11-19 15:51:41 +00:00
gst_tag_list_foreach ( const GstTagList * list , GstTagForeachFunc func ,
2004-03-13 15:27:01 +00:00
gpointer user_data )
2003-11-24 02:09:23 +00:00
{
TagForeachData data ;
g_return_if_fail ( GST_IS_TAG_LIST ( list ) ) ;
g_return_if_fail ( func ! = NULL ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
data . func = func ;
2003-12-22 01:39:35 +00:00
data . tag_list = list ;
2003-11-24 02:09:23 +00:00
data . data = user_data ;
2004-03-13 15:27:01 +00:00
gst_structure_foreach ( ( GstStructure * ) list , structure_foreach_wrapper ,
& data ) ;
2003-11-24 02:09:23 +00:00
}
/**
* gst_tag_list_get_value_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList
2003-11-24 02:09:23 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
*
2005-06-19 11:32:42 +00:00
* Gets the value that is at the given index for the given tag in the given
2003-11-24 02:09:23 +00:00
* list .
2005-06-19 11:32:42 +00:00
*
* Returns : The GValue for the specified entry or NULL if the tag wasn ' t
* available or the tag doesn ' t have as many entries
2003-11-24 02:09:23 +00:00
*/
G_CONST_RETURN GValue *
2004-03-13 15:27:01 +00:00
gst_tag_list_get_value_index ( const GstTagList * list , const gchar * tag ,
guint index )
2003-11-24 02:09:23 +00:00
{
const GValue * value ;
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , NULL ) ;
g_return_val_if_fail ( tag ! = NULL , NULL ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
value = gst_structure_get_value ( ( GstStructure * ) list , tag ) ;
2004-03-13 15:27:01 +00:00
if ( value = = NULL )
return NULL ;
2003-11-24 02:09:23 +00:00
if ( GST_VALUE_HOLDS_LIST ( value ) ) {
2004-03-13 15:27:01 +00:00
if ( index > = gst_value_list_get_size ( value ) )
return NULL ;
2003-11-24 02:09:23 +00:00
return gst_value_list_get_value ( value , index ) ;
} else {
2004-03-13 15:27:01 +00:00
if ( index > 0 )
return NULL ;
2003-11-24 02:09:23 +00:00
return value ;
}
}
/**
* gst_tag_list_copy_value :
* @ dest : uninitialized # GValue to copy into
* @ list : list to get the tag from
* @ tag : tag to read out
*
2005-06-19 11:32:42 +00:00
* Copies the contents for the given tag into the value ,
* merging multiple values into one if multiple values are associated
* with the tag .
2003-11-24 02:09:23 +00:00
* You must g_value_unset ( ) the value after use .
*
2005-06-19 11:32:42 +00:00
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2003-11-24 02:09:23 +00:00
*/
gboolean
2004-03-13 15:27:01 +00:00
gst_tag_list_copy_value ( GValue * dest , const GstTagList * list ,
const gchar * tag )
2003-11-24 02:09:23 +00:00
{
const GValue * src ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , FALSE ) ;
g_return_val_if_fail ( tag ! = NULL , FALSE ) ;
g_return_val_if_fail ( dest ! = NULL , FALSE ) ;
g_return_val_if_fail ( G_VALUE_TYPE ( dest ) = = 0 , FALSE ) ;
2004-03-13 15:27:01 +00:00
2003-11-24 02:09:23 +00:00
src = gst_structure_get_value ( ( GstStructure * ) list , tag ) ;
2004-03-13 15:27:01 +00:00
if ( ! src )
return FALSE ;
if ( G_VALUE_TYPE ( src ) = = GST_TYPE_LIST ) {
2003-11-24 02:09:23 +00:00
GstTagInfo * info = gst_tag_lookup ( g_quark_from_string ( tag ) ) ;
2004-03-13 15:27:01 +00:00
2009-02-04 14:26:23 +00:00
if ( ! info )
return FALSE ;
2003-11-24 02:09:23 +00:00
/* must be there or lists aren't allowed */
g_assert ( info - > merge_func ) ;
info - > merge_func ( dest , src ) ;
} else {
g_value_init ( dest , G_VALUE_TYPE ( src ) ) ;
g_value_copy ( src , dest ) ;
}
return TRUE ;
}
2006-07-20 16:10:17 +00:00
/* FIXME 0.11: this whole merge function business is overdesigned, and the
* _get_foo ( ) API is misleading as well - how many application developers will
* expect gst_tag_list_get_string ( list , GST_TAG_ARTIST , & val ) might return a
* string with multiple comma - separated artists ? _get_foo ( ) should just be
* a convenience wrapper around _get_foo_index ( list , tag , 0 , & val ) ,
* supplemented by a special _tag_list_get_string_merged ( ) function if needed
* ( unless someone can actually think of real use cases where the merge
* function is not ' use first ' for non - strings and merge for strings ) */
2003-11-24 02:09:23 +00:00
/***** evil macros to get all the gst_tag_list_get_*() functions right *****/
2005-12-06 19:29:15 +00:00
# define TAG_MERGE_FUNCS(name,type) \
gboolean \
gst_tag_list_get_ # # name ( const GstTagList * list , const gchar * tag , \
type * value ) \
{ \
GValue v = { 0 , } ; \
\
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , FALSE ) ; \
g_return_val_if_fail ( tag ! = NULL , FALSE ) ; \
g_return_val_if_fail ( value ! = NULL , FALSE ) ; \
\
if ( ! gst_tag_list_copy_value ( & v , list , tag ) ) \
return FALSE ; \
* value = COPY_FUNC ( g_value_get_ # # name ( & v ) ) ; \
g_value_unset ( & v ) ; \
return TRUE ; \
} \
\
gboolean \
gst_tag_list_get_ # # name # # _index ( const GstTagList * list , \
const gchar * tag , \
guint index , type * value ) \
{ \
const GValue * v ; \
\
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , FALSE ) ; \
g_return_val_if_fail ( tag ! = NULL , FALSE ) ; \
g_return_val_if_fail ( value ! = NULL , FALSE ) ; \
\
if ( ( v = gst_tag_list_get_value_index ( list , tag , index ) ) = = NULL ) \
return FALSE ; \
* value = COPY_FUNC ( g_value_get_ # # name ( v ) ) ; \
return TRUE ; \
2003-11-24 02:09:23 +00:00
}
2006-07-20 16:10:17 +00:00
/* FIXME 0.11: maybe get rid of _get_char*(), _get_uchar*(), _get_long*(),
* _get_ulong * ( ) and _get_pointer * ( ) ? - they are not really useful / common
* enough to warrant convenience accessor functions */
2003-11-24 02:09:23 +00:00
# define COPY_FUNC /**/
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_char :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_char_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( char , gchar )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_uchar :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_uchar_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( uchar , guchar )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_boolean :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_boolean_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( boolean , gboolean )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_int :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_int_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( int , gint )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_uint :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_uint_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( uint , guint )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_long :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_long_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( long , glong )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_ulong :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_ulong_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( ulong , gulong )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_int64 :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_int64_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( int64 , gint64 )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_uint64 :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_uint64_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( uint64 , guint64 )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_float :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_float_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( float , gfloat )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_double :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_double_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( double , gdouble )
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_pointer :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
* Copies the contents for the given tag into the value , merging multiple values
* into one if multiple values are associated with the tag .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_pointer_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2004-07-14 15:28:51 +00:00
TAG_MERGE_FUNCS ( pointer , gpointer )
2003-11-24 02:09:23 +00:00
# undef COPY_FUNC
# define COPY_FUNC g_strdup
2005-10-08 18:07:20 +00:00
/**
* gst_tag_list_get_string :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ value : location for the result
*
2006-07-20 16:10:17 +00:00
* Copies the contents for the given tag into the value , possibly merging
* multiple values into one if multiple values are associated with the tag .
*
* Use gst_tag_list_get_string_index ( list , tag , 0 , value ) if you want
* to retrieve the first string associated with this tag unmodified .
2007-07-10 20:10:16 +00:00
*
2007-12-18 12:03:18 +00:00
* The resulting string in @ value will be in UTF - 8 encoding and should be
* freed by the caller using g_free when no longer needed .
2005-10-08 18:07:20 +00:00
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
/**
* gst_tag_list_get_string_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-08 18:07:20 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
* Gets the value that is at the given index for the given tag in the given
* list .
*
2007-12-18 12:03:18 +00:00
* The resulting string in @ value will be in UTF - 8 encoding and should be
* freed by the caller using g_free when no longer needed .
2006-04-04 14:58:50 +00:00
*
2005-10-08 18:07:20 +00:00
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list .
2005-10-08 18:07:20 +00:00
*/
2003-11-24 02:09:23 +00:00
TAG_MERGE_FUNCS ( string , gchar * )
2005-10-13 15:13:32 +00:00
/**
* gst_tag_list_get_date :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-13 15:13:32 +00:00
* @ tag : tag to read out
2009-03-08 17:15:33 +00:00
* @ value : address of a GDate pointer variable to store the result into
2005-10-13 15:13:32 +00:00
*
2009-03-08 17:15:33 +00:00
* Copies the first date for the given tag in the taglist into the variable
* pointed to by @ value . Free the date with g_date_free ( ) when it is no longer
* needed .
2005-10-13 15:13:32 +00:00
*
2009-03-08 17:15:33 +00:00
* Returns : TRUE , if a date was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list or if it was # NULL .
2005-10-13 15:13:32 +00:00
*/
gboolean
gst_tag_list_get_date ( const GstTagList * list , const gchar * tag ,
GDate * * value )
{
GValue v = { 0 , } ;
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , FALSE ) ;
g_return_val_if_fail ( tag ! = NULL , FALSE ) ;
g_return_val_if_fail ( value ! = NULL , FALSE ) ;
if ( ! gst_tag_list_copy_value ( & v , list , tag ) )
return FALSE ;
* value = ( GDate * ) g_value_dup_boxed ( & v ) ;
g_value_unset ( & v ) ;
return ( * value ! = NULL ) ;
}
/**
* gst_tag_list_get_date_index :
2006-07-20 16:10:17 +00:00
* @ list : a # GstTagList to get the tag from
2005-10-13 15:13:32 +00:00
* @ tag : tag to read out
* @ index : number of entry to read out
* @ value : location for the result
*
2009-03-08 17:15:33 +00:00
* Gets the date that is at the given index for the given tag in the given
* list and copies it into the variable pointed to by @ value . Free the date
* with g_date_free ( ) when it is no longer needed .
2005-10-13 15:13:32 +00:00
*
* Returns : TRUE , if a value was copied , FALSE if the tag didn ' t exist in the
2005-12-06 19:29:15 +00:00
* given list or if it was # NULL .
2005-10-13 15:13:32 +00:00
*/
gboolean
gst_tag_list_get_date_index ( const GstTagList * list ,
const gchar * tag , guint index , GDate * * value )
{
const GValue * v ;
g_return_val_if_fail ( GST_IS_TAG_LIST ( list ) , FALSE ) ;
g_return_val_if_fail ( tag ! = NULL , FALSE ) ;
g_return_val_if_fail ( value ! = NULL , FALSE ) ;
if ( ( v = gst_tag_list_get_value_index ( list , tag , index ) ) = = NULL )
return FALSE ;
* value = ( GDate * ) g_value_dup_boxed ( v ) ;
return ( * value ! = NULL ) ;
}