From 35f124637943976450150b96bdd0359bf26287f7 Mon Sep 17 00:00:00 2001 From: Tom Kirchner Date: Sat, 11 Jan 2025 22:01:37 -0800 Subject: [PATCH] Check for frames/bytes/TOC in CBR as well --- src/codecs/mad.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/codecs/mad.cpp b/src/codecs/mad.cpp index 2aa3766a..a0184487 100644 --- a/src/codecs/mad.cpp +++ b/src/codecs/mad.cpp @@ -336,15 +336,19 @@ auto MadMp3Decoder::GetMp3Info(const mad_header& header) unsigned char const* frames_count_raw; uint32_t frames_count = 0; - if (std::memcmp(stream_->this_frame + xing_offset, "Xing", 4) == 0 || - std::memcmp(stream_->this_frame + xing_offset, "Info", 4) == 0) { + + bool xing_vbr = std::memcmp(stream_->this_frame + xing_offset, "Xing", 4) == 0; + bool xing_cbr = std::memcmp(stream_->this_frame + xing_offset, "Info", 4) == 0; + bool vbri = std::memcmp(stream_->this_frame + xing_offset, "VBRI", 4) == 0; + + if ( xing_vbr || xing_cbr) { /* Xing header to get the count of frames for VBR */ frames_count_raw = stream_->this_frame + xing_offset + 8; frames_count = ((uint32_t)frames_count_raw[0] << 24) + ((uint32_t)frames_count_raw[1] << 16) + ((uint32_t)frames_count_raw[2] << 8) + ((uint32_t)frames_count_raw[3]); - } else if (std::memcmp(stream_->this_frame + xing_offset, "VBRI", 4) == 0) { + } else if (vbri) { /* VBRI header to get the count of frames for VBR */ frames_count_raw = stream_->this_frame + xing_offset + 14; frames_count = ((uint32_t)frames_count_raw[0] << 24) + @@ -358,7 +362,7 @@ auto MadMp3Decoder::GetMp3Info(const mad_header& header) // Check TOC and bytes in the bitstream (used for VBR seeking) std::optional> toc; std::optional bytes; - if (std::memcmp(stream_->this_frame + xing_offset, "Xing", 4) == 0) { + if (xing_vbr || xing_cbr) { unsigned char const* flags_raw = stream_->this_frame + xing_offset + 4; uint32_t flags = ((uint32_t)flags_raw[0] << 24) + ((uint32_t)flags_raw[1] << 16) +