int use_brender = 0;
int result = 0;
int use_cache = renderengine->command->single_frame();
- int use_asynchronous =
- renderengine->command->realtime &&
- renderengine->get_edl()->session->video_every_frame &&
- renderengine->get_edl()->session->video_asynchronous;
+// int use_asynchronous =
+// renderengine->command->realtime &&
+// renderengine->get_edl()->session->video_every_frame &&
+// renderengine->get_edl()->session->video_asynchronous;
const int debug = 0;
// Determine the rendering strategy for this frame.
// Get output buffer from device
if(renderengine->command->realtime && !renderengine->is_nested)
{
- renderengine->video->new_output_buffer(&video_out, colormodel);
+ renderengine->video->new_output_buffer(&video_out,
+ colormodel,
+ renderengine->get_edl());
}
if(debug) printf("VRender::process_buffer %d video_out=%p\n", __LINE__, video_out);
corrected_position--;
// Cache single frames only
- if(use_asynchronous)
- file->start_video_decode_thread();
- else
+// if(use_asynchronous)
+// file->start_video_decode_thread();
+// else
file->stop_video_thread();
if(use_cache) file->set_cache_frames(1);
int64_t normalized_position = (int64_t)(corrected_position *
renderengine->get_vcache(),
1,
use_cache,
- use_asynchronous);
+ 0);
+// use_asynchronous);
if(debug) printf("VRender::process_buffer %d\n", __LINE__);
}
}
-int VRender::get_colormodel(VEdit *playable_edit,
- int use_vconsole, int use_brender)
+int VRender::get_colormodel(VEdit *playable_edit, int use_vconsole, int use_brender)
{
+ EDL *edl = renderengine->get_edl();
int colormodel = renderengine->get_edl()->session->color_model;
-
- if(!use_vconsole && !renderengine->command->single_frame())
- {
+ VideoOutConfig *vconfig = renderengine->config->vconfig;
+// check for playback: no plugins, not single frame
+ if( !use_vconsole && !renderengine->command->single_frame() ) {
// Get best colormodel supported by the file
- int driver = renderengine->config->vconfig->driver;
- File *file;
- Asset *asset;
-
- if(use_brender)
- {
- asset = renderengine->preferences->brender_asset;
- }
- else
- {
- int64_t source_position = 0;
- asset = playable_edit->get_nested_asset(&source_position,
- current_position,
+// colormodel yuv/rgb affects mpeg/jpeg color range,
+// dont mix them or loose color acccuracy
+ int64_t source_position = 0;
+ Asset *asset = use_brender ?
+ renderengine->preferences->brender_asset :
+ playable_edit->get_nested_asset(&source_position, current_position,
renderengine->command->get_direction());
- }
-// ffmpeg files are side effected by color_model, affects colorspace,color_range
- if( asset && asset->format != FILE_FFMPEG )
- {
- file = renderengine->get_vcache()->check_out(asset,
- renderengine->get_edl());
-
- if(file)
- {
- colormodel = file->get_best_colormodel(driver);
+ if( asset ) {
+ File *file = renderengine->get_vcache()->check_out(asset, edl);
+ if( file ) {
+// damn the color range, full speed ahead
+ if( vconfig->driver == PLAYBACK_X11 && vconfig->use_direct_x11 &&
+ file->colormodel_supported(BC_BGR8888) == BC_BGR8888 )
+ colormodel = BC_BGR8888;
+ else {
+// file favorite colormodel may mismatch rgb/yuv
+ int vstream = playable_edit ? playable_edit->channel : -1;
+ int best_colormodel = file->get_best_colormodel(vconfig->driver, vstream);
+ if( BC_CModels::is_yuv(best_colormodel) == BC_CModels::is_yuv(colormodel) )
+ colormodel = best_colormodel;
+ }
renderengine->get_vcache()->check_in(asset);
}
}
}
-
-
-
-
-
void VRender::run()
{
int reconfigure;
// before we start dropping.
int64_t current_sample, start_sample, end_sample; // Absolute counts.
int64_t skip_countdown = VRENDER_THRESHOLD; // frames remaining until drop
- int64_t delay_countdown = VRENDER_THRESHOLD; // Frames remaining until delay
+ int64_t delay_countdown = 0; // Frames remaining until delay
// Number of frames before next reconfigure
int64_t current_input_length;
// Number of frames to skip.
current_sample = (int64_t)(renderengine->sync_position() *
renderengine->command->get_speed());
// latest sample at which the frame can be shown.
- end_sample = Units::tosamples(session_frame,
+ end_sample = Units::tosamples(session_frame + 1,
renderengine->get_edl()->session->sample_rate,
renderengine->get_edl()->session->frame_rate);
// earliest sample by which the frame needs to be shown.
- start_sample = Units::tosamples(session_frame - 1,
+ start_sample = Units::tosamples(session_frame,
renderengine->get_edl()->session->sample_rate,
renderengine->get_edl()->session->frame_rate);