summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Kirchner <git@halffull.org>2025-01-11 22:01:37 -0800
committerTom Kirchner <git@halffull.org>2025-01-11 22:10:34 -0800
commit35f124637943976450150b96bdd0359bf26287f7 (patch)
treeb76fc5814643dc10871daafdf69fddcfcfdc92c7
parent1f1059843fa9ea7e8b6d9c288626dac9e2df67f2 (diff)
downloadtangara-fw-35f124637943976450150b96bdd0359bf26287f7.tar.gz
Check for frames/bytes/TOC in CBR as well
-rw-r--r--src/codecs/mad.cpp12
1 files 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<std::span<const unsigned char, 100>> toc;
std::optional<uint32_t> 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) +