2 #include "automation.h"
7 #include "edlsession.h"
8 #include "fadeengine.h"
10 #include "floatautos.h"
13 #include "maskengine.h"
16 #include "overlayframe.h"
17 #include "playabletracks.h"
19 #include "preferences.h"
20 #include "renderengine.h"
21 #include "transition.h"
22 #include "transportque.h"
23 #include "vattachmentpoint.h"
26 #include "virtualvconsole.h"
27 #include "virtualvnode.h"
35 VirtualVNode::VirtualVNode(RenderEngine *renderengine,
36 VirtualConsole *vconsole,
40 VirtualNode *parent_node)
41 : VirtualNode(renderengine,
48 VRender *vrender = ((VirtualVConsole*)vconsole)->vrender;
49 fader = new FadeEngine(renderengine->preferences->processors);
50 masker = new MaskEngine(renderengine->preferences->processors);
53 VirtualVNode::~VirtualVNode()
59 VirtualNode* VirtualVNode::create_module(Plugin *real_plugin,
63 return new VirtualVNode(renderengine,
72 VirtualNode* VirtualVNode::create_plugin(Plugin *real_plugin)
74 return new VirtualVNode(renderengine,
82 int VirtualVNode::read_data(VFrame *output_temp,
83 int64_t start_position,
86 VirtualNode *previous_plugin = 0;
88 if(!output_temp) printf("VirtualVNode::read_data output_temp=%p\n", output_temp);
90 if(vconsole->debug_tree)
91 printf(" VirtualVNode::read_data position=%lld rate=%f title=%s\n",
96 // This is a plugin on parent module with a preceeding effect.
97 // Get data from preceeding effect on parent module.
98 if(parent_node && (previous_plugin = parent_node->get_previous_plugin(this)))
100 return ((VirtualVNode*)previous_plugin)->render(output_temp,
105 // First plugin on parent module.
106 // Read data from parent module
109 return ((VirtualVNode*)parent_node)->read_data(output_temp,
115 // This is the first node in the tree
116 return ((VModule*)real_module)->render(output_temp,
118 renderengine->command->get_direction(),
121 vconsole->debug_tree);
128 int VirtualVNode::render(VFrame *output_temp,
129 int64_t start_position,
132 VRender *vrender = ((VirtualVConsole*)vconsole)->vrender;
135 //printf("VirtualVNode::render 1\n");
136 render_as_module(vrender->video_out,
140 //printf("VirtualVNode::render 10\n");
145 render_as_plugin(output_temp,
152 void VirtualVNode::render_as_plugin(VFrame *output_temp,
153 int64_t start_position,
158 !real_plugin->on) return;
161 if(vconsole->debug_tree)
162 printf(" VirtualVNode::render_as_plugin title=%s\n", track->title);
164 ((VAttachmentPoint*)attachment)->render(
166 plugin_buffer_number,
169 vconsole->debug_tree);
173 int VirtualVNode::render_as_module(VFrame **video_out,
175 int64_t start_position,
179 int direction = renderengine->command->get_direction();
180 double edl_rate = renderengine->edl->session->frame_rate;
182 if(vconsole->debug_tree)
183 printf(" VirtualVNode::render_as_module title=%s\n", track->title);
185 // Process last subnode. This propogates up the chain of subnodes and finishes
189 VirtualVNode *node = (VirtualVNode*)subnodes.values[subnodes.total - 1];
190 node->render(output_temp,
195 // Read data from previous entity
197 read_data(output_temp,
202 render_fade(output_temp,
205 track->automation->fade_autos,
208 // Apply mask to output
209 masker->do_mask(output_temp,
213 track->automation->mask_autos,
217 // overlay on the final output
220 int mute_fragment = 1;
221 int64_t mute_position = 0;
225 get_mute_fragment(start_position,
228 (Autos*)((VTrack*)track)->automation->mute_autos,
234 // Fragment is playable
235 render_projector(output_temp,
242 if(renderengine->show_tc)
243 renderengine->vrender->insert_timecode(edit,
250 int VirtualVNode::render_fade(VFrame *output,
251 // start of input fragment in project if forward / end of input fragment if reverse
252 // relative to requested frame rate
253 int64_t start_position,
258 double slope, intercept;
259 int64_t slope_len = 1;
260 FloatAuto *previous = 0;
262 double edl_rate = renderengine->edl->session->frame_rate;
263 int64_t start_position_project = (int64_t)(start_position *
267 if(vconsole->debug_tree)
268 printf(" VirtualVNode::render_fade title=%s\n", track->title);
270 intercept = ((FloatAutos*)autos)->get_value(start_position_project,
276 CLAMP(intercept, 0, 100);
279 // Can't use overlay here because overlayer blends the frame with itself.
280 // The fade engine can compensate for lack of alpha channels by reducing the
282 if(!EQUIV(intercept / 100, 1))
284 fader->do_fade(output, output, intercept / 100);
290 // Start of input fragment in project if forward. End of input fragment if reverse.
291 int VirtualVNode::render_projector(VFrame *input,
293 int64_t start_position,
296 float in_x1, in_y1, in_x2, in_y2;
297 float out_x1, out_y1, out_x2, out_y2;
298 double edl_rate = renderengine->edl->session->frame_rate;
299 int64_t start_position_project = (int64_t)(start_position *
302 VRender *vrender = ((VirtualVConsole*)vconsole)->vrender;
303 if(vconsole->debug_tree)
304 printf(" VirtualVNode::render_projector title=%s\n", track->title);
306 for(int i = 0; i < MAX_CHANNELS; i++)
310 ((VTrack*)track)->calculate_output_transfer(i,
311 start_position_project,
312 renderengine->command->get_direction(),
327 //for(int j = 0; j < input->get_w() * 3 * 5; j++)
328 // input->get_rows()[0][j] = 255;
330 if(out_x2 > out_x1 &&
335 int direction = renderengine->command->get_direction();
336 IntAuto *mode_keyframe = 0;
338 (IntAuto*)track->automation->mode_autos->get_prev_auto(
339 start_position_project,
341 (Auto*&)mode_keyframe);
343 int mode = mode_keyframe->value;
345 // Fade is performed in render_fade so as to allow this module
346 // to be chained in another module, thus only 4 component colormodels
347 // can do dissolves, although a blend equation is still required for 3 component
348 // colormodels since fractional translation requires blending.
350 // If this is the only playable video track and the mode_keyframe is "normal"
351 // the mode keyframe may be overridden with "replace". Replace is faster.
352 if(mode == TRANSFER_NORMAL &&
353 vconsole->total_entry_nodes == 1)
354 mode = TRANSFER_REPLACE;
357 vrender->overlayer->overlay(output[i],
369 renderengine->edl->session->interpolation_type);
371 // for(int j = 0; j < output[i]->get_w() * 3 * 5; j++)
372 // output[i]->get_rows()[0][j] = 255;