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);
-/* Insert timecode */
- if(renderengine->show_tc)
- insert_timecode(playable_edit,
- input_position,
- video_out);
+ 0);
+// use_asynchronous);
if(debug) printf("VRender::process_buffer %d\n", __LINE__);
}
}
-int VRender::insert_timecode(Edit* playable_edit,
- int64_t position,
- VFrame *output)
-{
-#if 0
- EDLSession *session = renderengine->edl->session;
- /* Create a vframe with TC and SRC timecode in white
- * with a black border */
- VFrame *input = new VFrame(0,
- output->get_w(), MIN(output->get_h(), 50),
- output->get_color_model(), output->get_bytes_per_line());
- char etc[12];
- char srctc[12];
- int src_position = 0;
-
-TRACE("VRender::insert_timecode 10")
-
- /* Edited TC */
- Units::totext(etc,
- (renderengine->vrender->current_position +
- session->get_frame_offset()) / session->frame_rate,
- session->time_format,
- session->sample_rate,
- session->frame_rate,
- session->frames_per_foot);
-
-TRACE("VRender::insert_timecode 20")
-
- if(playable_edit)
- {
-TRACE("VRender::insert_timecode 30")
- src_position = renderengine->vrender->current_position -
- playable_edit->startproject +
- playable_edit->startsource +
- playable_edit->asset->tcstart;
-TRACE("VRender::insert_timecode 40")
- Units::totext(srctc,
- src_position / playable_edit->asset->frame_rate,
- session->time_format,
- session->sample_rate,
- playable_edit->asset->frame_rate,
- session->frames_per_foot);
- }
- else
- {
-TRACE("VRender::insert_timecode 50")
- Units::totext(srctc,
- 0.0,
-// (renderengine->vrender->current_position - position) / session->frame_rate,
- session->time_format,
- session->sample_rate,
- session->frame_rate,
- session->frames_per_foot);
- }
-TRACE("VRender::insert_timecode 60")
-
-//printf("re position %i position %i\n",
-// renderengine->vrender->current_position, position);
-//printf("SRC %s TC %s\n", srctc, etc);
-
- /* Insert the timecode data onto the input frame */
-
- vrender->overlayer->overlay(output, input,
- input->x, input->y, input->width, input->height,
- output->x, output->y, output->width, output->height,
- 1, TRANSFER_REPLACE,
- renderengine->edl->session->interpolation_type);
- delete(input);
-UNTRACE
-#endif
- return 0;
-}
-
-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);
__LINE__, current_position, done);
// Update tracking.
- if(renderengine->command->realtime &&
- renderengine->playback_engine &&
- renderengine->command->command != CURRENT_FRAME)
+ if(renderengine->command->realtime && renderengine->playback_engine &&
+ renderengine->command->command != CURRENT_FRAME &&
+ renderengine->command->command != LAST_FRAME)
{
renderengine->playback_engine->update_tracking(fromunits(current_position));
}