clip fixes, ladspa build fixes
[goodguy/history.git] / cinelerra-5.1 / cinelerra / vmodule.C
index fd9d557e44c9f1566368e1c89a57cd0796b794f3..93d6f4d9e4fa73f782018ca5806db825312f43d3 100644 (file)
@@ -50,6 +50,7 @@
 #include "vedit.h"
 #include "vframe.h"
 #include "videodevice.h"
+#include "virtualvconsole.h"
 #include "vmodule.h"
 #include "vrender.h"
 #include "vplugin.h"
@@ -232,11 +233,7 @@ int VModule::import_frame(VFrame *output,
                                nested_command->get_edl()->copy_all(nested_edl);
                                nested_command->change_type = CHANGE_ALL;
                                nested_command->realtime = renderengine->command->realtime;
-                               nested_renderengine = new RenderEngine(0,
-                                       get_preferences(),
-                                       0,
-                                       renderengine ? renderengine->channeldb : 0,
-                                       1);
+                               nested_renderengine = new RenderEngine(0, get_preferences(), 0, 1);
                                nested_renderengine->set_vcache(get_cache());
                                nested_renderengine->arm_command(nested_command);
                        }
@@ -452,7 +449,8 @@ int VModule::import_frame(VFrame *output,
 //                     current_edit->asset->interlace_fixmethod);
 
                        // Determine the interlacing method to use.
-                       int interlace_fixmethod = ilaceautofixmethod2(get_edl()->session->interlace_mode,
+                       int interlace_fixmethod = !current_edit->asset ? ILACE_FIXMETHOD_NONE :
+                                ilaceautofixmethod2(get_edl()->session->interlace_mode,
                                        current_edit->asset->interlace_autofixoption,
                                        current_edit->asset->interlace_mode,
                                        current_edit->asset->interlace_fixmethod);
@@ -463,13 +461,13 @@ int VModule::import_frame(VFrame *output,
 
                        // Compensate for the said interlacing...
                        switch (interlace_fixmethod) {
-                               case BC_ILACE_FIXMETHOD_NONE:
+                               case ILACE_FIXMETHOD_NONE:
 
                                break;
-                               case BC_ILACE_FIXMETHOD_UPONE:
+                               case ILACE_FIXMETHOD_UPONE:
                                        out_y--;
                                break;
-                               case BC_ILACE_FIXMETHOD_DOWNONE:
+                               case ILACE_FIXMETHOD_DOWNONE:
                                        out_y++;
                                break;
                                default:
@@ -974,7 +972,7 @@ int VModule::render(VFrame *output,
 //printf("VModule::render %d %p %ld %d\n", __LINE__, current_edit, start_position_project, direction);
 
        if(debug_render)
-               printf("    VModule::render %d %d %ld %s transition=%p opengl=%d current_edit=%p output=%p\n",
+               printf("    VModule::render %d %d %jd %s transition=%p opengl=%d current_edit=%p output=%p\n",
                        __LINE__,
                        use_nudge,
                        start_position_project,
@@ -1082,21 +1080,34 @@ int VModule::render(VFrame *output,
                        use_opengl);
        }
 
-       int64_t mask_position = !renderengine ? start_position :
-               renderengine->vrender->current_position;
        Auto *current = 0;
        MaskAutos *keyframe_set =
                (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
-        MaskAuto *keyframe =
+       int64_t mask_position = !renderengine ? start_position :
+               renderengine->vrender->current_position;
+               MaskAuto *keyframe =
                (MaskAuto*)keyframe_set->get_prev_auto(mask_position, direction, current);
+
        if( keyframe->apply_before_plugins ) {
-               if( !masker ) {
-                       int cpus = renderengine ?
-                               renderengine->preferences->processors :
-                               plugin_array->mwindow->preferences->processors;
-                       masker = new MaskEngine(cpus);
+               VDeviceX11 *x11_device = 0;
+               if(use_opengl && renderengine && renderengine->video) {
+                       x11_device = (VDeviceX11*)renderengine->video->get_output_base();
+                       if( !x11_device->can_mask(mask_position, keyframe_set) )
+                               use_opengl = 0;
+               }
+               if( use_opengl && x11_device ) {
+                       x11_device->do_mask(output, mask_position, keyframe_set,
+                                       keyframe, keyframe);
+               }
+               else {
+                       if( !masker ) {
+                               int cpus = renderengine ?
+                                       renderengine->preferences->processors :
+                                       plugin_array->mwindow->preferences->processors;
+                               masker = new MaskEngine(cpus);
+                       }
+                       masker->do_mask(output, mask_position, keyframe_set, keyframe, keyframe);
                }
-               masker->do_mask(output, mask_position, keyframe_set, keyframe, keyframe);
        }
 
        return result;