X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvirtualvnode.C;h=bd32638c35e5ba5ad4f41fc34c519a9ee7c81c4e;hp=1fb4846140f52c4fdc14393dbbe6f1ab2173f8f4;hb=a19a685a46ddc630010788707d9e5b9d2342af46;hpb=5820b5f022aeec75ec03f7dd0121aa8a3d7f7590 diff --git a/cinelerra-5.1/cinelerra/virtualvnode.C b/cinelerra-5.1/cinelerra/virtualvnode.C index 1fb48461..bd32638c 100644 --- a/cinelerra-5.1/cinelerra/virtualvnode.C +++ b/cinelerra-5.1/cinelerra/virtualvnode.C @@ -203,7 +203,8 @@ int VirtualVNode::render_as_module(VFrame *video_out, int64_t start_position_project = (int64_t)(start_position * edl_rate / frame_rate); - if(direction == PLAY_REVERSE) start_position_project--; + if(direction == PLAY_REVERSE && start_position_project > 0 ) + start_position_project--; // speed curve @@ -263,12 +264,6 @@ int VirtualVNode::render_as_module(VFrame *video_out, //printf("VirtualVNode::render_as_module\n"); //output_temp->dump_stacks(); - Edit *edit = 0; - if(renderengine->show_tc) - renderengine->vrender->insert_timecode(edit, - start_position, - output_temp); - return 0; } @@ -353,22 +348,26 @@ void VirtualVNode::render_mask(VFrame *output_temp, return; } - if(use_opengl) - { + if(use_opengl) { + if( !((VDeviceX11*)((VirtualVConsole*)vconsole)->get_vdriver())->can_mask( + start_position_project, keyframe_set) ) + use_opengl = 0; + + } + if(use_opengl) { ((VDeviceX11*)((VirtualVConsole*)vconsole)->get_vdriver())->do_mask( - output_temp, start_position_project, - keyframe_set, keyframe, keyframe); + output_temp, start_position_project, keyframe_set, + keyframe, keyframe); } - else - { + else { // Revert to software masker->do_mask(output_temp, start_position_project, - keyframe_set, keyframe, keyframe); + keyframe_set, keyframe, keyframe); } } -// Start of input fragment in project if forward. +// Start of input fragment in project if forward. // End of input fragment if reverse. int VirtualVNode::render_projector(VFrame *input, VFrame *output, int64_t start_position, double frame_rate, @@ -377,18 +376,19 @@ int VirtualVNode::render_projector(VFrame *input, VFrame *output, float in_x1, in_y1, in_x2, in_y2; float out_x1, out_y1, out_x2, out_y2; double edl_rate = renderengine->get_edl()->session->frame_rate; - int64_t start_position_project = (int64_t)(start_position * + int64_t start_position_project = (int64_t)(start_position * edl_rate / frame_rate); VRender *vrender = ((VirtualVConsole*)vconsole)->vrender; - if(vconsole->debug_tree) - printf(" VirtualVNode::render_projector input=%p output=%p cmodel=%d title=%s\n", + if(vconsole->debug_tree) + printf(" VirtualVNode::render_projector input=%p output=%p cmodel=%d title=%s\n", input, output, output->get_color_model(), track->title); if(output) { - ((VTrack*)track)->calculate_output_transfer(start_position_project, - renderengine->command->get_direction(), + int direction = renderengine->command->get_direction(); + ((VTrack*)track)->calculate_output_transfer( + start_position_project, direction, in_x1, in_y1, in_x2, in_y2, out_x1, out_y1, out_x2, out_y2); @@ -397,15 +397,14 @@ int VirtualVNode::render_projector(VFrame *input, VFrame *output, //for(int j = 0; j < input->get_w() * 3 * 5; j++) // input->get_rows()[0][j] = 255; -// - if(out_x2 > out_x1 && out_y2 > out_y1 && +// + if(out_x2 > out_x1 && out_y2 > out_y1 && in_x2 > in_x1 && in_y2 > in_y1) { - int direction = renderengine->command->get_direction(); - IntAuto *mode_keyframe = 0; - mode_keyframe = + Auto *auto_keyframe = 0; + IntAuto *mode_keyframe = (IntAuto*)track->automation->autos[AUTOMATION_MODE]->get_prev_auto( - start_position_project, direction, (Auto* &)mode_keyframe); + start_position_project, PLAY_FORWARD, auto_keyframe); int mode = mode_keyframe->value; @@ -421,24 +420,19 @@ int VirtualVNode::render_projector(VFrame *input, VFrame *output, if(use_opengl) { -// Nested EDL's overlay on a PBuffer instead of a screen -// is_nested < 0 ? flatten alpha channel, last draw before driver render - int is_nested = renderengine->is_nested ? 1 : - vconsole->current_exit_node == 0 ? -1 : 0; ((VDeviceX11*)((VirtualVConsole*)vconsole)->get_vdriver())->overlay( output, input, in_x1, in_y1, in_x2, in_y2, - out_x1, out_y1, out_x2, out_y2, - alpha, mode, - renderengine->get_edl(), - is_nested); + out_x1, out_y1, out_x2, out_y2, + alpha, mode, renderengine->get_edl(), + renderengine->is_nested); } else { vrender->overlayer->overlay(output, input, in_x1, in_y1, in_x2, in_y2, - out_x1, out_y1, out_x2, out_y2, - alpha, mode, + out_x1, out_y1, out_x2, out_y2, + alpha, mode, renderengine->get_edl()->session->interpolation_type); } }