+static int handle_id3(AVFormatContext *s, AVPacket *pkt)
+{
+ AVDictionary *metadata = NULL;
+ AVIOContext ioctx;
+ ID3v2ExtraMeta *id3v2_extra_meta = NULL;
+ int ret;
+
+ ret = av_append_packet(s->pb, pkt, ff_id3v2_tag_len(pkt->data) - pkt->size);
+ if (ret < 0) {
+ return ret;
+ }
+
+ ffio_init_context(&ioctx, pkt->data, pkt->size, 0, NULL, NULL, NULL, NULL);
+ ff_id3v2_read_dict(&ioctx, &metadata, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
+ if ((ret = ff_id3v2_parse_priv_dict(&metadata, id3v2_extra_meta)) < 0)
+ goto error;
+
+ if (metadata) {
+ if ((ret = av_dict_copy(&s->metadata, metadata, 0)) < 0)
+ goto error;
+ s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
+ }
+
+error:
+ av_packet_unref(pkt);
+ ff_id3v2_free_extra_meta(&id3v2_extra_meta);
+ av_dict_free(&metadata);
+
+ return ret;
+}
+