FastLED 3.9.15
Loading...
Searching...
No Matches

◆ updateBufferFromFile()

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

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

241 {
242 fl::u32 currFrameNumber = 0;
243 fl::u32 nextFrameNumber = 0;
244 bool needs_frame =
245 mFrameInterpolator->needsFrame(now, &currFrameNumber, &nextFrameNumber);
246 if (!needs_frame) {
247 return true;
248 }
249 bool has_curr_frame = mFrameInterpolator->has(currFrameNumber);
250 bool has_next_frame = mFrameInterpolator->has(nextFrameNumber);
251 if (has_curr_frame && has_next_frame) {
252 return true;
253 }
254 if (mFrameInterpolator->capacity() == 0) {
255 FL_WARN("capacity == 0");
256 return false;
257 }
258
259 fl::FixedVector<fl::u32, 2> frame_numbers;
260 if (!mFrameInterpolator->has(currFrameNumber)) {
261 frame_numbers.push_back(currFrameNumber);
262 }
263 if (mFrameInterpolator->capacity() > 1 &&
264 !mFrameInterpolator->has(nextFrameNumber)) {
265 frame_numbers.push_back(nextFrameNumber);
266 }
267
268 for (size_t i = 0; i < frame_numbers.size(); ++i) {
269 FramePtr recycled_frame;
270 if (mFrameInterpolator->full()) {
271 fl::u32 frame_to_erase = 0;
272 bool ok = false;
273 if (forward) {
274 ok = mFrameInterpolator->get_oldest_frame_number(
275 &frame_to_erase);
276 if (!ok) {
277 FL_WARN("get_oldest_frame_number failed");
278 return false;
279 }
280 } else {
281 ok = mFrameInterpolator->get_newest_frame_number(
282 &frame_to_erase);
283 if (!ok) {
284 FL_WARN("get_newest_frame_number failed");
285 return false;
286 }
287 }
288 recycled_frame = mFrameInterpolator->erase(frame_to_erase);
289 if (!recycled_frame) {
290 FL_WARN("erase failed for frame: " << frame_to_erase);
291 return false;
292 }
293 }
294 fl::u32 frame_to_fetch = frame_numbers[i];
295 if (!recycled_frame) {
296 // Happens when we are not full and we need to allocate a new frame.
297 recycled_frame = fl::make_shared<Frame>(mPixelsPerFrame);
298 }
299
300 do { // only to use break
301 if (!mStream->readFrameAt(frame_to_fetch, recycled_frame.get())) {
302 if (!forward) {
303 // nothing more we can do, we can't go negative.
304 return false;
305 }
306 if (mStream->atEnd()) {
307 if (!mStream->rewind()) { // Is this still
308 FL_WARN("rewind failed");
309 return false;
310 }
311 mTime->reset(now);
312 frame_to_fetch = 0;
313 if (!mStream->readFrameAt(frame_to_fetch,
314 recycled_frame.get())) {
315 FL_WARN("readFrameAt failed");
316 return false;
317 }
318 break; // we have the frame, so we can break out of the loop
319 }
320 FL_WARN("We failed for some other reason");
321 return false;
322 }
323 break;
324 } while (false);
325
326 bool ok = mFrameInterpolator->insert(frame_to_fetch, recycled_frame);
327 if (!ok) {
328 FL_WARN("insert failed");
329 return false;
330 }
331 }
332 return true;
333}
void push_back(const T &value) FL_NOEXCEPT
Definition vector.h:191
constexpr fl::size size() const FL_NOEXCEPT
Definition vector.h:183
fl::TimeWarpPtr mTime
Definition video_impl.h:70
FrameInterpolatorPtr mFrameInterpolator
Definition video_impl.h:69
PixelStreamPtr mStream
Definition video_impl.h:67
#define FL_WARN(X)
Definition log.h:276
shared_ptr< T > make_shared(Args &&... args) FL_NOEXCEPT
Definition shared_ptr.h:414
constexpr T && forward(typename remove_reference< T >::type &t) FL_NOEXCEPT

References FL_WARN, fl::forward(), fl::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: