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

◆ updateBufferFromStream()

bool fl::video::VideoImpl::updateBufferFromStream ( fl::u32 now)
private

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

174 {
175 FASTLED_ASSERT(mTime, "mTime is null");
176 if (!mStream) {
177 FL_WARN("no stream");
178 return false;
179 }
180 if (mStream->atEnd()) {
181 return false;
182 }
183
184 fl::u32 currFrameNumber = 0;
185 fl::u32 nextFrameNumber = 0;
186 bool needs_frame =
187 mFrameInterpolator->needsFrame(now, &currFrameNumber, &nextFrameNumber);
188 if (!needs_frame) {
189 return true;
190 }
191
192 if (mFrameInterpolator->capacity() == 0) {
193 FL_WARN("capacity == 0");
194 return false;
195 }
196
197 const bool has_current_frame = mFrameInterpolator->has(currFrameNumber);
198 const bool has_next_frame = mFrameInterpolator->has(nextFrameNumber);
199
200 fl::FixedVector<fl::u32, 2> frame_numbers;
201 if (!has_current_frame) {
202 frame_numbers.push_back(currFrameNumber);
203 }
204 size_t capacity = mFrameInterpolator->capacity();
205 if (capacity > 1 && !has_next_frame) {
206 frame_numbers.push_back(nextFrameNumber);
207 }
208
209 for (size_t i = 0; i < frame_numbers.size(); ++i) {
210 FramePtr recycled_frame;
211 if (mFrameInterpolator->full()) {
212 fl::u32 frame_to_erase = 0;
213 bool ok =
214 mFrameInterpolator->get_oldest_frame_number(&frame_to_erase);
215 if (!ok) {
216 FL_WARN("get_oldest_frame_number failed");
217 return false;
218 }
219 recycled_frame = mFrameInterpolator->erase(frame_to_erase);
220 if (!recycled_frame) {
221 FL_WARN("erase failed for frame: " << frame_to_erase);
222 return false;
223 }
224 }
225 fl::u32 frame_to_fetch = frame_numbers[i];
226 if (!recycled_frame) {
227 // Happens when we are not full and we need to allocate a new frame.
228 recycled_frame = fl::make_shared<Frame>(mPixelsPerFrame);
229 }
230
231 if (!mStream->readFrame(recycled_frame.get())) {
232 if (mStream->atEnd()) {
233 if (!mStream->rewind()) {
234 FL_WARN("rewind failed");
235 return false;
236 }
237 mTime->reset(now);
238 frame_to_fetch = 0;
239 if (!mStream->readFrameAt(frame_to_fetch,
240 recycled_frame.get())) {
241 FL_WARN("readFrameAt failed");
242 return false;
243 }
244 } else {
245 // For streaming mode, buffer might not have data yet - this is OK
246 // Producer (effect renderer) will fill buffer on next call
247 // Just return success and we'll try again next frame
248 if (mStream->getType() == PixelStream::kStreaming) {
249 return true; // Gracefully handle empty streaming buffer
250 }
251 FL_WARN("We failed for some other reason");
252 return false;
253 }
254 }
255 bool ok = mFrameInterpolator->insert(frame_to_fetch, recycled_frame);
256 if (!ok) {
257 FL_WARN("insert failed");
258 return false;
259 }
260 }
261 return true;
262}
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

References fl::FL_NO_EXCEPT, FL_WARN, fl::video::PixelStream::kStreaming, 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: