Get the next displayed frame (based on speed and direction)
| 141 | |
| 142 | // Get the next displayed frame (based on speed and direction) |
| 143 | std::shared_ptr<openshot::Frame> PlayerPrivate::getFrame() |
| 144 | { |
| 145 | try { |
| 146 | // Getting new frame, so clear this flag |
| 147 | is_dirty = false; |
| 148 | |
| 149 | // Get the next frame (based on speed) |
| 150 | if (video_position + speed >= 1 && video_position + speed <= reader->info.video_length) { |
| 151 | video_position = video_position + speed; |
| 152 | |
| 153 | } else if (video_position + speed < 1) { |
| 154 | // Start of reader (prevent negative frame number and pause playback) |
| 155 | video_position = 1; |
| 156 | speed = 0; |
| 157 | } else if (video_position + speed > reader->info.video_length) { |
| 158 | // End of reader (prevent negative frame number and pause playback) |
| 159 | video_position = reader->info.video_length; |
| 160 | speed = 0; |
| 161 | } |
| 162 | |
| 163 | if (frame && frame->number == video_position && video_position == last_video_position) { |
| 164 | // return cached frame |
| 165 | return frame; |
| 166 | } |
| 167 | else |
| 168 | { |
| 169 | // Increment playback frames (always in the positive direction) |
| 170 | playback_frames += std::abs(speed); |
| 171 | |
| 172 | // Update playhead hint for cache window tracking without triggering seek behavior. |
| 173 | videoCache->NotifyPlaybackPosition(video_position); |
| 174 | |
| 175 | // return frame from reader |
| 176 | return reader->GetFrame(video_position); |
| 177 | } |
| 178 | |
| 179 | } catch (const ReaderClosed & e) { |
| 180 | // ... |
| 181 | } catch (const OutOfBoundsFrame & e) { |
| 182 | // ... |
| 183 | } |
| 184 | return std::shared_ptr<openshot::Frame>(); |
| 185 | } |
| 186 | |
| 187 | // Seek to a new position |
| 188 | void PlayerPrivate::Seek(int64_t new_position) |
nothing calls this directly
no test coverage detected