MCPcopy Create free account
hub / github.com/FastLED/FastLED / parseMp3Info

Method parseMp3Info

src/fl/codec/mp3.cpp.hpp:410–483  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

408}
409
410Mp3Info Mp3::parseMp3Info(fl::span<const fl::u8> data, fl::string* error_message) {
411 Mp3Info info;
412
413 // Validate input data
414 if (data.empty()) {
415 if (error_message) {
416 *error_message = "Empty MP3 data";
417 }
418 return info; // returns invalid info
419 }
420
421 // Minimum size check - need at least an MP3 frame header (4 bytes) + some data
422 if (data.size() < 128) {
423 if (error_message) {
424 *error_message = "MP3 data too small";
425 }
426 return info;
427 }
428
429 // Look for MP3 sync word (11 bits set: 0xFFE or 0xFFF)
430 bool foundSync = false;
431 fl::size syncOffset = 0;
432
433 for (fl::size i = 0; i <= data.size() - 4; i++) {
434 if (data[i] == 0xFF && (data[i + 1] & 0xE0) == 0xE0) {
435 foundSync = true;
436 syncOffset = i;
437 break;
438 }
439 }
440
441 if (!foundSync) {
442 if (error_message) {
443 *error_message = "Invalid MP3 stream - no sync word found";
444 }
445 return info;
446 }
447
448 // Use the decoder to parse the first frame
449 third_party::Mp3HelixDecoder decoder;
450 if (!decoder.init()) {
451 if (error_message) {
452 *error_message = "Failed to initialize MP3 decoder";
453 }
454 return info;
455 }
456
457 const fl::u8* inptr = data.data() + syncOffset;
458 fl::size bytes_left = data.size() - syncOffset;
459
460 // Try to decode first frame to get metadata
461 int offset = decoder.findSyncWord(inptr, bytes_left);
462 if (offset >= 0) {
463 inptr += offset;
464 bytes_left -= offset;
465
466 int result = decoder.decodeFrame(&inptr, &bytes_left);
467 if (result == 0) {

Callers

nothing calls this directly

Calls 6

findSyncWordMethod · 0.80
decodeFrameMethod · 0.80
emptyMethod · 0.45
sizeMethod · 0.45
initMethod · 0.45
dataMethod · 0.45

Tested by

no test coverage detected