#include "file.h"
#include "filexml.h"
#include "floatautos.h"
+#include "mainerror.h"
#include "maskauto.h"
#include "maskautos.h"
#include "mwindow.h"
input_temp ; // Menu effect
VFrame::get_temp(input, asset_w, asset_h, get_edl()->session->color_model);
- int use_cache = renderengine &&
- ( renderengine->command->single_frame() ||
- renderengine->command->get_direction() == PLAY_REVERSE );
+ int use_cache = renderengine->command->single_frame() ? 1 :
+ renderengine->command->get_direction() == PLAY_REVERSE ? -1 : 0;
// int use_asynchronous = !use_cache &&
// renderengine &&
// else
file->stop_video_thread();
-// cache transitions
VEdit *vnext = (VEdit *)current_edit->next;
pos = Units::to_int64((double)input_position / frame_rate * edl_rate);
- if( renderengine && renderengine->preferences->cache_transitions &&
- renderengine->command->get_direction() == PLAY_FORWARD &&
- current_edit->next && current_edit->next->transition &&
+ if( renderengine->preferences->cache_transitions && !use_cache &&
+// 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);
curr_pos += current_edit->startsource;
int64_t norm_pos = Units::to_int64((double)curr_pos *
current_edit->asset->frame_rate / edl_rate);
- VFrame *cache_frame = file->new_cache_frame(input, norm_pos, first_frame);
- if( cache_frame ) {
- file->set_video_position(norm_pos, 0);
- result = file->read_frame(cache_frame);
- file->put_cache_frame();
+ if( first_frame ) {
+ if( file->get_cache_frame(input, norm_pos) )
+ break; // if inside a cache run
+ first_frame = 0;
+ file->purge_cache(); // start new run
}
- else if( first_frame ) // already loaded
- break;
- first_frame = 0;
+ file->set_cache_frames(1);
+ file->set_video_position(norm_pos, 0);
+ result = file->read_frame(input);
++pos; --count;
}
use_cache = 1;
__LINE__,
this,
current_edit->asset->path);
- if( use_cache ) file->set_cache_frames(1);
+ if( use_cache )
+ file->set_cache_frames(use_cache);
result = file->read_frame((*input));
- if( use_cache ) file->set_cache_frames(0);
+ if( use_cache )
+ file->set_cache_frames(0);
(*input)->set_opengl_state(VFrame::RAM);
}
else
else if( file ) {
// Cache single frames
//memset(output->get_rows()[0], 0xff, 1024);
- if( use_cache ) file->set_cache_frames(1);
+ if( use_cache )
+ file->set_cache_frames(use_cache);
result = file->read_frame(output);
- if( use_cache ) file->set_cache_frames(0);
+ if( use_cache )
+ file->set_cache_frames(0);
output->set_opengl_state(VFrame::RAM);
}
}
// (*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