transcode target dir can be nested proxy pref, filebox/loadmode tweaks, meters tweak...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mwindowedit.C
index 82c4f1e4471479b98797d79bc9d3ff09a0a22a19..0c8c56b1c3cd5de83c36b0957476cc5e39760fc9 100644 (file)
@@ -27,6 +27,7 @@
 #include "clip.h"
 #include "clipedit.h"
 #include "commercials.h"
+#include "convert.h"
 #include "cplayback.h"
 #include "ctimebar.h"
 #include "cwindow.h"
@@ -91,13 +92,6 @@ void MWindow::add_audio_track_entry(int above, Track *dst)
        restart_brender();
        gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
        gui->activate_timeline();
-
-//     gui->get_scrollbars(0);
-//     gui->canvas->draw();
-//     gui->patchbay->update();
-//     gui->cursor->draw(1);
-//     gui->canvas->flash();
-//     gui->canvas->activate();
        cwindow->refresh_frame(CHANGE_EDL);
 }
 
@@ -111,12 +105,6 @@ void MWindow::add_video_track_entry(Track *dst)
 
        gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
        gui->activate_timeline();
-//     gui->get_scrollbars(0);
-//     gui->canvas->draw();
-//     gui->patchbay->update();
-//     gui->cursor->draw(1);
-//     gui->canvas->flash();
-//     gui->canvas->activate();
        cwindow->refresh_frame(CHANGE_EDL);
        save_backup();
 }
@@ -131,12 +119,6 @@ void MWindow::add_subttl_track_entry(Track *dst)
 
        gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
        gui->activate_timeline();
-//     gui->get_scrollbars(0);
-//     gui->canvas->draw();
-//     gui->patchbay->update();
-//     gui->cursor->draw(1);
-//     gui->canvas->flash();
-//     gui->canvas->activate();
        cwindow->refresh_frame(CHANGE_EDL);
        save_backup();
 }
@@ -1268,10 +1250,16 @@ void MWindow::overwrite(EDL *source, int all)
 // so we need to clear only when not using both io points
 // FIXME: need to write simple overwrite_edl to be used for overwrite function
        if( edl->local_session->get_inpoint() < 0 ||
-               edl->local_session->get_outpoint() < 0 )
-               edl->clear(dst_start, dst_start + overwrite_len, 0, 0, 0);
+           edl->local_session->get_outpoint() < 0 )
+               edl->clear(dst_start, dst_start + overwrite_len,
+                               edl->session->labels_follow_edits,
+                               edl->session->plugins_follow_edits,
+                               edl->session->autos_follow_edits);
 
-       paste(dst_start, dst_start + overwrite_len, &file, 0, 0, 0, 0, 0);
+       paste(dst_start, dst_start + overwrite_len, &file,
+                               edl->session->labels_follow_edits,
+                               edl->session->plugins_follow_edits,
+                               edl->session->autos_follow_edits, 0, 0);
 
        edl->local_session->set_selectionstart(dst_start + overwrite_len);
        edl->local_session->set_selectionend(dst_start + overwrite_len);
@@ -1389,7 +1377,7 @@ if( debug ) printf("MWindow::load_assets %d\n", __LINE__);
        for( int i=0; i<new_assets->total; ++i ) {
                Indexable *indexable = new_assets->get(i);
                if( indexable->is_asset ) {
-                       remove_asset_from_caches((Asset*)indexable);
+                       remove_from_caches(indexable);
                }
                EDL *new_edl = new EDL;
                new_edl->create_objects();
@@ -1563,8 +1551,7 @@ int MWindow::paste_edls(ArrayList<EDL*> *new_edls, int load_mode,
        else
 // Recycle existing tracks of master EDL
        if( load_mode == LOADMODE_CONCATENATE ||
-           load_mode == LOADMODE_PASTE ||
-           load_mode == LOADMODE_NESTED ) {
+           load_mode == LOADMODE_PASTE ) {
                Track *current = first_track ? first_track : edl->tracks->first;
                for( ; current; current=NEXT ) {
                        if( current->record ) {
@@ -1601,13 +1588,15 @@ int MWindow::paste_edls(ArrayList<EDL*> *new_edls, int load_mode,
 // Add assets and prepare index files
                for( Asset *new_asset=new_edl->assets->first;
                     new_asset; new_asset=new_asset->next ) {
-                       mainindexes->add_next_asset(0, new_asset);
+                       mainindexes->add_indexable(new_asset);
                }
 // Capture index file status from mainindex test
                edl->update_assets(new_edl);
 //PRINT_TRACE
 // Get starting point of insertion.  Need this to paste labels.
                switch( load_mode ) {
+               case LOADMODE_NOTHING:
+                       continue;
                case LOADMODE_REPLACE:
                        current_position = 0;
                        break;
@@ -1626,7 +1615,6 @@ int MWindow::paste_edls(ArrayList<EDL*> *new_edls, int load_mode,
                        break;
 
                case LOADMODE_PASTE:
-               case LOADMODE_NESTED:
                        destination_track = 0;
                        if( i == 0 ) {
                                for( int j=0; j<destination_tracks.total; ++j ) {
@@ -1646,7 +1634,7 @@ int MWindow::paste_edls(ArrayList<EDL*> *new_edls, int load_mode,
                    load_mode != LOADMODE_ASSETSONLY ) {
 // Insert labels
                        if( edit_labels ) {
-                               if( load_mode == LOADMODE_PASTE || load_mode == LOADMODE_NESTED )
+                               if( load_mode == LOADMODE_PASTE )
                                        edl->labels->insert_labels(new_edl->labels,
                                                destination_tracks.total ? paste_position[0] : 0.0,
                                                edl_length, 1);
@@ -1687,7 +1675,6 @@ int MWindow::paste_edls(ArrayList<EDL*> *new_edls, int load_mode,
                                                break;
 
                                        case LOADMODE_PASTE:
-                                       case LOADMODE_NESTED:
                                                current_position = paste_position[destination_track];
                                                paste_position[destination_track] += new_track->get_length();
                                                break;
@@ -1714,8 +1701,7 @@ int MWindow::paste_edls(ArrayList<EDL*> *new_edls, int load_mode,
                        }
                }
 
-               if( load_mode == LOADMODE_PASTE ||
-                   load_mode == LOADMODE_NESTED )
+               if( load_mode == LOADMODE_PASTE )
                        current_position += edl_length;
        }
 
@@ -2189,28 +2175,24 @@ void MWindow::save_clip(EDL *new_edl, const char *txt)
         time_t now;  time(&now);
         struct tm dtm;   localtime_r(&now, &dtm);
        char *cp = new_edl->local_session->clip_notes;
-       int n, sz = sizeof(new_edl->local_session->clip_notes)-1;
-       if( txt && *txt ) {
-               n = snprintf(cp, sz, "%s", txt);
-               cp += n;  sz -= n;
-       }
-       n = snprintf(cp, sz,
+       char *ep = cp + sizeof(new_edl->local_session->clip_notes)-1;
+       if( txt && *txt )
+               cp += snprintf(cp, ep-cp, "%s", txt);
+       cp += snprintf(cp, ep-cp,
                "%02d/%02d/%02d %02d:%02d:%02d,  +%s\n",
                dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday,
                dtm.tm_hour, dtm.tm_min, dtm.tm_sec, duration);
-       cp += n;  sz -= n;
        if( path && *path ) {
                FileSystem fs;
                char title[BCTEXTLEN];
                fs.extract_name(title, path);
-               n = snprintf(cp, sz, "%s", title);
-               cp += n;  sz -= n;
+               cp += snprintf(cp, ep-cp, "%s", title);
        }
-       cp[n] = 0;
        sprintf(new_edl->local_session->clip_icon,
-               "clip_%02d%02d%02d-%02d%02d%02d.png",
+               "clip_%02d%02d%02d-%02d%02d%02d-%d.png",
                dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday,
-               dtm.tm_hour, dtm.tm_min, dtm.tm_sec);
+               dtm.tm_hour, dtm.tm_min, dtm.tm_sec,
+               new_edl->id);
        new_edl->folder_no = AW_CLIP_FOLDER;
        edl->update_assets(new_edl);
        int cur_x, cur_y;
@@ -2457,10 +2439,48 @@ void MWindow::rescale_proxy(EDL *clip, int orig_scale, int new_scale)
        edl->rescale_proxy(orig_scale, new_scale);
 }
 
-void MWindow::add_proxy(int use_scaler,
-       ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
+void MWindow::add_proxy(ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
+{
+       edl->add_proxy(orig_assets, proxy_assets);
+}
+
+void MWindow::start_convert(Asset *format_asset, const char *suffix,
+               float beep, int to_proxy, int remove_originals)
 {
-       edl->add_proxy(use_scaler, orig_assets, proxy_assets);
+       if( !convert_render )
+               convert_render = new ConvertRender(this);
+       convert_render->set_format(format_asset, suffix, to_proxy);
+       int found = convert_render->find_convertable_assets(edl);
+       if( convert_render->needed_idxbls.size() > 0 )
+               convert_render->start_convert(beep, remove_originals);
+       else if( found > 0 )
+               finish_convert(remove_originals);
+       else if( found < 0 )
+               eprintf(_("convert assets format error"));
+       else
+               eprintf(_("No convertable assets found"));
+}
+
+void MWindow::finish_convert(int remove_originals)
+{
+       gui->lock_window("MWindow::finish_convert");
+       undo_before();
+       edl->replace_assets(
+               convert_render->orig_idxbls,
+               convert_render->orig_copies);
+       if( remove_originals ) {
+               remove_assets_from_project(0, 0, 0,
+                       &convert_render->orig_idxbls, 0);
+       }
+       save_backup();
+       undo_after(_("convert"), LOAD_ALL);
+
+       update_plugin_guis();
+       gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0);
+       cwindow->update(1, 0, 0, 0, 1);
+       awindow->gui->async_update_assets();
+       cwindow->refresh_frame(CHANGE_EDL);
+       gui->unlock_window();
 }
 
 void MWindow::cut_commercials()