refresh frame fix, dblclk proxy viewer fix, vicon refresh fix for awdw resize, fix...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / vrender.C
index 0b424c6440d7714310a4af3bf3686644adce8b61..42f83ef87e7d86e57a2c84a8bf7b4781fad41984 100644 (file)
@@ -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));
                }