ActionRetCodeEnum DiskCacheNode::getFrameRange(double *first, double *last) { int idx = _imp->frameRange.lock()->getValue(); switch (idx) { case 0: { EffectInstancePtr input = getInputRenderEffectAtAnyTimeView(0); if (input) { GetFrameRangeResultsPtr results; ActionRetCodeEnum stat = input->getFrameRange_public(&results); if (isFailureRetCode(stat)) { return stat; } RangeD range; results->getFrameRangeResults(&range); *first = range.min; *last = range.max; } break; } case 1: { TimeValue left, right; getApp()->getProject()->getFrameRange(&left, &right); *first = left; *last = right; break; } case 2: { *first = _imp->firstFrame.lock()->getValue(); *last = _imp->lastFrame.lock()->getValue(); }; default: break; } return eActionStatusOK; }
void NodeAnimPrivate::computeRetimeRange() { NodeGuiPtr nodeUI = nodeGui.lock(); NodePtr node = nodeUI->getNode(); if (!node) { return; } NodePtr input = node->getInput(0); if (!input) { return; } if (input) { RangeD inputRange = {0, 0}; { GetFrameRangeResultsPtr results; ActionRetCodeEnum stat = input->getEffectInstance()->getFrameRange_public(&results); if (!isFailureRetCode(stat)) { results->getFrameRangeResults(&inputRange); } } FramesNeededMap framesFirst, framesLast; { GetFramesNeededResultsPtr results; ActionRetCodeEnum stat = node->getEffectInstance()->getFramesNeeded_public(TimeValue(inputRange.min), ViewIdx(0), &results); if (!isFailureRetCode(stat)) { results->getFramesNeeded(&framesFirst); } stat = node->getEffectInstance()->getFramesNeeded_public(TimeValue(inputRange.max), ViewIdx(0), &results); if (!isFailureRetCode(stat)) { results->getFramesNeeded(&framesLast); } } assert( !framesFirst.empty() && !framesLast.empty() ); if ( framesFirst.empty() || framesLast.empty() ) { return; } { const FrameRangesMap& rangeFirst = framesFirst[0]; assert( !rangeFirst.empty() ); if ( rangeFirst.empty() ) { return; } FrameRangesMap::const_iterator it = rangeFirst.find( ViewIdx(0) ); assert( it != rangeFirst.end() ); if ( it == rangeFirst.end() ) { return; } const std::vector<OfxRangeD>& frames = it->second; assert( !frames.empty() ); if ( frames.empty() ) { return; } frameRange.min = (frames.front().min); } { FrameRangesMap& rangeLast = framesLast[0]; assert( !rangeLast.empty() ); if ( rangeLast.empty() ) { return; } FrameRangesMap::const_iterator it = rangeLast.find( ViewIdx(0) ); assert( it != rangeLast.end() ); if ( it == rangeLast.end() ) { return; } const std::vector<OfxRangeD>& frames = it->second; assert( !frames.empty() ); if ( frames.empty() ) { return; } frameRange.max = (frames.front().min); } } } // computeRetimeRange