| 149 | } |
| 150 | |
| 151 | bool VideoImpl::updateBufferFromStream(fl::u32 now) { |
| 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())) { |
nothing calls this directly
no test coverage detected