X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvmodule.C;h=e2a2f7f6f8453e264919a08826694205b54104a3;hb=81fc9cd689dd964a4736fa1f8986a64db6b4a937;hp=a9bb93df93e0bfdf955dcef4c15e1354eb90f21b;hpb=2441cb0cb7f655fad2f76c982f2ac93897d09dbe;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/vmodule.C b/cinelerra-5.1/cinelerra/vmodule.C index a9bb93df..e2a2f7f6 100644 --- a/cinelerra-5.1/cinelerra/vmodule.C +++ b/cinelerra-5.1/cinelerra/vmodule.C @@ -32,6 +32,7 @@ #include "file.h" #include "filexml.h" #include "floatautos.h" +#include "mainerror.h" #include "maskauto.h" #include "maskautos.h" #include "mwindow.h" @@ -236,23 +237,18 @@ int VModule::import_frame(VFrame *output, VEdit *current_edit, // Make positions based on requested frame rate. int64_t position = Units::to_int64((double)pos * frame_rate / edl_rate); - int64_t max_position; + int64_t video_length; int asset_w, asset_h; if( file ) { asset_w = current_edit->asset->width; asset_h = current_edit->asset->height; - max_position = Units::to_int64((double)file->get_video_length() * - frame_rate / current_edit->asset->frame_rate - 1); + video_length = file->get_video_length(); } else { asset_w = nested_edl->session->output_w; asset_h = nested_edl->session->output_h; - max_position = Units::to_int64(nested_edl->tracks->total_length() * - frame_rate - 1); + video_length = nested_edl->tracks->total_length(); } - if( max_position < 0 ) max_position = 0; -// if we hit the end of stream, freeze at last frame - CLAMP(position, 0, max_position); VFrame *&input = commonrender ? ((VRender*)commonrender)->input_temp : // Realtime playback @@ -279,9 +275,9 @@ int VModule::import_frame(VFrame *output, VEdit *current_edit, VEdit *vnext = (VEdit *)current_edit->next; pos = Units::to_int64((double)input_position / frame_rate * edl_rate); if( renderengine->preferences->cache_transitions && !use_cache && -// cache transitions not using cache and inside transition - vnext && vnext->transition && file->get_video_length() >= 0 && - pos >= vnext->startproject && +// cache transitions, not caching and inside transition + vnext && vnext->transition && vnext->transition->on && + file->get_video_length() >= 0 && pos >= vnext->startproject && pos < vnext->startproject + vnext->transition->length ) { file->set_cache_frames(0); file->set_layer(current_edit->channel); @@ -301,6 +297,10 @@ int VModule::import_frame(VFrame *output, VEdit *current_edit, curr_pos += current_edit->startsource; int64_t norm_pos = Units::to_int64((double)curr_pos * current_edit->asset->frame_rate / edl_rate); + if( norm_pos < 0 || video_length < 0 ) + norm_pos = 0; + else if( norm_pos >= video_length ) + norm_pos = video_length-1; if( first_frame ) { if( file->get_cache_frame(input, norm_pos) ) break; // if inside a cache run @@ -317,6 +317,10 @@ int VModule::import_frame(VFrame *output, VEdit *current_edit, int64_t normalized_position = Units::to_int64((double)position * current_edit->asset->frame_rate / frame_rate); + if( normalized_position < 0 || video_length < 0 ) + normalized_position = 0; + else if( normalized_position >= video_length ) + normalized_position = video_length-1; //printf("VModule::import_frame %d %lld %lld\n", __LINE__, position, normalized_position); file->set_layer(current_edit->channel); file->set_video_position(normalized_position, 0); @@ -738,14 +742,18 @@ int VModule::render(VFrame *output, // (*transition_input), (*transition_input)->get_pbuffer(), // output, output->get_pbuffer()); + if( transition_server ) { // Execute plugin with transition_input and output here - if( renderengine ) - transition_server->set_use_opengl(use_opengl, renderengine->video); - transition_server->process_transition((*transition_input), output, - (direction == PLAY_FORWARD) ? - (start_position_project - current_edit->startproject) : - (start_position_project - current_edit->startproject - 1), - transition->length); + if( renderengine ) + transition_server->set_use_opengl(use_opengl, renderengine->video); + transition_server->process_transition((*transition_input), output, + (direction == PLAY_FORWARD) ? + (start_position_project - current_edit->startproject) : + (start_position_project - current_edit->startproject - 1), + transition->length); + } + else + eprintf("missing transition plugin: %s\n", transition->title); } else { // Load output buffer