yuv colorspace/range + prefs, ffmpeg colorrange probe, x11 direct force colormodel...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / mwindow.C
index 9d3b4860858840b158f864ef4ae45943c7379659..84ba6830aa88bd39cfea54d154dd94ead97a07ff 100644 (file)
@@ -237,10 +237,8 @@ MWindow::MWindow()
 MWindow::~MWindow()
 {
        run_lock->lock("MWindow::~MWindow");
-       stop_playback(1);
        in_destructor = 1;
 //printf("MWindow::~MWindow %d\n", __LINE__);
-       gui->stop_drawing();
        gui->remote_control->deactivate();
        gui->record->stop();
 #ifdef HAVE_DVB
@@ -252,6 +250,7 @@ MWindow::~MWindow()
        delete render;          render = 0;
        commit_commercial();
        if( commercials && !commercials->remove_user() ) commercials = 0;
+       close_mixers();
 
 // Save defaults for open plugins
        plugin_gui_lock->lock("MWindow::~MWindow");
@@ -905,6 +904,7 @@ void MWindow::init_preferences()
        BC_WindowBase::get_resources()->popupmenu_btnup = preferences->popupmenu_btnup;
        BC_WindowBase::get_resources()->textbox_focus_policy = preferences->textbox_focus_policy;
        BC_WindowBase::get_resources()->grab_input_focus = preferences->grab_input_focus;
+       YUV::yuv.yuv_set_colors(preferences->yuv_color_space, preferences->yuv_color_range);
 }
 
 void MWindow::clean_indexes()
@@ -1070,8 +1070,8 @@ void MWindow::init_theme()
        theme->build_menus();
        init_menus();
 
+       theme->sort_image_sets();
        theme->check_used();
-
 //printf("MWindow::init_theme %d total_time=%d\n", __LINE__, (int)timer.get_difference());
 }
 
@@ -1131,7 +1131,7 @@ ZWindow *MWindow::get_mixer(Mixer *&mixer)
        if( !mixer ) mixer = edl->mixers.new_mixer();
        ZWindow *zwindow = 0;
        for( int i=0; !zwindow && i<zwindows.size(); ++i )
-               if( !zwindows[i]->is_running() ) zwindow = zwindows[i];
+               if( zwindows[i]->idx < 0 ) zwindow = zwindows[i];
        if( !zwindow )
                zwindows.append(zwindow = new ZWindow(this));
        zwindow->idx = mixer->idx;
@@ -1177,7 +1177,7 @@ void MWindow::start_mixer()
 
        zwindow->set_title(title);
        zwindow->start();
-       queue_mixers(edl,CURRENT_FRAME,0,0,1,0);
+       refresh_mixers();
 }
 
 int MWindow::mixer_track_active(Track *track)
@@ -1208,7 +1208,7 @@ void MWindow::queue_mixers(EDL *edl, int command, int wait_tracking,
        zwindows_lock->lock("MWindow::queue_mixers");
        for( int vidx=0; vidx<zwindows.size(); ++vidx ) {
                ZWindow *zwindow = zwindows[vidx];
-               if( !zwindow->running() ) continue;
+               if( zwindow->idx < 0 ) continue;
                Mixer *mixer = edl->mixers.get_mixer(zwindow->idx);
                if( !mixer || !mixer->mixer_ids.size() ) continue;
                int k = -1;
@@ -1240,15 +1240,50 @@ void MWindow::queue_mixers(EDL *edl, int command, int wait_tracking,
        zwindows_lock->unlock();
 }
 
+void MWindow::refresh_mixers()
+{
+       queue_mixers(edl,CURRENT_FRAME,0,0,1,0);
+}
+
 void MWindow::stop_mixers()
 {
        for( int vidx=0; vidx<zwindows.size(); ++vidx ) {
                ZWindow *zwindow = zwindows[vidx];
-               if( !zwindow->running() ) continue;
+               if( zwindow->idx < 0 ) continue;
                zwindow->issue_command(STOP, 0, 0, 0, 0);
        }
 }
 
+void MWindow::close_mixers()
+{
+       zwindows_lock->lock("MWindow::close_mixers");
+       for( int i=0; i<zwindows.size(); ++i ) {
+               ZWindow *zwindow = zwindows[i];
+               if( zwindow->idx < 0 ) continue;
+               ZWindowGUI *zgui = zwindow->zgui;
+               zgui->lock_window("MWindow::select_zwindow 0");
+               zgui->set_done(0);
+               zgui->unlock_window();
+       }
+       zwindows_lock->unlock();
+       for( int i=0; i<zwindows.size(); ++i ) {
+               ZWindow *zwindow = zwindows[i];
+               if( zwindow->idx < 0 ) continue;
+               zwindow->close_window();
+       }
+}
+
+void MWindow::open_mixers()
+{
+       for( int i=0; i<edl->mixers.size(); ++i ) {
+               Mixer *mixer = edl->mixers[i];
+               ZWindow *zwindow = get_mixer(mixer);
+               zwindow->set_title(mixer->title);
+               zwindow->start();
+       }
+        refresh_mixers();
+}
+
 int MWindow::select_zwindow(ZWindow *zwindow)
 {
        int ret = 0, n = zwindows.number_of(zwindow);
@@ -1256,7 +1291,7 @@ int MWindow::select_zwindow(ZWindow *zwindow)
                session->selected_zwindow = n;
                for( int i=0; i<zwindows.size(); ++i ) {
                        ZWindow *zwindow = zwindows[i];
-                       if( !zwindow->running() ) continue;
+                       if( zwindow->idx < 0 ) continue;
                        ZWindowGUI *zgui = zwindow->zgui;
                        zgui->lock_window("MWindow::select_zwindow 0");
                        zwindow->highlighted = i == n ? 1 : 0;
@@ -1272,6 +1307,60 @@ int MWindow::select_zwindow(ZWindow *zwindow)
        return ret;
 }
 
+void MWindow::tile_mixers()
+{
+       int nz = 0;
+       for( int i=0; i<zwindows.size(); ++i ) {
+               ZWindow *zwindow = zwindows[i];
+               if( zwindow->idx < 0 ) continue;
+               ++nz;
+       }
+       if( !nz ) return;
+       int zn = ceil(sqrt(nz));
+       int x1 = 1 + gui->get_x(), x2 = cwindow->gui->get_x();
+       int y1 = 1, y2 = gui->get_y();
+       int rw = gui->get_root_w(0), rh = gui->get_root_h(0);
+       if( x1 < 0 ) x1 = 0;
+       if( y1 < 0 ) y1 = 0;
+       if( x2 > rw ) x2 = rw;
+       if( y2 > rh ) y2 = rh;
+       int dx = x2 - x1, dy = y2 - y1;
+       int zw = dx / zn;
+       int lt = BC_DisplayInfo::get_left_border();
+       int top = BC_DisplayInfo::get_top_border();
+       int bw = lt + BC_DisplayInfo::get_right_border();  // borders
+       int bh = top + BC_DisplayInfo::get_bottom_border();
+       int zx = 0, zy = 0;  // window origins
+       int mw = 10+10, mh = 10+10; // canvas margins
+       int rsz = 0, n = 0, dz = 0;
+       int ow = edl->session->output_w, oh = edl->session->output_h;
+       for( int i=0; i<zwindows.size(); ++i ) {
+               ZWindow *zwindow = zwindows[i];
+               if( zwindow->idx < 0 ) continue;
+               int ww = zw - bw, hh = (ww - mw) * oh / ow + mh, zh = hh + bh;
+               if( rsz < hh ) rsz = hh;
+               int xx = zx + x1, yy = zy + y1;
+               int mx = x2 - zw, my = y2 - zh;
+               if( xx > mx ) xx = mx;
+               if( yy > my ) yy = my;
+               xx += lt + dz;  yy += top + dz;
+               zwindow->reposition(xx,yy, ww,hh);
+               if( zwindow->running() ) {
+                       ZWindowGUI *gui = (ZWindowGUI *)zwindow->get_gui();
+                       gui->lock_window("MWindow::tile_mixers");
+                       gui->BC_WindowBase::reposition_window(xx,yy, ww,hh);
+                       gui->unlock_window();
+               }
+               if( ++n >= zn ) {
+                       n = 0;  rsz += bh;
+                       if( (zy += rsz) > (dy - rsz) ) dz += 10;
+                       rsz = 0;
+                       zx = 0;
+               }
+               else
+                       zx += zw;
+       }
+}
 
 void MWindow::init_cache()
 {
@@ -1563,22 +1652,20 @@ int MWindow::put_commercial()
 
 void MWindow::stop_playback(int wait)
 {
-       int locked  = gui->get_window_lock();
-       if( locked ) gui->unlock_window();
+       gui->stop_drawing();
 
-       cwindow->playback_engine->stop_playback();
+       cwindow->stop_playback(wait);
 
        for(int i = 0; i < vwindows.size(); i++) {
                VWindow *vwindow = vwindows[i];
                if( !vwindow->is_running() ) continue;
-               vwindow->playback_engine->stop_playback();
+               vwindow->stop_playback(wait);
        }
        for(int i = 0; i < zwindows.size(); i++) {
                ZWindow *zwindow = zwindows[i];
-               if( !zwindow->is_running() ) continue;
-               zwindow->zgui->playback_engine->stop_playback();
+               if( zwindow->idx < 0 ) continue;
+               zwindow->stop_playback(wait);
        }
-       if( locked ) gui->lock_window("MWindow::stop_playback");
 }
 
 int MWindow::load_filenames(ArrayList<char*> *filenames,
@@ -1596,7 +1683,9 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
 
 // Need to stop playback since tracking depends on the EDL not getting
 // deleted.
+       gui->unlock_window();
        stop_playback(1);
+       gui->lock_window("MWindow::load_filenames 0");
 
 if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
        undo->update_undo_before();
@@ -1980,7 +2069,7 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
                edl->session->proxy_use_scaler = 0;
                edl->session->proxy_auto_scale = 0;
                edl->local_session->preview_start = 0;
-               edl->local_session->preview_end = edl->tracks->total_length();
+               edl->local_session->preview_end = 0;
                edl->local_session->loop_playback = 0;
                edl->local_session->set_selectionstart(0);
                edl->local_session->set_selectionend(0);
@@ -2664,11 +2753,7 @@ void MWindow::sync_parameters(int change_type)
        }
        else
        {
-               queue_mixers(edl,CURRENT_FRAME,0,0,1,0);
-               cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-                                                       change_type,
-                                                       edl,
-                                                       1);
+               cwindow->refresh_frame(change_type);
        }
 }
 
@@ -3203,11 +3288,7 @@ void MWindow::update_project(int load_mode)
                }
                if(debug) PRINT_TRACE
                select_zwindow(0);
-               for( int i=0; i<zwindows.size(); ++i ) {
-                       ZWindow *zwindow = zwindows[i];
-                       if( !zwindow->is_running() ) continue;
-                       zwindow->close_window();
-               }
+               close_mixers();
 
                for( int i=0; i<edl->mixers.size(); ++i ) {
                        Mixer *mixer = edl->mixers[i];
@@ -3233,10 +3314,7 @@ void MWindow::update_project(int load_mode)
        cwindow->gui->unlock_window();
 
        if(debug) PRINT_TRACE
-       cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-               CHANGE_ALL,
-               edl,
-               1);
+       cwindow->refresh_frame(CHANGE_ALL);
 
        awindow->gui->async_update_assets();
        if(debug) PRINT_TRACE
@@ -3375,31 +3453,29 @@ int MWindow::create_aspect_ratio(float &w, float &h, int width, int height)
 
 void MWindow::reset_caches()
 {
-       gui->resource_thread->get_video_source(0);
-       gui->resource_thread->get_audio_source(0);
        frame_cache->remove_all();
        wave_cache->remove_all();
        audio_cache->remove_all();
        video_cache->remove_all();
-       if( cwindow->playback_engine && cwindow->playback_engine->audio_cache )
-               cwindow->playback_engine->audio_cache->remove_all();
-       if( cwindow->playback_engine && cwindow->playback_engine->video_cache )
-               cwindow->playback_engine->video_cache->remove_all();
-
+       if( cwindow->playback_engine ) {
+               if( cwindow->playback_engine->audio_cache )
+                       cwindow->playback_engine->audio_cache->remove_all();
+               if( cwindow->playback_engine->video_cache )
+                       cwindow->playback_engine->video_cache->remove_all();
+       }
        for(int i = 0; i < vwindows.size(); i++) {
                VWindow *vwindow = vwindows[i];
                if( !vwindow->is_running() ) continue;
-               if(vwindow->playback_engine && vwindow->playback_engine->audio_cache)
+               if( !vwindow->playback_engine ) continue;
+               if( vwindow->playback_engine->audio_cache )
                        vwindow->playback_engine->audio_cache->remove_all();
-               if(vwindow->playback_engine && vwindow->playback_engine->video_cache)
+               if( vwindow->playback_engine->video_cache )
                        vwindow->playback_engine->video_cache->remove_all();
        }
 }
 
 void MWindow::remove_asset_from_caches(Asset *asset)
 {
-       gui->resource_thread->get_video_source(0);
-       gui->resource_thread->get_audio_source(0);
        frame_cache->remove_asset(asset);
        wave_cache->remove_asset(asset);
        audio_cache->delete_entry(asset);
@@ -3411,9 +3487,10 @@ void MWindow::remove_asset_from_caches(Asset *asset)
        for(int i = 0; i < vwindows.size(); i++) {
                VWindow *vwindow = vwindows[i];
                if( !vwindow->is_running() ) continue;
-               if(vwindow->playback_engine && vwindow->playback_engine->audio_cache)
+               if( !vwindow->playback_engine ) continue;
+               if( vwindow->playback_engine->audio_cache )
                        vwindow->playback_engine->audio_cache->delete_entry(asset);
-               if(vwindow->playback_engine && vwindow->playback_engine->video_cache)
+               if( vwindow->playback_engine->video_cache )
                        vwindow->playback_engine->video_cache->delete_entry(asset);
        }
 }