static GstFlowReturn gst_vorbis_tag_parse_packet (GstVorbisParse * parse, GstBuffer * buffer) { GstTagList *old_tags, *new_tags; const GstTagList *user_tags; GstVorbisTag *tagger; gchar *encoder = NULL; GstBuffer *new_buf; GstMapInfo map; gboolean do_parse = FALSE; gst_buffer_map (buffer, &map, GST_MAP_READ); /* just pass everything except the comments packet */ if (map.size >= 1 && map.data[0] != 0x03) do_parse = TRUE; gst_buffer_unmap (buffer, &map); if (do_parse) { return GST_VORBIS_PARSE_CLASS (parent_class)->parse_packet (parse, buffer); } tagger = GST_VORBIS_TAG (parse); old_tags = gst_tag_list_from_vorbiscomment_buffer (buffer, (guint8 *) "\003vorbis", 7, &encoder); user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (tagger)); /* build new tag list */ new_tags = gst_tag_list_merge (user_tags, old_tags, gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (tagger))); gst_tag_list_unref (old_tags); new_buf = gst_tag_list_to_vorbiscomment_buffer (new_tags, (guint8 *) "\003vorbis", 7, encoder); gst_buffer_copy_into (new_buf, buffer, GST_BUFFER_COPY_TIMESTAMPS, 0, -1); gst_tag_list_unref (new_tags); g_free (encoder); gst_buffer_unref (buffer); return GST_VORBIS_PARSE_CLASS (parent_class)->parse_packet (parse, new_buf); }
static void gst_vorbis_tag_class_init (GstVorbisTagClass * klass) { GstVorbisParseClass *vorbisparse_class = GST_VORBIS_PARSE_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_set_static_metadata (element_class, "VorbisTag", "Formatter/Metadata", "Retags vorbis streams", "James Livingston <*****@*****.**>"); vorbisparse_class->parse_packet = gst_vorbis_tag_parse_packet; }
static GstFlowReturn vorbis_parse_chain (GstPad * pad, GstBuffer * buffer) { GstVorbisParseClass *klass; GstVorbisParse *parse; parse = GST_VORBIS_PARSE (GST_PAD_PARENT (pad)); klass = GST_VORBIS_PARSE_CLASS (G_OBJECT_GET_CLASS (parse)); g_assert (klass->parse_packet != NULL); return klass->parse_packet (parse, buffer); }