* @brief Called whenever there are images available to process in the buffer. * Once processed, the frame will be removed from the buffer. * * According to the ProcessFrameModeEnum given to the scheduler this function will be called either by the scheduler thread (this) * or by the application's main-thread (typically to do OpenGL rendering). **/
| 2402 | * or by the application's main-thread (typically to do OpenGL rendering). |
| 2403 | **/ |
| 2404 | void |
| 2405 | DefaultScheduler::processFrame(const BufferedFrames& frames) |
| 2406 | { |
| 2407 | assert( !frames.empty() ); |
| 2408 | //Only consider the first frame, we shouldn't have multiple view here anyway. |
| 2409 | const BufferedFrame& frame = frames.front(); |
| 2410 | |
| 2411 | ///Writers render to scale 1 always |
| 2412 | RenderScale scale(1.); |
| 2413 | OutputEffectInstancePtr effect = _effect.lock(); |
| 2414 | U64 hash = effect->getHash(); |
| 2415 | bool isProjectFormat; |
| 2416 | RectD rod; |
| 2417 | RectI roi; |
| 2418 | std::list<ImagePlaneDesc> components; |
| 2419 | |
| 2420 | { |
| 2421 | ImagePlaneDesc metadataPlane, metadataPairedPlane; |
| 2422 | effect->getMetadataComponents(-1, &metadataPlane, &metadataPairedPlane); |
| 2423 | if (metadataPlane.getNumComponents() > 0) { |
| 2424 | components.push_back(metadataPlane); |
| 2425 | } |
| 2426 | } |
| 2427 | |
| 2428 | ImageBitDepthEnum imageDepth = effect->getBitDepth(-1); |
| 2429 | const double par = effect->getAspectRatio(-1); |
| 2430 | const bool isRenderDueToRenderInteraction = false; |
| 2431 | const bool isSequentialRender = true; |
| 2432 | |
| 2433 | for (BufferedFrames::const_iterator it = frames.begin(); it != frames.end(); ++it) { |
| 2434 | AbortableRenderInfoPtr abortInfo = AbortableRenderInfo::create(true, 0); |
| 2435 | |
| 2436 | setAbortInfo(isRenderDueToRenderInteraction, abortInfo, effect); |
| 2437 | |
| 2438 | ParallelRenderArgsSetter frameRenderArgs(it->time, |
| 2439 | it->view, |
| 2440 | isRenderDueToRenderInteraction, // is this render due to user interaction ? |
| 2441 | isSequentialRender, // is this sequential ? |
| 2442 | abortInfo, //abortInfo |
| 2443 | effect->getNode(), //tree root |
| 2444 | 0, //texture index |
| 2445 | effect->getApp()->getTimeLine().get(), |
| 2446 | NodePtr(), |
| 2447 | false, |
| 2448 | false, |
| 2449 | it->stats); |
| 2450 | |
| 2451 | ignore_result( effect->getRegionOfDefinition_public(hash, it->time, scale, it->view, &rod, &isProjectFormat) ); |
| 2452 | rod.toPixelEnclosing(0, par, &roi); |
| 2453 | |
| 2454 | |
| 2455 | RenderingFlagSetter flagIsRendering( effect->getNode() ); |
| 2456 | ImagePtr inputImage = std::dynamic_pointer_cast<Image>(it->frame); |
| 2457 | assert(inputImage); |
| 2458 | |
| 2459 | EffectInstance::InputImagesMap inputImages; |
| 2460 | inputImages[0].push_back(inputImage); |
| 2461 | std::unique_ptr<EffectInstance::RenderRoIArgs> renderArgs( new EffectInstance::RenderRoIArgs(frame.time, |
nothing calls this directly
no test coverage detected