X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvmodule.C;h=3ef17f0436d714bf0aa4175ed9f6e292a3f1cf89;hp=93d6f4d9e4fa73f782018ca5806db825312f43d3;hb=2e48b660e37eb5c661264d601211e16cb6cd6e89;hpb=49f85559268fc040fe7ba5611cc0520793cf728b diff --git a/cinelerra-5.1/cinelerra/vmodule.C b/cinelerra-5.1/cinelerra/vmodule.C index 93d6f4d9..3ef17f04 100644 --- a/cinelerra-5.1/cinelerra/vmodule.C +++ b/cinelerra-5.1/cinelerra/vmodule.C @@ -105,54 +105,31 @@ CICache* VModule::get_cache() -int VModule::import_frame(VFrame *output, - VEdit *current_edit, - int64_t input_position, - double frame_rate, - int direction, - int use_opengl) +int VModule::import_frame(VFrame *output, VEdit *current_edit, + int64_t input_position, double frame_rate, int direction, int use_opengl) { int64_t direction_position; // Translation of edit - float in_x; - float in_y; - float in_w; - float in_h; - float out_x; - float out_y; - float out_w; - float out_h; + float in_x, in_y, in_w, in_h; + float out_x, out_y, out_w, out_h; int result = 0; const int debug = 0; double edl_rate = get_edl()->session->frame_rate; int64_t input_position_project = Units::to_int64(input_position * - edl_rate / - frame_rate + - 0.001); - - - - - - + edl_rate / frame_rate + 0.001); if(!output) printf("VModule::import_frame %d output=%p\n", __LINE__, output); //output->dump_params(); - if(debug) printf("VModule::import_frame %d this=%p input_position=%lld direction=%d\n", - __LINE__, - this, - (long long)input_position, - direction); + __LINE__, this, (long long)input_position, direction); // Convert to position corrected for direction direction_position = input_position; - if(direction == PLAY_REVERSE) - { - direction_position--; - input_position_project--; + if(direction == PLAY_REVERSE) { + if( direction_position > 0 ) direction_position--; + if( input_position_project > 0 ) input_position_project--; } if(!output) printf("VModule::import_frame %d output=%p\n", __LINE__, output); @@ -168,33 +145,24 @@ int VModule::import_frame(VFrame *output, } if(!output) printf("VModule::import_frame %d output=%p x11_device=%p nested_edl=%p\n", - __LINE__, - output, - x11_device, - nested_edl); - + __LINE__, output, x11_device, nested_edl); if(debug) printf("VModule::import_frame %d current_edit=%p\n", - __LINE__, - current_edit); - + __LINE__, current_edit); // Load frame into output // Create objects for nested EDL - if(current_edit && - current_edit->nested_edl) - { + if(current_edit && current_edit->nested_edl) { int command; if(debug) printf("VModule::import_frame %d nested_edl=%p current_edit->nested_edl=%p\n", - __LINE__, - nested_edl, - current_edit->nested_edl); + __LINE__, nested_edl, current_edit->nested_edl); // Convert requested direction to command - if(renderengine->command->command == CURRENT_FRAME) + if( renderengine->command->command == CURRENT_FRAME || + renderengine->command->command == LAST_FRAME ) { - command = CURRENT_FRAME; + command = renderengine->command->command; } else if(direction == PLAY_REVERSE) @@ -255,7 +223,14 @@ int VModule::import_frame(VFrame *output, } if(debug) printf("VModule::import_frame %d\n", __LINE__); - if(!output) printf("VModule::import_frame %d output=%p\n", __LINE__, output); + if( output ) { + if( use_opengl ) + x11_device->clear_input(output); + else + output->clear_frame(); + } + else + printf("VModule::import_frame %d output=%p\n", __LINE__, output); if(current_edit && (current_edit->asset || @@ -263,11 +238,8 @@ int VModule::import_frame(VFrame *output, { File *file = 0; - if(debug) printf("VModule::import_frame %d cache=%p\n", - __LINE__, - get_cache()); - if(current_edit->asset) - { +//printf("VModule::import_frame %d cache=%p\n", __LINE__, get_cache()); + if( current_edit->asset ) { get_cache()->age(); file = get_cache()->check_out(current_edit->asset, get_edl()); @@ -299,17 +271,9 @@ int VModule::import_frame(VFrame *output, { // integrate position from start of edit. double speed_position = edit_startsource; - FloatAuto *previous = 0; - FloatAuto *next = 0; FloatAutos *speed_autos = (FloatAutos*)track->automation->autos[AUTOMATION_SPEED]; - for(int64_t i = edit_startproject; i < direction_position; i++) - { - double speed = speed_autos->get_value(i, - PLAY_FORWARD, - previous, - next); - speed_position += speed; - } + speed_position += speed_autos->automation_integral(edit_startproject, + direction_position-edit_startproject, PLAY_FORWARD); //printf("VModule::import_frame %d %lld %lld\n", __LINE__, position, (int64_t)speed_position); position = (int64_t)speed_position; } @@ -337,7 +301,7 @@ int VModule::import_frame(VFrame *output, } else { - max_position = Units::to_int64(nested_edl->tracks->total_playable_length() * + max_position = Units::to_int64(nested_edl->tracks->total_length() * frame_rate - 1); } @@ -348,18 +312,19 @@ int VModule::import_frame(VFrame *output, int use_cache = renderengine && renderengine->command->single_frame(); - int use_asynchronous = !use_cache && renderengine && +// int use_asynchronous = !use_cache && +// renderengine && // Try to make rendering go faster. // But converts some formats to YUV420, which may degrade input format. -// renderengine->command->realtime && - renderengine->get_edl()->session->video_asynchronous; +//// renderengine->command->realtime && +// renderengine->get_edl()->session->video_asynchronous; if(file) { if(debug) printf("VModule::import_frame %d\n", __LINE__); - if(use_asynchronous) - file->start_video_decode_thread(); - else +// if(use_asynchronous) +// file->start_video_decode_thread(); +// else file->stop_video_thread(); int64_t normalized_position = Units::to_int64(position * @@ -486,7 +451,7 @@ int VModule::import_frame(VFrame *output, !EQUIV(in_w, asset_w) || !EQUIV(in_h, asset_h)) { - if(debug) printf("VModule::import_frame %d file -> temp -> output\n", __LINE__); +//printf("VModule::import_frame %d file -> temp -> output\n", __LINE__); @@ -521,12 +486,9 @@ int VModule::import_frame(VFrame *output, if(!(*input)) { - (*input) = new VFrame(0, - -1, - asset_w, - asset_h, - get_edl()->session->color_model, - -1); + (*input) = + new VFrame(asset_w, asset_h, + get_edl()->session->color_model); } @@ -766,7 +728,13 @@ output->get_opengl_state(), get_edl()->session->interpolation_type); } result = 1; + output->copy_stacks((*input)); + + +//printf("VModule::import_frame %d\n", __LINE__); +//(*input)->dump_params(); +//output->dump_params(); } else // file -> output @@ -910,17 +878,13 @@ current_cmodel); else // Source not found { - if(debug) printf("VModule::import_frame %d\n", __LINE__); - if(use_opengl) - { - x11_device->clear_input(output); - } - else - { - output->clear_frame(); - } result = 1; } + +// printf("VModule::import_frame %d cache=%p\n", +// __LINE__, +// get_cache()); + } else // Source is silence @@ -1021,12 +985,9 @@ int VModule::render(VFrame *output, // Load incoming frame if(!(*transition_input)) { - (*transition_input) = new VFrame(0, - -1, - track->track_w, - track->track_h, - get_edl()->session->color_model, - -1); + (*transition_input) = + new VFrame(track->track_w, track->track_h, + get_edl()->session->color_model); } (*transition_input)->copy_stacks(output);