diff options
Diffstat (limited to 'apps/metadata.c')
-rw-r--r-- | apps/metadata.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/apps/metadata.c b/apps/metadata.c index b544a0c410..70e7c0542e 100644 --- a/apps/metadata.c +++ b/apps/metadata.c | |||
@@ -1306,10 +1306,10 @@ static bool read_mp4_esds(int fd, struct mp3entry* id3, | |||
1306 | id3->frequency *= 2; | 1306 | id3->frequency *= 2; |
1307 | } | 1307 | } |
1308 | } | 1308 | } |
1309 | /* TODO: Should check that there is at least 16 bits left */ | ||
1310 | /* Skip 13 bits from above, plus 3 bits, then read 11 bits */ | 1309 | /* Skip 13 bits from above, plus 3 bits, then read 11 bits */ |
1311 | else if (((bits >> 5) & 0x7ff) == 0x2b7) /* extensionAudioObjectType */ | 1310 | else if ((length >= 4) && (((bits >> 5) & 0x7ff) == 0x2b7)) |
1312 | { | 1311 | { |
1312 | /* extensionAudioObjectType */ | ||
1313 | DEBUGF("MP4: extensionAudioType\n"); | 1313 | DEBUGF("MP4: extensionAudioType\n"); |
1314 | type = bits & 0x1f; /* Object type - 5 bits*/ | 1314 | type = bits & 0x1f; /* Object type - 5 bits*/ |
1315 | bits = get_long_be(&buf[4]); | 1315 | bits = get_long_be(&buf[4]); |
@@ -1343,6 +1343,17 @@ static bool read_mp4_esds(int fd, struct mp3entry* id3, | |||
1343 | } | 1343 | } |
1344 | } | 1344 | } |
1345 | } | 1345 | } |
1346 | |||
1347 | if (!sbr && (id3->frequency <= 24000) && (length <= 2)) | ||
1348 | { | ||
1349 | /* Double the frequency for low-frequency files without a "long" | ||
1350 | * DecSpecificConfig header. The file may or may not contain SBR, | ||
1351 | * but here we guess it does if the header is short. This can | ||
1352 | * fail on some files, but it's the best we can do, short of | ||
1353 | * decoding (parts of) the file. | ||
1354 | */ | ||
1355 | id3->frequency *= 2; | ||
1356 | } | ||
1346 | } | 1357 | } |
1347 | 1358 | ||
1348 | return sbr; | 1359 | return sbr; |