1
mirror of https://code.videolan.org/videolan/vlc synced 2024-08-27 04:21:53 +02:00

control/media_descriptor.c: Basic unamed tag support which will soon move to core.

This commit is contained in:
Pierre d'Herbemont 2007-08-19 22:46:15 +00:00
parent 8c3e4b4066
commit d98eefb8e4
3 changed files with 148 additions and 10 deletions

View File

@ -160,6 +160,28 @@ VLC_PUBLIC_API char * libvlc_media_descriptor_get_meta(
libvlc_meta_t e_meta,
libvlc_exception_t *p_e );
/* Tags */
VLC_PUBLIC_API void libvlc_media_descriptor_add_tag( libvlc_media_descriptor_t *p_md,
const char * key,
const libvlc_tag_t tag,
libvlc_exception_t *p_e );
VLC_PUBLIC_API void libvlc_media_descriptor_remove_tag( libvlc_media_descriptor_t *p_md,
const char * key,
const libvlc_tag_t tag,
libvlc_exception_t *p_e );
VLC_PUBLIC_API int
libvlc_media_descriptor_tags_count_for_key( libvlc_media_descriptor_t *p_md,
const char * key,
libvlc_exception_t *p_e );
VLC_PUBLIC_API libvlc_tag_t
libvlc_media_descriptor_tag_at_index_for_key( libvlc_media_descriptor_t *p_md,
int i,
const char * key,
libvlc_exception_t *p_e );
/** @}*/
/*****************************************************************************

View File

@ -53,15 +53,16 @@ typedef struct libvlc_exception_t
/**@} */
/*****************************************************************************
* Tag Query
* Tag
*****************************************************************************/
/** defgroup libvlc_tag_query Tag Query
/** defgroup libvlc_tag Tag
* \ingroup libvlc
* LibVLC Tag Query support in media descriptor
* LibVLC Tag support in media descriptor
* @{
*/
typedef struct libvlc_tag_query_t libvlc_tag_query_t;
typedef char * libvlc_tag_t;
/**@} */

View File

@ -69,11 +69,17 @@ static const libvlc_meta_t vlc_to_libvlc_meta[] =
[vlc_meta_TrackID] = libvlc_meta_TrackID
};
struct tag_storage
{
char ** ppsz_tags;
int i_count;
};
/**************************************************************************
* input_item_subitem_added (Private) (vlc event Callback)
**************************************************************************/
static void input_item_subitem_added( const vlc_event_t *p_event,
void * user_data )
void * user_data )
{
libvlc_media_descriptor_t * p_md = user_data;
libvlc_media_descriptor_t * p_md_child;
@ -178,8 +184,10 @@ libvlc_media_descriptor_t * libvlc_media_descriptor_new_from_input_item(
p_md->p_input_item = p_input_item;
p_md->b_preparsed = VLC_TRUE;
p_md->i_refcount = 1;
p_md->p_event_manager = libvlc_event_manager_new( p_md, p_instance, p_e );
vlc_dictionary_init( &p_md->tags, 1 );
p_md->p_event_manager = libvlc_event_manager_new( p_md, p_instance, p_e );
libvlc_event_manager_register_event_type( p_md->p_event_manager,
libvlc_MediaDescriptorMetaChanged, p_e );
libvlc_event_manager_register_event_type( p_md->p_event_manager,
@ -222,6 +230,7 @@ libvlc_media_descriptor_t * libvlc_media_descriptor_new(
**************************************************************************/
void libvlc_media_descriptor_release( libvlc_media_descriptor_t *p_md )
{
int i;
if (!p_md)
return;
@ -233,6 +242,19 @@ void libvlc_media_descriptor_release( libvlc_media_descriptor_t *p_md )
uninstall_input_item_observer( p_md );
vlc_gc_decref( p_md->p_input_item );
char ** all_keys = vlc_dictionary_all_keys( &p_md->tags );
for( i = 0; all_keys[i]; i++ )
{
int j;
struct tag_storage * p_ts = vlc_dictionary_value_for_key( &p_md->tags, all_keys[i] );
for( j = 0; j < p_ts->i_count; j++ )
{
free( p_ts->ppsz_tags[j] );
free( p_ts->ppsz_tags );
}
free( p_ts );
}
vlc_dictionary_clear( &p_md->tags );
free( p_md );
}
@ -296,13 +318,106 @@ char * libvlc_media_descriptor_get_meta( libvlc_media_descriptor_t *p_md,
}
/**************************************************************************
* Getter for meta information
* Add a tag
**************************************************************************/
typedef char * libvlc_tag_t;
void libvlc_media_descriptor_set_tag( libvlc_media_descriptor_t *p_md,
const libvlc_tag_t tag,
libvlc_exception_t *p_e )
void libvlc_media_descriptor_add_tag( libvlc_media_descriptor_t *p_md,
const char * key,
const libvlc_tag_t tag,
libvlc_exception_t *p_e )
{
struct tag_storage * p_ts;
if( !tag || !key )
return;
p_ts = vlc_dictionary_value_for_key( &p_md->tags, key );
if( !p_ts )
{
p_ts = malloc(sizeof(struct tag_storage));
memset( p_ts, 0, sizeof(struct tag_storage) );
}
p_ts->i_count++;
if( !p_ts->ppsz_tags )
p_ts->ppsz_tags = malloc(sizeof(char*)*(p_ts->i_count));
else
p_ts->ppsz_tags = realloc(p_ts->ppsz_tags, sizeof(char*)*(p_ts->i_count));
p_ts->ppsz_tags[p_ts->i_count-1] = strdup( tag );
}
/**************************************************************************
* Remove a tag
**************************************************************************/
void libvlc_media_descriptor_remove_tag( libvlc_media_descriptor_t *p_md,
const char * key,
const libvlc_tag_t tag,
libvlc_exception_t *p_e )
{
struct tag_storage * p_ts;
int i;
if( !tag || !key )
return;
p_ts = vlc_dictionary_value_for_key( &p_md->tags, key );
if( !p_ts )
return;
for( i = 0; i < p_ts->i_count; i++ )
{
if( !strcmp( p_ts->ppsz_tags[i], tag ) )
{
free( p_ts->ppsz_tags[i] );
memcpy( p_ts->ppsz_tags + i + 1, p_ts->ppsz_tags + i, (p_ts->i_count - i - 2)*sizeof(char*) );
/* Don't dealloc, the memory will be regain if we add a new tag */
p_ts->i_count--;
return;
}
}
}
/**************************************************************************
* Get tags count
**************************************************************************/
int libvlc_media_descriptor_tags_count_for_key( libvlc_media_descriptor_t *p_md,
const char * key,
libvlc_exception_t *p_e )
{
struct tag_storage * p_ts;
if( !key )
return 0;
p_ts = vlc_dictionary_value_for_key( &p_md->tags, key );
if( !p_ts )
return 0;
return p_ts->i_count;
}
/**************************************************************************
* Get a tag
**************************************************************************/
libvlc_tag_t
libvlc_media_descriptor_tag_at_index_for_key( libvlc_media_descriptor_t *p_md,
int i,
const char * key,
libvlc_exception_t *p_e )
{
struct tag_storage * p_ts;
if( !key )
return NULL;
p_ts = vlc_dictionary_value_for_key( &p_md->tags, key );
if( !p_ts )
return NULL;
return strdup( p_ts->ppsz_tags[i] );
}