X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvrender.C;h=42f83ef87e7d86e57a2c84a8bf7b4781fad41984;hb=c279e21fc2394a7908bbd1ba8c79b116fe9fb14a;hp=0b424c6440d7714310a4af3bf3686644adce8b61;hpb=5820b5f022aeec75ec03f7dd0121aa8a3d7f7590;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/vrender.C b/cinelerra-5.1/cinelerra/vrender.C index 0b424c64..42f83ef8 100644 --- a/cinelerra-5.1/cinelerra/vrender.C +++ b/cinelerra-5.1/cinelerra/vrender.C @@ -133,10 +133,10 @@ int VRender::process_buffer(int64_t input_position, 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. @@ -151,7 +151,9 @@ int VRender::process_buffer(int64_t input_position, // 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); @@ -177,9 +179,9 @@ int VRender::process_buffer(int64_t input_position, 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 * @@ -206,12 +208,8 @@ int VRender::process_buffer(int64_t input_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__); } @@ -249,111 +247,35 @@ int VRender::get_use_vconsole(VEdit **playable_edit, } -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()); - } - - if(asset) - { - 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); } } @@ -363,11 +285,6 @@ int VRender::get_colormodel(VEdit *playable_edit, } - - - - - void VRender::run() { int reconfigure; @@ -379,7 +296,7 @@ void VRender::run() // 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. @@ -432,11 +349,11 @@ void VRender::run() 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); @@ -545,9 +462,9 @@ void VRender::run() __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)); }