51 fl::size totalRead = 0;
55 fl::size toRead =
fl::min(bytesToRead, rem);
58 mCurrentPos += toRead; totalRead += toRead; bytesToRead -= toRead;
84 Video video(pixelsPerFrame, fps, nFrameHistory);
89 config.
targetFps =
static_cast<fl::u16
>(fps);
94 if (!decoder) {
video.setError(
fl::string(
"Failed to create MPEG1 decoder: ").append(error_message));
return video; }
95 if (!decoder->begin(file.
rdbuf())) {
96 fl::string decoder_error; decoder->hasError(&decoder_error);
97 video.setError(
fl::string(
"Failed to initialize MPEG1 decoder: ").append(decoder_error));
return video;
100 if (!
video.begin(mpeg1Stream)) {
video.setError(
fl::string(
"Failed to initialize video with MPEG1 stream"));
return video; }
108 if (error_message) { *error_message =
"Failed to open file: "; error_message->append(path); }
109 FL_WARN(
"Failed to open JPEG file: " << path);
return FramePtr();
111 fl::size fileSize = file.
size();
113 if (error_message) { *error_message =
"File is empty: "; error_message->append(path); }
114 file.
close();
return FramePtr();
118 fl::size bytesRead = 0;
119 while (bytesRead < fileSize && file.
available()) {
120 fl::size chunkSize =
min<fl::size>(4096, fileSize - bytesRead);
121 fl::size n = file.
read(buffer.
data() + bytesRead, chunkSize);
126 if (bytesRead != fileSize) {
128 *error_message =
"Failed to read complete file. Expected ";
129 error_message->append(
static_cast<u32
>(fileSize));
130 error_message->append(
" bytes, got ");
131 error_message->append(
static_cast<u32
>(bytesRead));
133 FL_WARN(
"Failed to read complete JPEG file: " << path);
return FramePtr();
136 FramePtr frame =
Jpeg::decode(config, jpegData, error_message);
137 if (!frame && error_message && error_message->empty()) {
138 *error_message =
"Failed to decode JPEG from file: "; error_message->append(path);
146 if (error_message) { *error_message =
"Failed to open file: "; error_message->append(path); }
152 if (error_message) { *error_message =
"Failed to initialize MP3 decoder: "; error_message->append(decoder_error); }
fl::ifstream openRead(const char *path) FL_NO_EXCEPT
Video openMpeg1Video(const char *path, fl::size pixelsPerFrame, float fps=30.0f, fl::size nFrameHistory=0) FL_NO_EXCEPT
FramePtr loadJpeg(const char *path, const JpegConfig &config=JpegConfig(), fl::string *error_message=nullptr) FL_NO_EXCEPT
fl::Mp3DecoderPtr openMp3(const char *path, fl::string *error_message=nullptr) FL_NO_EXCEPT
static bool decode(const JpegConfig &config, fl::span< const fl::u8 > data, Frame *frame, fl::string *error_message=nullptr) FL_NO_EXCEPT
static Mp3DecoderPtr createDecoder(fl::string *error_message=nullptr) FL_NO_EXCEPT
bool hasError(fl::string *msg=nullptr) const FL_NO_EXCEPT
bool begin(fl::filebuf_ptr stream) FL_NO_EXCEPT
static IDecoderPtr createDecoder(const Mpeg1Config &config, fl::string *error_message=nullptr) FL_NO_EXCEPT
const char * error_message() const FL_NO_EXCEPT override
bool decodeNextFrameIfNeeded() FL_NO_EXCEPT
const char * path() const FL_NO_EXCEPT override
fl::size_t bytes_left() const FL_NO_EXCEPT override
bool is_open() const FL_NO_EXCEPT override
void close() FL_NO_EXCEPT override
bool has_error() const FL_NO_EXCEPT override
bool seek(fl::size_t, seek_dir) FL_NO_EXCEPT override
bool is_eof() const FL_NO_EXCEPT override
bool available() const FL_NO_EXCEPT override
fl::shared_ptr< Frame > mCurrentFrame
fl::size_t read(char *dst, fl::size_t bytesToRead) FL_NO_EXCEPT override
void clear_error() FL_NO_EXCEPT override
fl::size_t write(const char *, fl::size_t) FL_NO_EXCEPT override
fl::size_t size() const FL_NO_EXCEPT override
int error_code() const FL_NO_EXCEPT override
fl::size_t tell() FL_NO_EXCEPT override
Mpeg1FileHandle(IDecoderPtr decoder, fl::size pixelsPerFrame, const char *path) FL_NO_EXCEPT
virtual bool seek(fl::size_t pos, seek_dir dir) FL_NO_EXCEPT=0
virtual fl::size_t read(char *buffer, fl::size_t count) FL_NO_EXCEPT=0
fl::size_t size() const FL_NO_EXCEPT
ifstream & read(char *buffer, fl::size_t count) FL_NO_EXCEPT
bool available() const FL_NO_EXCEPT
bool is_open() const FL_NO_EXCEPT
filebuf_ptr rdbuf() const FL_NO_EXCEPT
void close() FL_NO_EXCEPT
fl::size size() const FL_NO_EXCEPT
void reserve(fl::size n) FL_NO_EXCEPT
void resize(fl::size n) FL_NO_EXCEPT
Centralized logging categories for FastLED hardware interfaces and subsystems.
shared_ptr< T > make_shared(Args &&... args) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NO_EXCEPT
FASTLED_FORCE_INLINE void * memcpy(void *dest, const void *src, size_t n) FL_NO_EXCEPT
expected< T, E > result
Alias for expected (Rust-style naming)
third_party::Mpeg1Config Mpeg1Config
fl::shared_ptr< Mp3Decoder > Mp3DecoderPtr
Base definition for an LED controller.