gst/apetag/gstapedemux.c: Some clean-ups and additions: map APE 'file' tag to

Original commit message from CVS:
Patch by: Sebastian Dröge  <slomo at ubuntu dot com>
* gst/apetag/gstapedemux.c: (ape_demux_get_gst_tag_from_tag),
(ape_demux_parse_tags):
Some clean-ups and additions: map APE 'file' tag to
GST_TAG_LOCATION (#343123); add support for extracting
the track count and clean up parsing a bit (#343127).
This commit is contained in:
Sebastian Dröge 2006-05-28 14:38:11 +00:00 committed by Tim-Philipp Müller
parent 1e33771cc7
commit a2dbc8ad43
2 changed files with 61 additions and 16 deletions

View file

@ -1,3 +1,13 @@
2006-05-28 Tim-Philipp Müller <tim at centricular dot net>
Patch by: Sebastian Dröge <slomo at ubuntu dot com>
* gst/apetag/gstapedemux.c: (ape_demux_get_gst_tag_from_tag),
(ape_demux_parse_tags):
Some clean-ups and additions: map APE 'file' tag to
GST_TAG_LOCATION (#343123); add support for extracting
the track count and clean up parsing a bit (#343127).
2006-05-28 Edward Hervey <edward@fluendo.com> 2006-05-28 Edward Hervey <edward@fluendo.com>
* ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_change_state): * ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_change_state):

View file

@ -62,7 +62,7 @@
#define APE_VERSION_MAJOR(ver) ((ver)/1000) #define APE_VERSION_MAJOR(ver) ((ver)/1000)
GST_DEBUG_CATEGORY (apedemux_debug); GST_DEBUG_CATEGORY_STATIC (apedemux_debug);
#define GST_CAT_DEFAULT (apedemux_debug) #define GST_CAT_DEFAULT (apedemux_debug)
static const GstElementDetails gst_ape_demux_details = static const GstElementDetails gst_ape_demux_details =
@ -141,7 +141,8 @@ static const struct _GstApeDemuxTagTableEntry
"genre", GST_TAG_GENRE}, { "genre", GST_TAG_GENRE}, {
"isrc", GST_TAG_ISRC}, { "isrc", GST_TAG_ISRC}, {
"track", GST_TAG_TRACK_NUMBER}, { "track", GST_TAG_TRACK_NUMBER}, {
"year", GST_TAG_DATE} "year", GST_TAG_DATE}, {
"file", GST_TAG_LOCATION}
}; };
static gboolean static gboolean
@ -154,6 +155,7 @@ ape_demux_get_gst_tag_from_tag (const gchar * ape_tag,
if (g_ascii_strcasecmp (tag_table[i].ape_tag, ape_tag) == 0) { if (g_ascii_strcasecmp (tag_table[i].ape_tag, ape_tag) == 0) {
*gst_tag = tag_table[i].gst_tag; *gst_tag = tag_table[i].gst_tag;
*gst_tag_type = gst_tag_get_type (tag_table[i].gst_tag); *gst_tag_type = gst_tag_get_type (tag_table[i].gst_tag);
GST_LOG ("Mapped APE tag '%s' to GStreamer tag '%s'", ape_tag, *gst_tag);
return TRUE; return TRUE;
} }
} }
@ -205,29 +207,62 @@ ape_demux_parse_tags (const guint8 * data, gint size)
GValue v = { 0, }; GValue v = { 0, };
switch (gst_tag_type) { switch (gst_tag_type) {
case G_TYPE_INT: case G_TYPE_INT:{
g_value_init (&v, G_TYPE_INT); gint v_int;
g_value_set_int (&v, atoi (val));
if (sscanf (val, "%d", &v_int) == 1) {
g_value_init (&v, G_TYPE_INT);
g_value_set_int (&v, v_int);
}
break; break;
case G_TYPE_UINT: }
g_value_init (&v, G_TYPE_UINT); case G_TYPE_UINT:{
g_value_set_uint (&v, (guint) atof (val)); /* hmmm */ guint v_uint, count;
if (strcmp (gst_tag, GST_TAG_TRACK_NUMBER) == 0) {
gint dummy;
if (sscanf (val, "%u", &v_uint) == 1 && v_uint > 0) {
g_value_init (&v, G_TYPE_UINT);
g_value_set_uint (&v, v_uint);
}
GST_LOG ("checking for count: %s", val);
/* might be 0/N or -1/N to specify that there is only a count */
if (sscanf (val, "%d/%u", &dummy, &count) == 2 && count > 0) {
gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND,
GST_TAG_TRACK_COUNT, count, NULL);
}
} else if (sscanf (val, "%u", &v_uint) == 1) {
g_value_init (&v, G_TYPE_UINT);
g_value_set_uint (&v, v_uint);
}
break; break;
case G_TYPE_STRING: }
case G_TYPE_STRING:{
g_value_init (&v, G_TYPE_STRING); g_value_init (&v, G_TYPE_STRING);
g_value_set_string (&v, val); g_value_set_string (&v, val);
break; break;
case G_TYPE_DOUBLE: }
g_value_init (&v, G_TYPE_DOUBLE); case G_TYPE_DOUBLE:{
g_value_set_double (&v, atof (val)); gdouble v_double;
if (sscanf (val, "%lf", &v_double) == 1) {
g_value_init (&v, G_TYPE_DOUBLE);
g_value_set_double (&v, v_double);
}
break; break;
}
default:{ default:{
if (gst_tag_type == GST_TYPE_DATE) { if (gst_tag_type == GST_TYPE_DATE) {
GDate *date = g_date_new_dmy (1, 1, atoi (val)); gint v_int;
g_value_init (&v, GST_TYPE_DATE); if (sscanf (val, "%d", &v_int) == 1) {
gst_value_set_date (&v, date); GDate *date = g_date_new_dmy (1, 1, v_int);
g_date_free (date);
g_value_init (&v, GST_TYPE_DATE);
gst_value_set_date (&v, date);
g_date_free (date);
}
} else { } else {
GST_WARNING ("Unhandled tag type '%s' for tag '%s'", GST_WARNING ("Unhandled tag type '%s' for tag '%s'",
g_type_name (gst_tag_type), gst_tag); g_type_name (gst_tag_type), gst_tag);