FastLED 3.10.8
Loading...
Searching...
No Matches

◆ updateBufferFromFile()

bool fl::video::VideoImpl::updateBufferFromFile ( fl::u32 now,
bool forward )
private

Definition at line 264 of file video_impl.cpp.hpp.

264 {
265 fl::u32 currFrameNumber = 0;
266 fl::u32 nextFrameNumber = 0;
267 bool needs_frame =
268 mFrameInterpolator->needsFrame(now, &currFrameNumber, &nextFrameNumber);
269 if (!needs_frame) {
270 return true;
271 }
272 bool has_curr_frame = mFrameInterpolator->has(currFrameNumber);
273 bool has_next_frame = mFrameInterpolator->has(nextFrameNumber);
274 if (has_curr_frame && has_next_frame) {
275 return true;
276 }
277 if (mFrameInterpolator->capacity() == 0) {
278 FL_WARN("capacity == 0");
279 return false;
280 }
281
282 fl::FixedVector<fl::u32, 2> frame_numbers;
283 if (!mFrameInterpolator->has(currFrameNumber)) {
284 frame_numbers.push_back(currFrameNumber);
285 }
286 if (mFrameInterpolator->capacity() > 1 &&
287 !mFrameInterpolator->has(nextFrameNumber)) {
288 frame_numbers.push_back(nextFrameNumber);
289 }
290
291 for (size_t i = 0; i < frame_numbers.size(); ++i) {
292 FramePtr recycled_frame;
293 if (mFrameInterpolator->full()) {
294 fl::u32 frame_to_erase = 0;
295 bool ok = false;
296 if (forward) {
297 ok = mFrameInterpolator->get_oldest_frame_number(
298 &frame_to_erase);
299 if (!ok) {
300 FL_WARN("get_oldest_frame_number failed");
301 return false;
302 }
303 } else {
304 ok = mFrameInterpolator->get_newest_frame_number(
305 &frame_to_erase);
306 if (!ok) {
307 FL_WARN("get_newest_frame_number failed");
308 return false;
309 }
310 }
311 recycled_frame = mFrameInterpolator->erase(frame_to_erase);
312 if (!recycled_frame) {
313 FL_WARN("erase failed for frame: " << frame_to_erase);
314 return false;
315 }
316 }
317 fl::u32 frame_to_fetch = frame_numbers[i];
318 if (!recycled_frame) {
319 // Happens when we are not full and we need to allocate a new frame.
320 recycled_frame = fl::make_shared<Frame>(mPixelsPerFrame);
321 }
322
323 do { // only to use break
324 if (!mStream->readFrameAt(frame_to_fetch, recycled_frame.get())) {
325 if (!forward) {
326 // nothing more we can do, we can't go negative.
327 return false;
328 }
329 if (mStream->atEnd()) {
330 if (!mStream->rewind()) { // Is this still
331 FL_WARN("rewind failed");
332 return false;
333 }
334 mTime->reset(now);
335 frame_to_fetch = 0;
336 if (!mStream->readFrameAt(frame_to_fetch,
337 recycled_frame.get())) {
338 FL_WARN("readFrameAt failed");
339 return false;
340 }
341 break; // we have the frame, so we can break out of the loop
342 }
343 FL_WARN("We failed for some other reason");
344 return false;
345 }
346 break;
347 } while (false);
348
349 bool ok = mFrameInterpolator->insert(frame_to_fetch, recycled_frame);
350 if (!ok) {
351 FL_WARN("insert failed");
352 return false;
353 }
354 }
355 return true;
356}
void push_back(const T &value) FL_NO_EXCEPT
Definition vector.h:191
constexpr fl::size size() const FL_NO_EXCEPT
Definition vector.h:183
fl::TimeWarpPtr mTime
Definition video_impl.h:75
FrameInterpolatorPtr mFrameInterpolator
Definition video_impl.h:74
PixelStreamPtr mStream
Definition video_impl.h:72
#define FL_WARN(...)
Definition log.h:437
shared_ptr< T > make_shared(Args &&... args) FL_NO_EXCEPT
Definition shared_ptr.h:423
constexpr T && forward(typename remove_reference< T >::type &t) FL_NO_EXCEPT

References fl::FL_NO_EXCEPT, FL_WARN, fl::adl_barrier::forward(), fl::adl_barrier::make_shared(), mFrameInterpolator, mPixelsPerFrame, mStream, mTime, fl::FixedVector< T, N >::push_back(), and fl::FixedVector< T, N >::size().

Referenced by updateBufferIfNecessary().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: