@@ -3202,8 +3202,17 @@ static drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drm
3202
3202
pTagData += 21 ;
3203
3203
3204
3204
if (pTagData - pFirstFrameData + 14 < firstFrameInfo .frame_bytes ) {
3205
- pMP3 -> delayInPCMFrames = (( (drmp3_uint32 )pTagData [0 ] << 4 ) | ((drmp3_uint32 )pTagData [1 ] >> 4 )) + (528 + 1 );
3206
- pMP3 -> paddingInPCMFrames = ((((drmp3_uint32 )pTagData [1 ] & 0xF ) << 8 ) | ((drmp3_uint32 )pTagData [2 ] )) - (528 + 1 );
3205
+ int delayInPCMFrames ;
3206
+ int paddingInPCMFrames ;
3207
+
3208
+ delayInPCMFrames = (( (drmp3_uint32 )pTagData [0 ] << 4 ) | ((drmp3_uint32 )pTagData [1 ] >> 4 )) + (528 + 1 );
3209
+ paddingInPCMFrames = ((((drmp3_uint32 )pTagData [1 ] & 0xF ) << 8 ) | ((drmp3_uint32 )pTagData [2 ] )) - (528 + 1 );
3210
+ if (paddingInPCMFrames < 0 ) {
3211
+ paddingInPCMFrames = 0 ; /* Padding cannot be negative. Probably a malformed file. Ignore. */
3212
+ }
3213
+
3214
+ pMP3 -> delayInPCMFrames = (drmp3_uint32 )delayInPCMFrames ;
3215
+ pMP3 -> paddingInPCMFrames = (drmp3_uint32 )paddingInPCMFrames ;
3207
3216
}
3208
3217
}
3209
3218
@@ -4515,15 +4524,30 @@ DRMP3_API drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint
4515
4524
4516
4525
DRMP3_API drmp3_uint64 drmp3_get_pcm_frame_count (drmp3 * pMP3 )
4517
4526
{
4527
+ drmp3_uint64 totalPCMFrameCount ;
4528
+
4518
4529
if (pMP3 == NULL ) {
4519
4530
return 0 ;
4520
4531
}
4521
4532
4522
4533
if (pMP3 -> totalPCMFrameCount != DRMP3_UINT64_MAX ) {
4523
- return (drmp3_uint64 )pMP3 -> totalPCMFrameCount - pMP3 -> paddingInPCMFrames - pMP3 -> delayInPCMFrames ;
4534
+ totalPCMFrameCount = pMP3 -> totalPCMFrameCount ;
4535
+
4536
+ if (totalPCMFrameCount >= pMP3 -> delayInPCMFrames ) {
4537
+ totalPCMFrameCount -= pMP3 -> delayInPCMFrames ;
4538
+ } else {
4539
+ /* The delay is greater than the frame count reported by the Xing/Info tag. Assume it's invalid and ignore. */
4540
+ }
4541
+
4542
+ if (totalPCMFrameCount >= pMP3 -> paddingInPCMFrames ) {
4543
+ totalPCMFrameCount -= pMP3 -> paddingInPCMFrames ;
4544
+ } else {
4545
+ /* The padding is greater than the frame count reported by the Xing/Info tag. Assume it's invalid and ignore. */
4546
+ }
4547
+
4548
+ return totalPCMFrameCount ;
4524
4549
} else {
4525
4550
/* Unknown frame count. Need to calculate it. */
4526
- drmp3_uint64 totalPCMFrameCount ;
4527
4551
if (!drmp3_get_mp3_and_pcm_frame_count (pMP3 , NULL , & totalPCMFrameCount )) {
4528
4552
return 0 ;
4529
4553
}
0 commit comments