summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-08-25 23:14:32 +0000
committerben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-08-25 23:14:32 +0000
commit000c89175c7792954da48402908e8d523b564743 (patch)
tree4216953a4f69adf69d09b5f185b2bdbc5e1620a2
parentd463c9e96d9275630a2e8e4a744bec2a5482609a (diff)
downloadmpv-000c89175c7792954da48402908e8d523b564743.tar.bz2
mpv-000c89175c7792954da48402908e8d523b564743.tar.xz
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
-rw-r--r--libmenu/menu_param.c161
-rw-r--r--metadata.h51
-rw-r--r--mplayer.c163
3 files changed, 249 insertions, 126 deletions
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;
diff --git a/metadata.h b/metadata.h
new file mode 100644
index 0000000000..9acaab3eff
--- /dev/null
+++ b/metadata.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2006 Benjamin Zores
+ * Set of helper routines for stream metadata and properties retrieval.
+ *
+ * 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
+ */
+
+#ifndef _METADATA_H_
+#define _METADATA_H_
+
+typedef enum metadata_s metadata_t;
+enum metadata_s {
+ /* common info */
+ META_NAME = 0,
+
+ /* video stream properties */
+ META_VIDEO_CODEC,
+ META_VIDEO_BITRATE,
+ META_VIDEO_RESOLUTION,
+
+ /* audio stream properties */
+ META_AUDIO_CODEC,
+ META_AUDIO_BITRATE,
+ META_AUDIO_SAMPLES,
+
+ /* ID3 tags and other stream infos */
+ META_INFO_TITLE,
+ META_INFO_ARTIST,
+ META_INFO_ALBUM,
+ META_INFO_YEAR,
+ META_INFO_COMMENT,
+ META_INFO_TRACK,
+ META_INFO_GENRE
+};
+
+char *get_metadata (metadata_t type);
+
+#endif /* _METADATA_H_ */
+
diff --git a/mplayer.c b/mplayer.c
index a3b56deacf..4c615028a4 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -424,8 +424,166 @@ static unsigned int inited_flags=0;
#define INITED_VCODEC 2048
#define INITED_ALL 0xFFFF
-demuxer_t *get_current_demuxer (void) {
- return demuxer;
+#include "metadata.h"
+
+#define mp_basename2(s) (strrchr(s,'/')==NULL?(char*)s:(strrchr(s,'/')+1))
+
+static int is_valid_metadata_type (metadata_t type) {
+ switch (type)
+ {
+ /* check for valid video stream */
+ case META_VIDEO_CODEC:
+ case META_VIDEO_BITRATE:
+ case META_VIDEO_RESOLUTION:
+ {
+ if (!sh_video)
+ return 0;
+ break;
+ }
+
+ /* check for valid audio stream */
+ case META_AUDIO_CODEC:
+ case META_AUDIO_BITRATE:
+ case META_AUDIO_SAMPLES:
+ {
+ if (!sh_audio)
+ return 0;
+ break;
+ }
+
+ /* check for valid demuxer */
+ case META_INFO_TITLE:
+ case META_INFO_ARTIST:
+ case META_INFO_ALBUM:
+ case META_INFO_YEAR:
+ case META_INFO_COMMENT:
+ case META_INFO_TRACK:
+ case META_INFO_GENRE:
+ {
+ if (!demuxer)
+ return 0;
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return 1;
+}
+
+static char *get_demuxer_info (char *tag) {
+ char **info = demuxer->info;
+ int n;
+
+ if (!info || !tag)
+ return NULL;
+
+ 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]) : NULL;
+}
+
+char *get_metadata (metadata_t type) {
+ char *meta = NULL;
+
+ if (!is_valid_metadata_type (type))
+ return NULL;
+
+ switch (type)
+ {
+ case META_NAME:
+ {
+ return strdup (mp_basename2 (filename));
+ }
+
+ case META_VIDEO_CODEC:
+ {
+ if (sh_video->format == 0x10000001)
+ meta = strdup ("mpeg1");
+ else if (sh_video->format == 0x10000002)
+ meta = strdup ("mpeg2");
+ else if (sh_video->format == 0x10000004)
+ meta = strdup ("mpeg4");
+ else if (sh_video->format == 0x10000005)
+ meta = strdup ("h264");
+ else if (sh_video->format >= 0x20202020)
+ {
+ meta = (char *) malloc (8);
+ sprintf (meta, "%.4s", (char *) &sh_video->format);
+ }
+ else
+ {
+ meta = (char *) malloc (8);
+ sprintf (meta, "0x%08X", sh_video->format);
+ }
+ return meta;
+ }
+
+ case META_VIDEO_BITRATE:
+ {
+ meta = (char *) malloc (16);
+ sprintf (meta, "%d kbps", (int) (sh_video->i_bps * 8 / 1024));
+ return meta;
+ }
+
+ case META_VIDEO_RESOLUTION:
+ {
+ meta = (char *) malloc (16);
+ sprintf (meta, "%d x %d", sh_video->disp_w, sh_video->disp_h);
+ return meta;
+ }
+
+ case META_AUDIO_CODEC:
+ {
+ if (sh_audio->codec && sh_audio->codec->name)
+ meta = strdup (sh_audio->codec->name);
+ return meta;
+ }
+
+ case META_AUDIO_BITRATE:
+ {
+ meta = (char *) malloc (16);
+ sprintf (meta, "%d kbps", (int) (sh_audio->i_bps * 8/1000));
+ return meta;
+ }
+
+ case META_AUDIO_SAMPLES:
+ {
+ meta = (char *) malloc (16);
+ sprintf (meta, "%d Hz, %d ch.", sh_audio->samplerate, sh_audio->channels);
+ return meta;
+ }
+
+ /* check for valid demuxer */
+ case META_INFO_TITLE:
+ return get_demuxer_info ("Title");
+
+ case META_INFO_ARTIST:
+ return get_demuxer_info ("Artist");
+
+ case META_INFO_ALBUM:
+ return get_demuxer_info ("Album");
+
+ case META_INFO_YEAR:
+ return get_demuxer_info ("Year");
+
+ case META_INFO_COMMENT:
+ return get_demuxer_info ("Comment");
+
+ case META_INFO_TRACK:
+ return get_demuxer_info ("Track");
+
+ case META_INFO_GENRE:
+ return get_demuxer_info ("Genre");
+
+ default:
+ break;
+ }
+
+ return meta;
}
static void uninit_player(unsigned int mask){
@@ -744,7 +902,6 @@ static int libmpdemux_was_interrupted(int eof) {
return eof;
}
-#define mp_basename2(s) (strrchr(s,'/')==NULL?(char*)s:(strrchr(s,'/')+1))
#define mp_basename(s) (strrchr(s,'\\')==NULL?(mp_basename2(s)):(strrchr(s,'\\')+1))
int playtree_add_playlist(play_tree_t* entry)