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

◆ updateBufferFromStream()

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

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

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

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