5 #include "commonrender.h"
8 #include "edlsession.h"
11 #include "floatautos.h"
13 #include "overlayframe.h"
15 #include "pluginarray.h"
16 #include "preferences.h"
17 #include "renderengine.h"
18 #include "sharedlocation.h"
19 #include "transition.h"
20 #include "transportque.h"
22 #include "vattachmentpoint.h"
23 #include "vdevicex11.h"
26 #include "videodevice.h"
32 #include "interlacemodes.h"
33 #include "maskengine.h"
34 #include "automation.h"
36 VModule::VModule(RenderEngine *renderengine,
37 CommonRender *commonrender,
38 PluginArray *plugin_array,
40 : Module(renderengine, commonrender, plugin_array, track)
42 data_type = TRACK_VIDEO;
47 masker = new MaskEngine(renderengine->preferences->processors);
49 masker = new MaskEngine(plugin_array->mwindow->preferences->processors);
55 if(overlay_temp) delete overlay_temp;
56 if(input_temp) delete input_temp;
57 if(transition_temp) delete transition_temp;
62 AttachmentPoint* VModule::new_attachment(Plugin *plugin)
64 return new VAttachmentPoint(renderengine, plugin);
67 int VModule::get_buffer_size()
72 CICache* VModule::get_cache()
75 return renderengine->get_vcache();
80 int VModule::import_frame(VFrame *output,
82 int64_t input_position,
87 int64_t corrected_position;
88 int64_t corrected_position_project;
89 // Translation of edit
99 double edl_rate = get_edl()->session->frame_rate;
100 int64_t input_position_project = (int64_t)(input_position *
104 if(!output) printf("VModule::import_frame 10 output=%p\n", output);
106 corrected_position = input_position;
107 corrected_position_project = input_position_project;
108 if(direction == PLAY_REVERSE)
110 corrected_position--;
111 input_position_project--;
114 VDeviceX11 *x11_device = 0;
117 if(renderengine && renderengine->video)
119 x11_device = (VDeviceX11*)renderengine->video->get_output_base();
120 output->set_opengl_state(VFrame::RAM);
125 // Load frame into output
130 File *source = get_cache()->check_out(current_edit->asset);
131 // get_cache()->dump();
135 int64_t edit_startproject = (int64_t)(current_edit->startproject *
138 int64_t edit_startsource = (int64_t)(current_edit->startsource *
141 uint64_t position = corrected_position -
144 // if we hit the end of stream, freeze at last frame
145 uint64_t max_position = source->get_video_length(frame_rate) - 1;
146 if (position > max_position) position = max_position;
147 source->set_video_position(position,
149 source->set_layer(current_edit->channel);
151 ((VTrack*)track)->calculate_input_transfer(current_edit->asset,
152 input_position_project,
164 // printf("VModule::import_frame 1 [ilace] Project: mode (%d) Asset: autofixoption (%d), mode (%d), method (%d)\n",
165 // get_edl()->session->interlace_mode,
166 // current_edit->asset->interlace_autofixoption,
167 // current_edit->asset->interlace_mode,
168 // current_edit->asset->interlace_fixmethod);
170 // Determine the interlacing method to use.
171 int interlace_fixmethod = ilaceautofixmethod2(get_edl()->session->interlace_mode,
172 current_edit->asset->interlace_autofixoption,
173 current_edit->asset->interlace_mode,
174 current_edit->asset->interlace_fixmethod);
176 // char string[BCTEXTLEN];
177 // ilacefixmethod_to_text(string,interlace_fixmethod);
178 // printf("VModule::import_frame 1 [ilace] Compensating by using: '%s'\n",string);
180 // Compensate for the said interlacing...
181 switch (interlace_fixmethod) {
182 case BC_ILACE_FIXMETHOD_NONE:
185 case BC_ILACE_FIXMETHOD_UPONE:
188 case BC_ILACE_FIXMETHOD_DOWNONE:
192 printf("vmodule::importframe WARNING - unknown fix method for interlacing, no compensation in effect\n");
196 // file -> temp -> output
197 if( !EQUIV(in_x1, 0) ||
199 !EQUIV(in_w1, track->track_w) ||
200 !EQUIV(in_h1, track->track_h) ||
203 !EQUIV(out_w1, track->track_w) ||
204 !EQUIV(out_h1, track->track_h) ||
205 !EQUIV(in_w1, current_edit->asset->width) ||
206 !EQUIV(in_h1, current_edit->asset->height))
212 // Get temporary input buffer
217 VRender *vrender = (VRender*)commonrender;
218 input = &vrender->input_temp;
228 ((*input)->get_w() != current_edit->asset->width ||
229 (*input)->get_h() != current_edit->asset->height))
241 (*input) = new VFrame(0,
242 current_edit->asset->width,
243 current_edit->asset->height,
244 get_edl()->session->color_model,
250 (*input)->copy_stacks(output);
253 // Cache for single frame only
254 // if(renderengine && renderengine->command->single_frame())
255 source->set_cache_frames(1);
256 result = source->read_frame((*input));
257 // if(renderengine && renderengine->command->single_frame())
258 source->set_cache_frames(0);
259 (*input)->set_opengl_state(VFrame::RAM);
261 //printf("VModule::import_frame 1 %lld %f\n", input_position, frame_rate);
263 // Find an overlayer object to perform the camera transformation
264 OverlayFrame *overlayer = 0;
266 // OpenGL playback uses hardware
274 VRender *vrender = (VRender*)commonrender;
275 overlayer = vrender->overlayer;
281 printf("VModule::import_frame neither plugin_array nor commonrender is defined.\n");
284 overlay_temp = new OverlayFrame(plugin_array->mwindow->preferences->processors);
287 overlayer = overlay_temp;
289 // printf("VModule::import_frame 1 %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f\n",
300 // for(int j = 0; j < output->get_w() * 3 * 5; j++)
301 // output->get_rows()[0][j] = 255;
305 x11_device->do_camera(output,
318 output->clear_frame();
321 // get_cache()->check_in(current_edit->asset);
324 // TRANSFER_REPLACE is the fastest transfer mode but it has the disadvantage
325 // of producing green borders in floating point translation of YUV
326 int mode = TRANSFER_REPLACE;
327 if(get_edl()->session->interpolation_type != NEAREST_NEIGHBOR &&
328 cmodel_is_yuv(output->get_color_model()))
329 mode = TRANSFER_NORMAL;
331 overlayer->overlay(output,
343 get_edl()->session->interpolation_type);
346 output->copy_stacks((*input));
351 // Cache single frames only
352 // if(renderengine && renderengine->command->single_frame())
353 source->set_cache_frames(1);
354 result = source->read_frame(output);
355 // if(renderengine && renderengine->command->single_frame())
356 source->set_cache_frames(0);
357 output->set_opengl_state(VFrame::RAM);
360 get_cache()->check_in(current_edit->asset);
366 x11_device->clear_input(output);
370 output->clear_frame();
380 x11_device->clear_input(output);
384 output->clear_frame();
394 int VModule::render(VFrame *output,
395 int64_t start_position,
403 double edl_rate = get_edl()->session->frame_rate;
405 if(use_nudge) start_position += (int64_t)(track->nudge *
409 int64_t start_position_project = (int64_t)(start_position *
414 update_transition(start_position_project,
417 VEdit* current_edit = (VEdit*)track->edits->editof(start_position_project,
420 VEdit* previous_edit = 0;
423 printf(" VModule::render %d %lld %s transition=%p opengl=%d current_edit=%p output=%p\n",
425 start_position_project,
434 output->clear_frame();
435 // We do not apply mask here, since alpha is 0, and neither substracting nor multypling changes it
436 // Another mask mode - "addition" should be added to be able to create mask from empty frames
437 // in this case we would call masking here too...
444 // Process transition
448 // Get temporary buffer
449 VFrame **transition_input = 0;
452 VRender *vrender = (VRender*)commonrender;
453 transition_input = &vrender->transition_temp;
457 transition_input = &transition_temp;
460 if((*transition_input) &&
461 ((*transition_input)->get_w() != track->track_w ||
462 (*transition_input)->get_h() != track->track_h))
464 delete (*transition_input);
465 (*transition_input) = 0;
468 // Load incoming frame
469 if(!(*transition_input))
471 (*transition_input) = new VFrame(0,
474 get_edl()->session->color_model,
478 result = import_frame((*transition_input),
486 // Load transition buffer
487 previous_edit = (VEdit*)current_edit->previous;
489 result |= import_frame(output,
496 // Execute plugin with transition_input and output here
498 transition_server->set_use_opengl(use_opengl, renderengine->video);
499 transition_server->process_transition((*transition_input),
501 (direction == PLAY_FORWARD) ?
502 (start_position_project - current_edit->startproject) :
503 (start_position_project - current_edit->startproject - 1),
508 // Load output buffer
509 result = import_frame(output,
517 int64_t mask_position;
519 mask_position = renderengine->vrender->current_position;
521 mask_position = start_position;
522 masker->do_mask(output,
526 (MaskAutos*)track->automation->autos[AUTOMATION_MASK],
528 1); // we are calling before plugins
539 void VModule::create_objects()
541 Module::create_objects();