| 1832 | }; |
| 1833 | |
| 1834 | NATRON_NAMESPACE_ANONYMOUS_EXIT |
| 1835 | |
| 1836 | GenericSchedulerThread::ThreadStateEnum |
| 1837 | TrackScheduler::threadLoopOnce(const GenericThreadStartArgsPtr& inArgs) |
| 1838 | { |
| 1839 | TrackArgsPtr args = std::dynamic_pointer_cast<TrackArgs>(inArgs); |
| 1840 | |
| 1841 | assert(args); |
| 1842 | |
| 1843 | ThreadStateEnum state = eThreadStateActive; |
| 1844 | TimeLinePtr timeline = args->getTimeLine(); |
| 1845 | ViewerInstance* viewer = args->getViewer(); |
| 1846 | int end = args->getEnd(); |
| 1847 | int start = args->getStart(); |
| 1848 | int cur = start; |
| 1849 | int frameStep = args->getStep(); |
| 1850 | int framesCount = 0; |
| 1851 | if (frameStep != 0) { |
| 1852 | framesCount = frameStep > 0 ? (end - start) / frameStep : (start - end) / std::abs(frameStep); |
| 1853 | } |
| 1854 | |
| 1855 | |
| 1856 | const std::vector<TrackMarkerAndOptionsPtr>& tracks = args->getTracks(); |
| 1857 | const int numTracks = (int)tracks.size(); |
| 1858 | std::vector<std::size_t> trackIndexes( tracks.size() ); |
| 1859 | for (std::size_t i = 0; i < tracks.size(); ++i) { |
| 1860 | trackIndexes[i] = i; |
| 1861 | tracks[i]->natronMarker->notifyTrackingStarted(); |
| 1862 | // unslave the enabled knob, since it is slaved to the gui but we may modify it |
| 1863 | KnobBoolPtr enabledKnob = tracks[i]->natronMarker->getEnabledKnob(); |
| 1864 | enabledKnob->unSlave(0, false); |
| 1865 | } |
| 1866 | |
| 1867 | // Beyond TRACKER_MAX_TRACKS_FOR_PARTIAL_VIEWER_UPDATE it becomes more expensive to render all partial rectangles |
| 1868 | // than just render the whole viewer RoI |
| 1869 | const bool doPartialUpdates = numTracks < TRACKER_MAX_TRACKS_FOR_PARTIAL_VIEWER_UPDATE; |
| 1870 | int lastValidFrame = frameStep > 0 ? start - 1 : start + 1; |
| 1871 | bool reportProgress = numTracks > 1 || framesCount > 1; |
| 1872 | EffectInstancePtr effect = _imp->getNode()->getEffectInstance(); |
| 1873 | timeval lastProgressUpdateTime; |
| 1874 | gettimeofday(&lastProgressUpdateTime, 0); |
| 1875 | |
| 1876 | bool allTrackFailed = false; |
| 1877 | { |
| 1878 | ///Use RAII style for setting the isDoingPartialUpdates flag so we're sure it gets removed |
| 1879 | IsTrackingFlagSetter_RAII __istrackingflag__(effect, this, frameStep, reportProgress, viewer, doPartialUpdates); |
| 1880 | |
| 1881 | if ( (frameStep == 0) || ( (frameStep > 0) && (start >= end) ) || ( (frameStep < 0) && (start <= end) ) ) { |
| 1882 | // Invalid range |
| 1883 | cur = end; |
| 1884 | } |
| 1885 | |
| 1886 | |
| 1887 | std::function<bool (const std::size_t&)> track = [&](const std::size_t &i) { |
| 1888 | return TrackSchedulerPrivate::trackStepFunctor(i, *args, cur); |
| 1889 | }; |
| 1890 | while (cur != end) { |
| 1891 | ///Launch parallel thread for each track using the global thread pool |
nothing calls this directly
no test coverage detected