mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
aiffparse: extract ID3 tags embedded in ID3 chunks
https://bugzilla.gnome.org/show_bug.cgi?id=664725
This commit is contained in:
parent
43190ea0f8
commit
98b9d602c1
4 changed files with 51 additions and 0 deletions
|
@ -7,6 +7,7 @@ libgstaiff_la_CFLAGS = \
|
|||
$(GST_BASE_CFLAGS) \
|
||||
$(GST_CFLAGS)
|
||||
libgstaiff_la_LIBADD = \
|
||||
$(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \
|
||||
$(GST_BASE_LIBS) \
|
||||
$(LIBM)
|
||||
libgstaiff_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <gst/tag/tag.h>
|
||||
|
||||
#include <gst/gst-i18n-plugin.h>
|
||||
|
||||
#include "aiffparse.h"
|
||||
|
@ -54,6 +56,8 @@ plugin_init (GstPlugin * plugin)
|
|||
ret &= gst_element_register (plugin, "aiffmux", GST_RANK_PRIMARY,
|
||||
GST_TYPE_AIFF_MUX);
|
||||
|
||||
gst_tag_register_musicbrainz_tags ();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
|
||||
#include "aiffparse.h"
|
||||
#include <gst/audio/audio.h>
|
||||
#include <gst/tag/tag.h>
|
||||
#include <gst/gst-i18n-plugin.h>
|
||||
|
||||
GST_DEBUG_CATEGORY (aiffparse_debug);
|
||||
|
@ -163,6 +164,11 @@ gst_aiff_parse_reset (GstAiffParse * aiff)
|
|||
gst_adapter_clear (aiff->adapter);
|
||||
aiff->adapter = NULL;
|
||||
}
|
||||
|
||||
if (aiff->tags != NULL) {
|
||||
gst_tag_list_free (aiff->tags);
|
||||
aiff->tags = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -892,6 +898,38 @@ gst_aiff_parse_stream_headers (GstAiffParse * aiff)
|
|||
}
|
||||
break;
|
||||
}
|
||||
case GST_MAKE_FOURCC ('I', 'D', '3', ' '):{
|
||||
GstTagList *tags;
|
||||
|
||||
if (aiff->streaming) {
|
||||
if (!gst_aiff_parse_peek_chunk (aiff, &tag, &size))
|
||||
return GST_FLOW_OK;
|
||||
|
||||
gst_adapter_flush (aiff->adapter, 8);
|
||||
aiff->offset += 8;
|
||||
|
||||
buf = gst_adapter_take_buffer (aiff->adapter, size);
|
||||
} else {
|
||||
if ((res = gst_aiff_parse_read_chunk (aiff,
|
||||
&aiff->offset, &tag, &buf)) != GST_FLOW_OK)
|
||||
return res;
|
||||
}
|
||||
|
||||
GST_LOG_OBJECT (aiff, "ID3 chunk of size %u", GST_BUFFER_SIZE (buf));
|
||||
|
||||
tags = gst_tag_list_from_id3v2_tag (buf);
|
||||
gst_buffer_unref (buf);
|
||||
|
||||
GST_INFO_OBJECT (aiff, "ID3 tags: %" GST_PTR_FORMAT, tags);
|
||||
|
||||
if (aiff->tags == NULL) {
|
||||
aiff->tags = tags;
|
||||
} else {
|
||||
gst_tag_list_insert (aiff->tags, tags, GST_TAG_MERGE_APPEND);
|
||||
gst_tag_list_free (tags);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
gst_aiff_parse_ignore_chunk (aiff, buf, tag, size);
|
||||
}
|
||||
|
@ -1117,6 +1155,11 @@ iterate_adapter:
|
|||
gst_pad_push_event (aiff->srcpad, aiff->start_segment);
|
||||
aiff->start_segment = NULL;
|
||||
}
|
||||
if (G_UNLIKELY (aiff->tags != NULL)) {
|
||||
gst_element_found_tags_for_pad (GST_ELEMENT_CAST (aiff), aiff->srcpad,
|
||||
aiff->tags);
|
||||
aiff->tags = NULL;
|
||||
}
|
||||
|
||||
obtained = GST_BUFFER_SIZE (buf);
|
||||
|
||||
|
|
|
@ -113,6 +113,9 @@ struct _GstAiffParse {
|
|||
|
||||
/* discont after seek */
|
||||
gboolean discont;
|
||||
|
||||
/* tags */
|
||||
GstTagList *tags;
|
||||
};
|
||||
|
||||
struct _GstAiffParseClass {
|
||||
|
|
Loading…
Reference in a new issue