From 39793dd204eac0243c78ac4337e1465f675af12c Mon Sep 17 00:00:00 2001 From: Pierre d'Herbemont Date: Sun, 17 Jun 2007 16:24:49 +0000 Subject: [PATCH] Libvlc add a media descriptor object. --- include/vlc/libvlc.h | 39 ++++++++++++ include/vlc/libvlc_structures.h | 33 ++++++++++ src/Makefile.am | 1 + src/control/media_descriptor.c | 105 ++++++++++++++++++++++++++++++++ 4 files changed, 178 insertions(+) create mode 100644 src/control/media_descriptor.c diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h index c4e32e3756..71d95fe57b 100644 --- a/include/vlc/libvlc.h +++ b/include/vlc/libvlc.h @@ -121,6 +121,45 @@ VLC_PUBLIC_API void libvlc_destroy( libvlc_instance_t *, libvlc_exception_t * ); /** @}*/ + +/***************************************************************************** + * Media descriptor + *****************************************************************************/ +/** defgroup libvlc_media_descriptor Media Descriptor + * \ingroup libvlc + * LibVLC Media Descriptor + * @{ + */ + +/** + * Create a media descriptor with the given mrl. + * \param p_instance the instance + * \param psz_mrl the mrl to read + */ +VLC_PUBLIC_API libvlc_media_descriptor_t * libvlc_media_descriptor_new( + libvlc_instance_t *p_instance, + const char * psz_mrl, + libvlc_exception_t *p_e ); + +/** + * Destroy a media descriptor object. + * \param p_meta_desc the md to destroy + */ +VLC_PUBLIC_API void libvlc_media_descriptor_destroy( + libvlc_media_descriptor_t *p_meta_desc ); + +/** + * Read the meta of the media descriptor. + * \param p_meta_desc the media descriptor to read + * \param p_meta_desc the meta to read + */ +VLC_PUBLIC_API char * libvlc_media_descriptor_get_meta( + libvlc_media_descriptor_t *p_meta_desc, + libvlc_meta_t e_meta, + libvlc_exception_t *p_e ); + +/** @}*/ + /***************************************************************************** * Playlist *****************************************************************************/ diff --git a/include/vlc/libvlc_structures.h b/include/vlc/libvlc_structures.h index b5f27f390d..7bc53a65f4 100644 --- a/include/vlc/libvlc_structures.h +++ b/include/vlc/libvlc_structures.h @@ -52,6 +52,39 @@ typedef struct /**@} */ +/***************************************************************************** + * Media Descriptor + *****************************************************************************/ +/** defgroup libvlc_media_descriptor MediaDescriptor + * \ingroup libvlc + * LibVLC Media Descriptor handling + * @{ + */ + +/* Meta Handling */ +/** defgroup libvlc_meta Meta + * \ingroup libvlc_media_descriptor + * LibVLC Media Meta + * @{ + */ + +typedef enum { + libvlc_meta_Title, + libvlc_meta_Artist +} libvlc_meta_t; + +/**@} */ + + +typedef struct { + bool b_preparsed; + input_item_t * p_input_item; + libvlc_instance_t * p_libvlc_instance; +} libvlc_media_descriptor_t; + +/**@} */ + + /***************************************************************************** * Playlist *****************************************************************************/ diff --git a/src/Makefile.am b/src/Makefile.am index bbabd316ac..bab9de72c1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -323,6 +323,7 @@ SOURCES_libvlc_control = \ control/video.c \ control/audio.c \ control/event.c \ + control/media_descriptor.c \ control/mediacontrol_internal.h \ control/mediacontrol_core.c \ control/mediacontrol_util.c \ diff --git a/src/control/media_descriptor.c b/src/control/media_descriptor.c new file mode 100644 index 0000000000..025fa9dcd0 --- /dev/null +++ b/src/control/media_descriptor.c @@ -0,0 +1,105 @@ +/***************************************************************************** + * media_descriptor.c: Libvlc API media descriport management + ***************************************************************************** + * Copyright (C) 2007 the VideoLAN team + * $Id$ + * + * Authors: Pierre d'Herbemont + * + * 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 02110-1301, USA. + *****************************************************************************/ + +#include +#include +#include + +#include "libvlc_internal.h" + + +/************************************************************************** + * Create a new media descriptor object (Private) + **************************************************************************/ +static void preparse_if_needed( libvlc_media_descriptor_t *p_media_desc ) +{ + /* XXX: need some locking here */ + if (!p_media_desc->b_preparsed) + { + input_Preparse( p_media_desc->p_libvlc_instance->p_libvlc_int, + p_media_desc->p_input_item ); + p_media_desc->b_preparsed = TRUE; + } +} + +/************************************************************************** + * Create a new media descriptor object + **************************************************************************/ +libvlc_media_descriptor_t * libvlc_media_descriptor_new( + libvlc_instance_t *p_instance, + const char * psz_mrl, + libvlc_exception_t *p_e ) +{ + input_item_t * p_input_item; + libvlc_media_descriptor_t * p_media_desc; + + p_input_item = input_ItemNew( p_instance->p_libvlc_int, psz_mrl, psz_mrl ); + + if (!p_input_item) + return NULL; /* XXX: throw an exception */ + + p_media_desc = malloc( sizeof(libvlc_input_t) ); + p_media_desc->p_libvlc_instance = p_instance; + p_media_desc->p_input_item = p_input_item; + p_media_desc->b_preparsed = FALSE; + + return p_media_desc; +} + +/************************************************************************** + * Delete a media descriptor object + **************************************************************************/ +void libvlc_media_descriptor_destroy( libvlc_media_descriptor_t *p_meta_desc ) +{ + if (!p_meta_desc) + return; + + /* XXX: locking */ + input_ItemClean( p_meta_desc->p_input_item ); + + free( p_meta_desc ); +} + +/************************************************************************** + * Getters for meta information + **************************************************************************/ +static const int meta_conversion[] = +{ + [libvlc_meta_Title] = 0, /* Offset in the vlc_meta_t structure */ + [libvlc_meta_Artist] = 1 +}; + +char * libvlc_media_descriptor_get_meta( libvlc_media_descriptor_t *p_meta_desc, + libvlc_meta_t e_meta, + libvlc_exception_t *p_e ) +{ + char ** ppsz_meta; + + /* XXX: locking */ + + preparse_if_needed( p_meta_desc ); + + ppsz_meta = (char**)p_meta_desc->p_input_item->p_meta; + + return strdup( ppsz_meta[ meta_conversion[e_meta] ] ); +} -- 2.39.2