X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvedit.C;h=c40f72d8b31efb01b2c927e308419a6672a9c5c6;hp=7f0115b08993cf14ccbe92cb02e6590a5f186d2c;hb=502b6f3b6fd04f6b01c6d70dcb81aa304dd0db1c;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd diff --git a/cinelerra-5.1/cinelerra/vedit.C b/cinelerra-5.1/cinelerra/vedit.C index 7f0115b0..c40f72d8 100644 --- a/cinelerra-5.1/cinelerra/vedit.C +++ b/cinelerra-5.1/cinelerra/vedit.C @@ -54,81 +54,33 @@ int VEdit::load_properties_derived(FileXML *xml) } Asset* VEdit::get_nested_asset(int64_t *source_position, - int64_t position, - int direction) + int64_t position, int direction) { - const int debug = 0; - Asset *result = 0; + double edit_frame_rate = nested_edl ? + nested_edl->session->frame_rate : asset->frame_rate; // Make position relative to edit - *source_position = position - startproject + startsource; - -if(debug) printf("VEdit::get_nested_asset %d %jd %jd %jd %jd\n", -__LINE__, *source_position, position, startproject, startsource); + double edit_position = (position - startproject + startsource) * + edit_frame_rate / edl->session->frame_rate; + *source_position = Units::to_int64(edit_position); + if( !nested_edl ) return asset; // Descend into nested EDLs - if(nested_edl) - { -// Convert position to nested EDL rate -if(debug) printf("VEdit::get_nested_asset %d\n", -__LINE__); - int64_t pos = *source_position; - if(direction == PLAY_REVERSE && pos > 0) --pos; - *source_position = Units::to_int64((double)pos * - nested_edl->session->frame_rate / - edl->session->frame_rate); - PlayableTracks *playable_tracks = new PlayableTracks( - nested_edl, - *source_position, - direction, - TRACK_VIDEO, - 1); - if(playable_tracks->size()) - { - VTrack *nested_track = (VTrack*)playable_tracks->get(0); - VEdit* nested_edit = (VEdit*)nested_track->edits->editof( - *source_position, - direction, - 1); - if(nested_edit) - { - result = nested_edit->get_nested_asset( - source_position, - *source_position, - direction); - } - } - - delete playable_tracks; -if(debug) printf("VEdit::get_nested_asset %d\n", -__LINE__); - return result; - } - else - { -// Convert position to asset rate -if(debug) printf("VEdit::get_nested_asset %d %jd %f %f\n", -__LINE__, -*source_position, -asset->frame_rate, -edl->session->frame_rate); - int64_t pos = *source_position; - if(direction == PLAY_REVERSE && pos > 0) --pos; - *source_position = Units::to_int64((double)pos * - asset->frame_rate / - edl->session->frame_rate); - - return asset; - } + PlayableTracks playable_tracks(nested_edl, + *source_position, direction, TRACK_VIDEO, 1); + if( !playable_tracks.size() ) return 0; + VTrack *nested_track = (VTrack*)playable_tracks[0]; + VEdit* nested_edit = (VEdit*)nested_track->edits-> + editof(*source_position, direction, 1); + if( !nested_edit ) return 0; + return nested_edit->get_nested_asset(source_position, + *source_position, direction); } -int VEdit::read_frame(VFrame *video_out, - int64_t input_position, - int direction, - CICache *cache, - int use_nudge, - int use_cache, - int use_asynchronous) +int VEdit::read_frame(VFrame *video_out, int64_t input_position, int direction, + CICache *cache, int use_nudge, int use_cache, int use_asynchronous) { + File *file = 0; + int result = 0; int64_t source_position = 0; const int debug = 0; @@ -136,30 +88,22 @@ int VEdit::read_frame(VFrame *video_out, if(debug) printf("VEdit::read_frame %d source_position=%jd input_position=%jd\n", __LINE__, source_position, input_position); - Asset *asset = get_nested_asset(&source_position, - input_position, - direction); + Asset *asset = get_nested_asset(&source_position, input_position, direction); + if( !asset ) result = 1; if(debug) printf("VEdit::read_frame %d source_position=%jd input_position=%jd\n", __LINE__, source_position, input_position); - File *file = cache->check_out(asset, - edl); - int result = 0; - + if( !result ) { + file = cache->check_out(asset, edl); + if( !file ) result = 1; + } if(debug) printf("VEdit::read_frame %d path=%s source_position=%jd\n", __LINE__, asset->path, source_position); - if(file) - { - -if(debug) printf("VEdit::read_frame %d\n", __LINE__); - source_position = (direction == PLAY_FORWARD) ? - source_position : - (source_position - 1); -if(debug) printf("VEdit::read_frame %d %jd %jd\n", - __LINE__, input_position, source_position); - + if( !result ) { + if(direction == PLAY_REVERSE && source_position > 0) + --source_position; if(use_asynchronous) file->start_video_decode_thread(); else @@ -179,8 +123,6 @@ if(debug) printf("VEdit::read_frame %d\n", __LINE__); cache->check_in(asset); if(debug) printf("VEdit::read_frame %d\n", __LINE__); } - else - result = 1; //for(int i = 0; i < video_out->get_w() * 3 * 20; i++) video_out->get_rows()[0][i] = 128; return result; @@ -205,7 +147,7 @@ int64_t VEdit::get_source_end(int64_t default_) if(nested_edl) { - return (int64_t)(nested_edl->tracks->total_playable_length() * + return (int64_t)(nested_edl->tracks->total_length() * edl->session->frame_rate + 0.5); }