summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/metadata.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/apps/metadata.c b/apps/metadata.c
index b544a0c..70e7c05 100644
--- a/apps/metadata.c
+++ b/apps/metadata.c
@@ -1306,10 +1306,10 @@ static bool read_mp4_esds(int fd, struct mp3entry* id3,
id3->frequency *= 2;
}
}
- /* TODO: Should check that there is at least 16 bits left */
/* Skip 13 bits from above, plus 3 bits, then read 11 bits */
- else if (((bits >> 5) & 0x7ff) == 0x2b7) /* extensionAudioObjectType */
+ else if ((length >= 4) && (((bits >> 5) & 0x7ff) == 0x2b7))
{
+ /* extensionAudioObjectType */
DEBUGF("MP4: extensionAudioType\n");
type = bits & 0x1f; /* Object type - 5 bits*/
bits = get_long_be(&buf[4]);
@@ -1343,6 +1343,17 @@ static bool read_mp4_esds(int fd, struct mp3entry* id3,
}
}
}
+
+ if (!sbr && (id3->frequency <= 24000) && (length <= 2))
+ {
+ /* Double the frequency for low-frequency files without a "long"
+ * DecSpecificConfig header. The file may or may not contain SBR,
+ * but here we guess it does if the header is short. This can
+ * fail on some files, but it's the best we can do, short of
+ * decoding (parts of) the file.
+ */
+ id3->frequency *= 2;
+ }
}
return sbr;