86 mDriver->setProgressiveConfig(mDriverconfig);
93 if (mDriver->hasError(&err)) {
96 setError(
"Failed to begin JPEG decoding");
134 if (should_yield && (*should_yield)()) {
155 mDriver->setProgressiveConfig(mDriverconfig);
173 bool more_work =
mDriver->processChunk();
175 auto mDriverstate =
mDriver->getState();
176 switch (mDriverstate) {
221 return mImpl->begin(stream);
229 return mImpl->isReady();
233 return mImpl->hasError(msg);
241 return mImpl->decode(should_yield);
245 return mImpl->getCurrentFrame();
249 return mImpl->hasMoreFrames();
253 mImpl->setProgressiveConfig(config);
257 return mImpl->getProgressiveConfig();
261 return mImpl->getProgress();
265 return mImpl->hasPartialImage();
269 return mImpl->getPartialFrame();
273 return mImpl->getDecodedRows();
277 return mImpl->feedData(data);
281 return mImpl->needsMoreData();
285 return mImpl->getBytesProcessed();
289 return mImpl->getState();
299 *error_message =
"Frame pointer is null";
306 *error_message =
"Target frame must be created with proper dimensions for in-place decoding";
315 if (!decoder->begin(stream)) {
317 decoder->hasError(error_message);
325 decoder->hasError(error_message);
330 Frame decoded = decoder->getCurrentFrame();
334 *error_message =
"Target frame dimensions do not match decoded image dimensions";
339 frame->
copy(decoded);
348 if (!decoder->begin(stream)) {
350 decoder->hasError(error_message);
358 decoder->hasError(error_message);
363 Frame frame = decoder->getCurrentFrame();
369 return decode(config, data, error_message);
390 *error_message =
"Frame pointer is null";
399 if (!decoder->begin(stream)) {
401 decoder->hasError(error_message);
407 fl::u32 deadline = start_time + timeout_ms;
412 *mProgressout = decoder->getProgress();
418 Frame decoded = decoder->getCurrentFrame();
422 *error_message =
"Target frame dimensions do not match decoded image dimensions";
427 frame->
copy(decoded);
431 decoder->hasError(error_message);
438 *mProgressout = decoder->getProgress();
447 fl::u32 max_time_per_chunk_ms,
450 if (!frame || !input_stream) {
458 decoder->setProgressiveConfig(prog_config);
460 if (!decoder->begin(input_stream)) {
466 if (mProgresscallback) {
468 float progress = decoder->getProgress();
469 return !mProgresscallback(progress);
475 Frame decoded = decoder->getCurrentFrame();
481 frame->
copy(decoded);
FastLED chrono implementation - duration types for time measurements.
fl::u16 getHeight() const
void copy(const Frame &other)
static bool decode(const JpegConfig &config, fl::span< const fl::u8 > data, Frame *frame, fl::string *error_message=nullptr)
static JpegDecoderPtr createDecoder(const JpegConfig &config)
static bool isSupported()
static bool decodeWithTimeout(const JpegConfig &config, fl::span< const fl::u8 > data, Frame *frame, fl::u32 timeout_ms, float *progress_out=nullptr, fl::string *error_message=nullptr)
static bool decodeStream(const JpegConfig &config, fl::filebuf_ptr input_stream, Frame *frame, fl::u32 max_time_per_chunk_ms=4, fl::function< bool(float)> progress_callback={})
static JpegInfo parseInfo(fl::span< const fl::u8 > data, fl::string *error_message=nullptr)
DecodeResult decode(fl::optional< fl::function< bool()> > should_yield)
bool needsMoreData() const
ProgressiveConfig getProgressiveConfig() const
Impl(const JpegConfig &config)
bool feedData(fl::span< const fl::u8 > data)
void setError(const fl::string &message)
bool hasMoreFrames() const
float getProgress() const
bool begin(fl::filebuf_ptr stream)
~Impl() FL_NOEXCEPT=default
fl::u16 getDecodedRows() const
bool hasError(fl::string *msg=nullptr) const
JpegDecoder::State mState
void setProgressiveConfig(const ProgressiveConfig &config)
ProgressiveConfig progressive_mConfig
JpegDecoder::State getState() const
fl::third_party::TJpgInstanceDecoderPtr mDriver
bool hasPartialImage() const
fl::size getBytesProcessed() const
fl::unique_ptr< Impl > mImpl
bool hasPartialImage() const
bool begin(fl::filebuf_ptr stream) override
~JpegDecoder() FL_NOEXCEPT override
JpegDecoder(const JpegConfig &config)
bool needsMoreData() const
bool hasMoreFrames() const override
void setProgressiveConfig(const ProgressiveConfig &config)
ProgressiveConfig getProgressiveConfig() const
bool feedData(fl::span< const fl::u8 > data)
DecodeResult decode() override
bool hasError(fl::string *msg=nullptr) const override
Frame getCurrentFrame() override
float getProgress() const
bool isReady() const override
fl::u16 getDecodedRows() const
fl::size getBytesProcessed() const
constexpr fl::size size() const FL_NOEXCEPT
Centralized logging categories for FastLED hardware interfaces and subsystems.
fl::shared_ptr< TJpgInstanceDecoder > TJpgInstanceDecoderPtr
TJpgInstanceDecoderPtr createTJpgInstanceDecoder() FL_NOEXCEPT
fl::u32 max_time_per_tick_ms
fl::u16 max_mcus_per_tick
fl::u32 millis()
Universal millisecond timer - returns milliseconds since system startup.
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NOEXCEPT
shared_ptr< T > make_shared(Args &&... args) FL_NOEXCEPT
expected< T, E > result
Alias for expected (Rust-style naming)
fl::shared_ptr< filebuf > filebuf_ptr
constexpr nullopt_t nullopt
fl::shared_ptr< JpegDecoder > JpegDecoderPtr
Base definition for an LED controller.
JpegConfig() FL_NOEXCEPT=default
JpegInfo() FL_NOEXCEPT=default
fl::u16 max_mcus_per_tick
fl::u32 max_time_per_tick_ms