X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fawindowgui.C;h=d71d1588715e1e58e4d0f69028d38c5ba95e3edc;hp=03c8f22132266cb337352178e5910869503436cb;hb=9ffdfbe8e6fa7daaad4dcfdd46b6ac7b6e7a47e8;hpb=0df48ad2d876409c5beeae2e21933a728ea76c33 diff --git a/cinelerra-5.1/cinelerra/awindowgui.C b/cinelerra-5.1/cinelerra/awindowgui.C index 03c8f221..d71d1588 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.C +++ b/cinelerra-5.1/cinelerra/awindowgui.C @@ -29,8 +29,9 @@ #include "awindow.h" #include "awindowgui.h" #include "bccmodels.h" -#include "bcsignals.h" #include "bchash.h" +#include "bcsignals.h" +#include "bctimer.h" #include "binfolder.h" #include "cache.h" #include "cstrdup.h" @@ -109,18 +110,23 @@ AssetVIcon::AssetVIcon(AssetPicon *picon, int w, int h, double framerate, int64_ this->picon = picon; this->length = length; temp = 0; + broken = 0; } AssetVIcon::~AssetVIcon() { + if( picon->gui->vicon_thread->solo == this ) + picon->gui->vicon_thread->solo = 0; picon->gui->vicon_thread->del_vicon(this); delete temp; } VFrame *AssetVIcon::frame() { + if( broken ) return 0; AssetVIconThread *avt = picon->gui->vicon_thread; - Asset *asset = (Asset *)picon->indexable; + Indexable *idxbl = picon->indexable; + Asset *asset = idxbl && idxbl->is_asset ? (Asset *)idxbl : 0; if( !asset ) return vframes()>0 ? (VFrame*)*images[0] : 0; if( !asset->video_data && audio_data && audio_size && length > 0 ) { if( !temp ) temp = new VFrame(0, -1, w, h, BC_RGB888, -1); @@ -159,26 +165,33 @@ VFrame *AssetVIcon::frame() } if( seq_no >= images.size() ) { MWindow *mwindow = picon->mwindow; - File *file = mwindow->video_cache->check_out(asset, mwindow->edl, 1); - if( !file ) return 0; if( temp && (temp->get_w() != asset->width || temp->get_h() != asset->height) ) { delete temp; temp = 0; } if( !temp ) temp = new VFrame(0, -1, asset->width, asset->height, BC_RGB888, -1); - while( seq_no >= images.size() ) { - mwindow->video_cache->check_in(asset); - Thread::yield(); - file = mwindow->video_cache->check_out(asset, mwindow->edl, 0); - if( !file ) { usleep(1000); continue; } - file->set_layer(0); + File *file = mwindow->video_cache->check_out(asset, mwindow->edl, 1); + if( !file ) { broken = 1; return 0; } + Timer timer; + while( file && seq_no >= images.size() && !avt->interrupted ) { int64_t pos = images.size() / picon->gui->vicon_thread->refresh_rate * frame_rate; file->set_video_position(pos,0); + file->set_layer(0); if( file->read_frame(temp) ) temp->clear_frame(); add_image(temp, vw, vh, vicon_cmodel); + mwindow->video_cache->check_in(asset); + if( timer.get_difference() > 500 ) return 0; + Thread::yield(); + file = mwindow->video_cache->check_out(asset, mwindow->edl, 0); + for( int retries=10; !file && --retries>=0; usleep(1000) ) { + if( avt->interrupted ) return 0; + file = mwindow->video_cache->check_out(asset, mwindow->edl, 0); + } + if( !file ) return 0; } mwindow->video_cache->check_in(asset); } + if( seq_no >= images.size() ) return 0; return *images[seq_no]; } @@ -528,7 +541,7 @@ void AssetViewPopup::draw_vframe(VFrame *vframe) double total_length = edl->tracks->total_length(); if( !total_length ) total_length = 1; for( Track *track=edl->tracks->first; track!=0; track=track->next ) { - if( !track->record ) continue; + if( !track->is_armed() ) continue; for( Edit *edit=track->edits->first; edit!=0; edit=edit->next ) { Indexable *indexable = (Indexable *)edit->asset; if( !indexable ) indexable = (Indexable *)edit->nested_edl; @@ -675,11 +688,13 @@ ViewPopup *AssetVIconThread::new_view_window(ViewPopup *vpopup) return av_popup; } -void AssetVIconThread::close_view_popup() +void AssetVIconThread::stop_vicon_drawing(int wait) { stop_drawing(); - drawing_started(); // waits for draw lock - drawing_stopped(); + if( wait ) { + drawing_started(); // waits for draw lock + drawing_stopped(); + } } @@ -917,16 +932,25 @@ void AssetPicon::create_objects() int is_clip = 0; if( this->indexable ) { - fs.extract_name(name, indexable->path); - set_text(name); - if( this->indexable->is_asset ) + char *cp = name; + if( this->indexable->is_asset ) { asset = (Asset *)indexable; - else + if( asset->format == FILE_REF ) { + cp += sprintf(cp, "ref:"); + set_color(get_color() ^ 0x5599CC); + } + } + else { edl = (EDL *)indexable; + cp += sprintf(cp, "edl:"); +// set_color(get_color() ^ 0xCC9955); + } + fs.extract_name(cp, indexable->path); + set_text(name); } else if( this->edl ) { edl = this->edl; - set_text(strcpy(name, edl->local_session->clip_title)); + strcpy(name, edl->local_session->clip_title); set_text(name); is_clip = 1; } @@ -1304,6 +1328,7 @@ AWindowGUI::AWindowGUI(MWindow *mwindow, AWindow *awindow) vicon_audio = 0; vicon_drawing = AVICON_FULL_PLAY; play_off = 0; + tip_info = 0; displayed_folder = AW_NO_FOLDER; new_folder_thread = 0; modify_folder_thread = 0; @@ -1679,17 +1704,12 @@ int AWindowGUI::start_vicon_drawing() return 1; } -int AWindowGUI::stop_vicon_drawing() +int AWindowGUI::stop_vicon_drawing(int wait) { - if( !vicon_thread->interrupted ) - vicon_thread->stop_drawing(); + vicon_thread->stop_vicon_drawing(wait); return 0; } -void AWindowGUI::close_view_popup() -{ - vicon_thread->close_view_popup(); -} VFrame *AssetPicon::get_vicon_frame() { @@ -1898,7 +1918,7 @@ int AWindowGUI::keypress_event() return 1; } unlock_window(); - mwindow->remove_assets_from_project(1, 1, + mwindow->remove_assets_from_project(1, 1, 1, mwindow->session->drag_assets, mwindow->session->drag_clips); lock_window("AWindowGUI::keypress_event 2"); @@ -2191,14 +2211,16 @@ void AWindowGUI::sort_folders() update_assets(); } -EDL *AWindowGUI::collect_proxy(Indexable *indexable) +EDL *AWindowGUI::collect_proxy(Asset *proxy_asset) { - Asset *proxy_asset = (Asset *)indexable; char path[BCTEXTLEN]; int proxy_scale = mwindow->edl->session->proxy_scale; ProxyRender::from_proxy_path(path, proxy_asset, proxy_scale); - Asset *unproxy_asset = mwindow->edl->assets->get_asset(path); - if( !unproxy_asset || !unproxy_asset->layers ) return 0; + Indexable *unproxy_idxbl = + proxy_asset->proxy_edl ? + (Indexable *) mwindow->edl->get_nested_edl(path) : + (Indexable *) mwindow->edl->assets->get_asset(path); + if( !unproxy_idxbl || !unproxy_idxbl->get_video_layers() ) return 0; // make a clip from proxy video tracks and unproxy audio tracks EDL *proxy_edl = new EDL(mwindow->edl); proxy_edl->create_objects(); @@ -2207,7 +2229,7 @@ EDL *AWindowGUI::collect_proxy(Indexable *indexable) strcpy(proxy_edl->local_session->clip_title, path); strcpy(proxy_edl->local_session->clip_notes, _("Proxy clip")); proxy_edl->session->video_tracks = proxy_asset->layers; - proxy_edl->session->audio_tracks = unproxy_asset->channels; + proxy_edl->session->audio_tracks = unproxy_idxbl->get_audio_channels(); proxy_edl->create_default_tracks(); double length = proxy_asset->frame_rate > 0 ? ( proxy_asset->video_length >= 0 ? @@ -2221,11 +2243,15 @@ EDL *AWindowGUI::collect_proxy(Indexable *indexable) if( current->data_type != TRACK_VIDEO ) continue; current->insert_asset(proxy_asset, 0, length, 0, vtrack++); } - length = (double)unproxy_asset->audio_length / unproxy_asset->sample_rate; + int64_t samples = unproxy_idxbl->get_audio_samples(); + int sample_rate = unproxy_idxbl->get_sample_rate(); + length = sample_rate > 0 ? (double)samples / sample_rate : 0; current = proxy_edl->tracks->first; for( int atrack=0; current; current=NEXT ) { if( current->data_type != TRACK_AUDIO ) continue; - current->insert_asset(unproxy_asset, 0, length, 0, atrack++); + Asset *asset = unproxy_idxbl->is_asset ? (Asset *)unproxy_idxbl : 0; + EDL *nested_edl = unproxy_idxbl->is_asset ? 0 : (EDL *)unproxy_idxbl; + current->insert_asset(asset, nested_edl, length, 0, atrack++); } proxy_edl->folder_no = AW_PROXY_FOLDER; return proxy_edl; @@ -2241,7 +2267,7 @@ void AWindowGUI::collect_assets(int proxy) Indexable *indexable = result->indexable; if( proxy && indexable && indexable->is_asset && indexable->folder_no == AW_PROXY_FOLDER ) { - EDL *drag_edl = collect_proxy(indexable); + EDL *drag_edl = collect_proxy((Asset*)indexable); if( drag_edl ) mwindow->session->drag_clips->append(drag_edl); continue; } @@ -2637,12 +2663,18 @@ int AWindowFolders::load_expanders() char expanders_path[BCTEXTLEN]; mwindow->create_defaults_path(expanders_path, EXPANDERS_FILE); FILE *fp = fopen(expanders_path, "r"); + if( !fp ) { + snprintf(expanders_path, sizeof(expanders_path), "%s/%s", + File::get_cindat_path(), EXPANDERS_FILE); + char *cp = strrchr(expanders_path,'.'); + if( cp ) strcpy(cp+1, mwindow->cin_lang); + fp = fopen(expanders_path, "r"); + } if( !fp ) { snprintf(expanders_path, sizeof(expanders_path), "%s/%s", File::get_cindat_path(), EXPANDERS_FILE); fp = fopen(expanders_path, "r"); } - if( !fp ) return 1; const char tab = '\t'; char line[BCTEXTLEN]; line[0] = 0; @@ -2797,8 +2829,8 @@ int AWindowAssets::handle_event() break; } if( !vwindow || !vwindow->is_running() ) return 1; - if( proxy && picon_idxbl ) { - picon_edl = gui->collect_proxy(picon_idxbl); + if( proxy && picon_idxbl && picon_idxbl->is_asset ) { + picon_edl = gui->collect_proxy((Asset*)picon_idxbl); picon_idxbl = 0; }