From 000c89175c7792954da48402908e8d523b564743 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 25 Aug 2006 23:14:32 +0000 Subject: added new helpers to allow easy metadata retrieval and make libmenu use them git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19538 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmenu/menu_param.c | 161 ++++++++++++--------------------------------------- 1 file changed, 38 insertions(+), 123 deletions(-) (limited to 'libmenu') diff --git a/libmenu/menu_param.c b/libmenu/menu_param.c index 0af9eb1134..84f4fbae5e 100644 --- a/libmenu/menu_param.c +++ b/libmenu/menu_param.c @@ -25,13 +25,7 @@ #include "menu_list.h" #include "input/input.h" #include "osdep/keycodes.h" - -#include "codec-cfg.h" -#include "stream/stream.h" -#include "libmpdemux/demuxer.h" -#include "libmpdemux/stheader.h" - -extern demuxer_t *get_current_demuxer (void); +#include "metadata.h" struct list_entry_s { struct list_entry p; @@ -48,7 +42,7 @@ struct menu_priv_s { char* na; int hide_na; }; - + static struct menu_priv_s cfg_dflt = { MENU_LIST_PRIV_DFLT, NULL, @@ -82,8 +76,6 @@ static m_option_t cfg_fields[] = { #define OPT_INFO_TRACK "track" #define OPT_INFO_GENRE "genre" -#define mp_basename(s) (strrchr(s,'/')==NULL?(char*)s:(strrchr(s,'/')+1)) - m_option_t* mp_property_find(const char* name); static void entry_set_text(menu_t* menu, list_entry_t* e) { @@ -110,69 +102,6 @@ static void update_entries(menu_t* menu) { if(e->opt) entry_set_text(menu,e); } -static int is_valid_video_property(char *prop) { - demuxer_t *demuxer = get_current_demuxer (); - sh_video_t *video = (sh_video_t *) demuxer->video->sh; - - if (!prop || !video) - return 0; - - if (strcmp (prop, OPT_VCODEC) != 0 && - strcmp (prop, OPT_VBITRATE) != 0 && - strcmp (prop, OPT_RESOLUTION) != 0) - return 0; - - return 1; -} - -static int is_valid_audio_property(char *prop) { - demuxer_t *demuxer = get_current_demuxer (); - sh_audio_t *audio = (sh_audio_t *) demuxer->audio->sh; - - if (!prop || !audio) - return 0; - - if (strcmp (prop, OPT_ACODEC) != 0 && - strcmp (prop, OPT_ABITRATE) != 0 && - strcmp (prop, OPT_SAMPLES) != 0) - return 0; - - return 1; -} - -static int is_valid_info_property(char *prop) { - demuxer_t *demuxer = get_current_demuxer (); - - if (!prop || !demuxer) - return 0; - - if (strcmp (prop, OPT_INFO_TITLE) != 0 && - strcmp (prop, OPT_INFO_ARTIST) != 0 && - strcmp (prop, OPT_INFO_ALBUM) != 0 && - strcmp (prop, OPT_INFO_YEAR) != 0 && - strcmp (prop, OPT_INFO_COMMENT) != 0 && - strcmp (prop, OPT_INFO_TRACK) != 0 && - strcmp (prop, OPT_INFO_GENRE) != 0) - return 0; - - return 1; -} - -static char *grab_demuxer_info(char *tag) { - demuxer_t *demuxer = get_current_demuxer (); - char **info = demuxer->info; - int n; - - if (!info || !tag) - return strdup (""); - - for (n = 0; info[2*n] != NULL ; n++) - if (!strcmp (info[2*n], tag)) - break; - - return info[2*n+1] ? strdup (info[2*n+1]) : strdup (""); -} - static int parse_args(menu_t* menu,char* args) { char *element,*body, **attribs, *name, *meta, *val; list_entry_t* m = NULL; @@ -214,53 +143,34 @@ static int parse_args(menu_t* menu,char* args) { meta = asx_get_attrib("meta",attribs); val = NULL; if(meta) { - demuxer_t *demuxer = get_current_demuxer (); - sh_video_t *video = (sh_video_t *) demuxer->video->sh; - sh_audio_t *audio = (sh_audio_t *) demuxer->audio->sh; - if (!strcmp (meta, OPT_NAME)) { - extern char *filename; - val = strdup (mp_basename (filename)); - } else if(!strcmp (meta, OPT_VCODEC) && is_valid_video_property(meta)) { - val = (char *) malloc (8); - if (video->format == 0x10000001) - sprintf (val, "mpeg1"); - else if (video->format == 0x10000002) - sprintf (val, "mpeg2"); - else if (video->format == 0x10000004) - sprintf (val, "mpeg4"); - else if (video->format == 0x10000005) - sprintf (val, "h264"); - else if (video->format >= 0x20202020) - sprintf (val, "%.4s", (char *) &video->format); - else - sprintf (val, "0x%08X", video->format); - } else if (!strcmp(meta, OPT_VBITRATE)&& is_valid_video_property(meta)){ - val = (char *) malloc (16); - sprintf (val, "%d kbps", (int)(video->i_bps * 8 / 1024)); - } else if(!strcmp(meta, OPT_RESOLUTION) - && is_valid_video_property(meta)) { - val = (char *) malloc (16); - sprintf(val, "%d x %d", video->disp_w, video->disp_h); - } else if (!strcmp(meta, OPT_ACODEC) && is_valid_audio_property(meta)) { - val = strdup (audio->codec->name); - } else if(!strcmp(meta, OPT_ABITRATE) && is_valid_audio_property(meta)){ - val = (char *) malloc (16); - sprintf (val, "%d kbps", (int) (audio->i_bps * 8/1000)); - } else if(!strcmp(meta, OPT_SAMPLES) && is_valid_audio_property(meta)) { - val = (char *) malloc (16); - sprintf (val, "%d Hz, %d ch.", audio->samplerate, audio->channels); - } else if ((!strcmp (meta, OPT_INFO_TITLE) || - !strcmp (meta, OPT_INFO_ARTIST) || - !strcmp (meta, OPT_INFO_ALBUM) || - !strcmp (meta, OPT_INFO_YEAR) || - !strcmp (meta, OPT_INFO_COMMENT) || - !strcmp (meta, OPT_INFO_TRACK) || - !strcmp (meta, OPT_INFO_GENRE)) && - is_valid_info_property(meta) && - strcmp(grab_demuxer_info(meta), "") ) { - val = grab_demuxer_info (meta); - } - } + if (!strcmp (meta, OPT_NAME)) + val = get_metadata (META_NAME); + else if (!strcmp (meta, OPT_VCODEC)) + val = get_metadata (META_VIDEO_CODEC); + else if (!strcmp(meta, OPT_VBITRATE)) + val = get_metadata (META_VIDEO_BITRATE); + else if(!strcmp(meta, OPT_RESOLUTION)) + val = get_metadata (META_VIDEO_RESOLUTION); + else if (!strcmp(meta, OPT_ACODEC)) + val = get_metadata (META_AUDIO_CODEC); + else if(!strcmp(meta, OPT_ABITRATE)) + val = get_metadata (META_AUDIO_BITRATE); + else if(!strcmp(meta, OPT_SAMPLES)) + val = get_metadata (META_AUDIO_SAMPLES); + else if (!strcmp (meta, OPT_INFO_TITLE)) + val = get_metadata (META_INFO_TITLE); + else if (!strcmp (meta, OPT_INFO_ARTIST)) + val = get_metadata (META_INFO_ARTIST); + else if (!strcmp (meta, OPT_INFO_ALBUM)) + val = get_metadata (META_INFO_ALBUM); + else if (!strcmp (meta, OPT_INFO_YEAR)) + val = get_metadata (META_INFO_YEAR); + else if (!strcmp (meta, OPT_INFO_COMMENT)) + val = get_metadata (META_INFO_COMMENT); + else if (!strcmp (meta, OPT_INFO_TRACK)) + val = get_metadata (META_INFO_TRACK); + else if (!strcmp (meta, OPT_INFO_GENRE)) + val = get_metadata (META_INFO_GENRE); if (val) { char *item = asx_get_attrib("name",attribs); int l; @@ -274,10 +184,15 @@ static int parse_args(menu_t* menu,char* args) { free(val); free(item); menu_list_add_entry(menu,m); - goto next_element; } - if (meta) - goto next_element; + free (meta); + if (element) + free(element); + if(body) + free(body); + asx_free_attribs(attribs); + continue; + } name = asx_get_attrib("property",attribs); opt = name ? mp_property_find(name) : NULL; -- cgit v1.2.3