Commit d98eefb8 authored by Pierre d'Herbemont's avatar Pierre d'Herbemont

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

parent 8c3e4b40
...@@ -160,6 +160,28 @@ VLC_PUBLIC_API char * libvlc_media_descriptor_get_meta( ...@@ -160,6 +160,28 @@ VLC_PUBLIC_API char * libvlc_media_descriptor_get_meta(
libvlc_meta_t e_meta, libvlc_meta_t e_meta,
libvlc_exception_t *p_e ); 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 );
/** @}*/ /** @}*/
/***************************************************************************** /*****************************************************************************
......
...@@ -53,15 +53,16 @@ typedef struct libvlc_exception_t ...@@ -53,15 +53,16 @@ typedef struct libvlc_exception_t
/**@} */ /**@} */
/***************************************************************************** /*****************************************************************************
* Tag Query * Tag
*****************************************************************************/ *****************************************************************************/
/** defgroup libvlc_tag_query Tag Query /** defgroup libvlc_tag Tag
* \ingroup libvlc * \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 struct libvlc_tag_query_t libvlc_tag_query_t;
typedef char * libvlc_tag_t;
/**@} */ /**@} */
......
...@@ -69,11 +69,17 @@ static const libvlc_meta_t vlc_to_libvlc_meta[] = ...@@ -69,11 +69,17 @@ static const libvlc_meta_t vlc_to_libvlc_meta[] =
[vlc_meta_TrackID] = libvlc_meta_TrackID [vlc_meta_TrackID] = libvlc_meta_TrackID
}; };
struct tag_storage
{
char ** ppsz_tags;
int i_count;
};
/************************************************************************** /**************************************************************************
* input_item_subitem_added (Private) (vlc event Callback) * input_item_subitem_added (Private) (vlc event Callback)
**************************************************************************/ **************************************************************************/
static void input_item_subitem_added( const vlc_event_t *p_event, 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 = user_data;
libvlc_media_descriptor_t * p_md_child; libvlc_media_descriptor_t * p_md_child;
...@@ -178,8 +184,10 @@ libvlc_media_descriptor_t * libvlc_media_descriptor_new_from_input_item( ...@@ -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->p_input_item = p_input_item;
p_md->b_preparsed = VLC_TRUE; p_md->b_preparsed = VLC_TRUE;
p_md->i_refcount = 1; 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_event_manager_register_event_type( p_md->p_event_manager,
libvlc_MediaDescriptorMetaChanged, p_e ); libvlc_MediaDescriptorMetaChanged, p_e );
libvlc_event_manager_register_event_type( p_md->p_event_manager, libvlc_event_manager_register_event_type( p_md->p_event_manager,
...@@ -222,6 +230,7 @@ libvlc_media_descriptor_t * libvlc_media_descriptor_new( ...@@ -222,6 +230,7 @@ libvlc_media_descriptor_t * libvlc_media_descriptor_new(
**************************************************************************/ **************************************************************************/
void libvlc_media_descriptor_release( libvlc_media_descriptor_t *p_md ) void libvlc_media_descriptor_release( libvlc_media_descriptor_t *p_md )
{ {
int i;
if (!p_md) if (!p_md)
return; return;
...@@ -233,6 +242,19 @@ void libvlc_media_descriptor_release( libvlc_media_descriptor_t *p_md ) ...@@ -233,6 +242,19 @@ void libvlc_media_descriptor_release( libvlc_media_descriptor_t *p_md )
uninstall_input_item_observer( p_md ); uninstall_input_item_observer( p_md );
vlc_gc_decref( p_md->p_input_item ); 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 ); free( p_md );
} }
...@@ -296,13 +318,106 @@ char * libvlc_media_descriptor_get_meta( libvlc_media_descriptor_t *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
**************************************************************************/
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
**************************************************************************/ **************************************************************************/
typedef char * libvlc_tag_t; int libvlc_media_descriptor_tags_count_for_key( libvlc_media_descriptor_t *p_md,
void libvlc_media_descriptor_set_tag( libvlc_media_descriptor_t *p_md, const char * key,
const libvlc_tag_t tag, libvlc_exception_t *p_e )
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] );
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment