/* set up and run a processor */ void CrossFadePlugin::setupAndProcess(OFX::ImageBlenderBase &processor, const OFX::RenderArguments &args) { // get a dst image std::auto_ptr<OFX::Image> dst(dstClip_->fetchImage(args.time)); OFX::BitDepthEnum dstBitDepth = dst->getPixelDepth(); OFX::PixelComponentEnum dstComponents = dst->getPixelComponents(); // fetch the two source images std::auto_ptr<OFX::Image> fromImg(fromClip_->fetchImage(args.time)); std::auto_ptr<OFX::Image> toImg(toClip_->fetchImage(args.time)); // make sure bit depths are sane if(fromImg.get()) checkComponents(*fromImg, dstBitDepth, dstComponents); if(toImg.get()) checkComponents(*toImg, dstBitDepth, dstComponents); // get the transition value float blend = (float)transition_->getValueAtTime(args.time); // set the images processor.setDstImg(dst.get()); processor.setFromImg(fromImg.get()); processor.setToImg(toImg.get()); // set the render window processor.setRenderWindow(args.renderWindow); // set the scales processor.setBlend(blend); // Call the base class process member, this will call the derived templated process code processor.process(); }
/* set up and run a processor */ void RetimerPlugin::setupAndProcess(OFX::ImageBlenderBase &processor, const OFX::RenderArguments &args) { // get a dst image std::auto_ptr<OFX::Image> dst(dstClip_->fetchImage(args.time)); OFX::BitDepthEnum dstBitDepth = dst->getPixelDepth(); OFX::PixelComponentEnum dstComponents = dst->getPixelComponents(); // figure the frame we should be retiming from double sourceTime; if(getContext() == OFX::eContextRetimer) { // the host is specifying it, so fetch it from the "sourceTime" pseudo-param sourceTime = sourceTime_->getValueAtTime(args.time); } else { // we have our own param, which is a speed, so we integrate it to get the time we want sourceTime = speed_->integrate(0, args.time); } // figure the two images we are blending between double fromTime, toTime; double blend; if(args.fieldToRender == OFX::eFieldNone) { // unfielded, easy peasy fromTime = floor(sourceTime); toTime = fromTime + 1; blend = sourceTime - fromTime; } else { // Fielded clips, pook. We are rendering field doubled images, // and so need to blend between fields, not frames. double frac = sourceTime - floor(sourceTime); if(frac < 0.5) { // need to go between the first and second fields of this frame fromTime = floor(sourceTime); // this will get the first field toTime = fromTime + 0.5; // this will get the second field of the same frame blend = frac * 2.0; // and the blend is between those two } else { // frac > 0.5 fromTime = floor(sourceTime) + 0.5; // this will get the second field of this frame toTime = floor(sourceTime) + 1.0; // this will get the first field of the next frame blend = (frac - 0.5) * 2.0; } } // fetch the two source images std::auto_ptr<OFX::Image> fromImg(srcClip_->fetchImage(fromTime)); std::auto_ptr<OFX::Image> toImg(srcClip_->fetchImage(toTime)); // make sure bit depths are sane if(fromImg.get()) checkComponents(*fromImg, dstBitDepth, dstComponents); if(toImg.get()) checkComponents(*toImg, dstBitDepth, dstComponents); // set the images processor.setDstImg(dst.get()); processor.setFromImg(fromImg.get()); processor.setToImg(toImg.get()); // set the render window processor.setRenderWindow(args.renderWindow); // set the blend between processor.setBlend((float)blend); // Call the base class process member, this will call the derived templated process code processor.process(); }