You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
Revert "lavf/id3v2dec: support multiple values and TIPL frames"
see: Re: [FFmpeg-devel] [PATCH 2/2] avformat/id3v2: Check that decode_str() did advance
but in short, first our API since 16years says we dont have multiple values per key
(which it supports since 9 years only)
and it causes some problems for ffprobe apparently.
I do believe the original patch is the correct direction but it requires
more changes. So revert this until other things are in place and until
we have a consensus.
This reverts commit 80b77e8e8d
.
This commit is contained in:
@@ -327,12 +327,8 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen,
|
||||
AVDictionary **metadata, const char *key)
|
||||
{
|
||||
uint8_t *dst;
|
||||
uint8_t *dst_key = NULL;
|
||||
int encoding, dict_flags = AV_DICT_MULTIKEY | AV_DICT_DONT_STRDUP_VAL | AV_DICT_DEDUP;
|
||||
int encoding, dict_flags = AV_DICT_DONT_OVERWRITE | AV_DICT_DONT_STRDUP_VAL;
|
||||
unsigned genre;
|
||||
int count = 0;
|
||||
int is_tipl = !(strcmp(key, "TIPL") && strcmp(key, "TMCL") &&
|
||||
strcmp(key, "IPL"));
|
||||
|
||||
if (taglen < 1)
|
||||
return;
|
||||
@@ -340,33 +336,30 @@ static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen,
|
||||
encoding = avio_r8(pb);
|
||||
taglen--; /* account for encoding type byte */
|
||||
|
||||
while (taglen > 1) {
|
||||
if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
|
||||
av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key);
|
||||
return;
|
||||
}
|
||||
|
||||
count++;
|
||||
|
||||
if (!(strcmp(key, "TCON") && strcmp(key, "TCO")) &&
|
||||
(sscanf(dst, "(%d)", &genre) == 1 || sscanf(dst, "%d", &genre) == 1) &&
|
||||
genre <= ID3v1_GENRE_MAX) {
|
||||
av_freep(&dst);
|
||||
dst = av_strdup(ff_id3v1_genre_str[genre]);
|
||||
} else if (!(strcmp(key, "TXXX") && strcmp(key, "TXX")) ||
|
||||
(is_tipl && (count & 1))) {
|
||||
/* dst now contains the key, need to get value */
|
||||
av_free(dst_key);
|
||||
key = dst_key = dst;
|
||||
continue;
|
||||
} else if (!*dst)
|
||||
av_freep(&dst);
|
||||
|
||||
if (dst)
|
||||
av_dict_set(metadata, key, dst, dict_flags);
|
||||
if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
|
||||
av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key);
|
||||
return;
|
||||
}
|
||||
|
||||
av_free(dst_key);
|
||||
if (!(strcmp(key, "TCON") && strcmp(key, "TCO")) &&
|
||||
(sscanf(dst, "(%d)", &genre) == 1 || sscanf(dst, "%d", &genre) == 1) &&
|
||||
genre <= ID3v1_GENRE_MAX) {
|
||||
av_freep(&dst);
|
||||
dst = av_strdup(ff_id3v1_genre_str[genre]);
|
||||
} else if (!(strcmp(key, "TXXX") && strcmp(key, "TXX"))) {
|
||||
/* dst now contains the key, need to get value */
|
||||
key = dst;
|
||||
if (decode_str(s, pb, encoding, &dst, &taglen) < 0) {
|
||||
av_log(s, AV_LOG_ERROR, "Error reading frame %s, skipped\n", key);
|
||||
av_freep(&key);
|
||||
return;
|
||||
}
|
||||
dict_flags |= AV_DICT_DONT_STRDUP_KEY;
|
||||
} else if (!*dst)
|
||||
av_freep(&dst);
|
||||
|
||||
if (dst)
|
||||
av_dict_set(metadata, key, dst, dict_flags);
|
||||
}
|
||||
|
||||
static void read_uslt(AVFormatContext *s, AVIOContext *pb, int taglen,
|
||||
@@ -1051,7 +1044,7 @@ static void id3v2_parse(AVIOContext *pb, AVDictionary **metadata,
|
||||
pbx = &pb_local.pub; // read from sync buffer
|
||||
}
|
||||
#endif
|
||||
if (tag[0] == 'T' || !strcmp(tag, "IPL"))
|
||||
if (tag[0] == 'T')
|
||||
/* parse text tag */
|
||||
read_ttag(s, pbx, tlen, metadata, tag);
|
||||
else if (!memcmp(tag, "USLT", 4))
|
||||
|
Reference in New Issue
Block a user