Andrew improves asset of Interlace + some aspect ratio fixups
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / awindowgui.C
index 4688e7bc04cead9a205e6a0fd67288640dc10b25..4dc1ce2853d26250839170642f34ea931616dd1a 100644 (file)
@@ -29,6 +29,7 @@
 #include "awindow.h"
 #include "awindowgui.h"
 #include "bccmodels.h"
+#include "bcdisplayinfo.h"
 #include "bchash.h"
 #include "bcsignals.h"
 #include "bctimer.h"
@@ -127,7 +128,7 @@ VFrame *AssetVIcon::frame()
        AssetVIconThread *avt = picon->gui->vicon_thread;
        Indexable *idxbl = picon->indexable;
        Asset *asset = idxbl && idxbl->is_asset ? (Asset *)idxbl : 0;
-       if( !asset ) return vframes()>0 ? (VFrame*)*images[0] : 0;
+       if( !asset ) return vframes()>0 ? images[0]->vfrm : 0;
        if( !asset->video_data && audio_data && audio_size && length > 0 ) {
                if( !temp ) temp = new VFrame(0, -1, w, h, BC_RGB888, -1);
                temp->clear_frame();
@@ -173,15 +174,17 @@ VFrame *AssetVIcon::frame()
                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 ) {
+               while( file && seq_no >= images.size() ) {
                        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);
+                       if( seq_no < images.size() ) break;
                        mwindow->video_cache->check_in(asset);
                        if( timer.get_difference() > 500 ) return 0;
                        Thread::yield();
+                       if( avt->interrupted ) return 0;
                        file = mwindow->video_cache->check_out(asset, mwindow->edl, 0);
                        for( int retries=10; !file && --retries>=0; usleep(1000) ) {
                                if( avt->interrupted ) return 0;
@@ -192,7 +195,7 @@ VFrame *AssetVIcon::frame()
                mwindow->video_cache->check_in(asset);
        }
        if( seq_no >= images.size() ) return 0;
-       return *images[seq_no];
+       return images[seq_no]->vfrm;
 }
 
 int64_t AssetVIcon::set_seq_no(int64_t no)
@@ -945,6 +948,11 @@ void AssetPicon::create_objects()
                if( asset->video_data ) {
                        if( mwindow->preferences->use_thumbnails ) {
                                gui->unlock_window();
+                               char string[BCTEXTLEN];
+                               sprintf(string, _("Reading %s"), name);
+                               mwindow->gui->lock_window("AssetPicon::create_objects");
+                               mwindow->gui->show_message(string);
+                               mwindow->gui->unlock_window();
                                File *file = mwindow->video_cache->check_out(asset,
                                        mwindow->edl,
                                        1);
@@ -968,11 +976,6 @@ void AssetPicon::create_objects()
                                                        asset->width, asset->height,
                                                        BC_RGB888, -1);
                                        }
-                                       { char string[BCTEXTLEN];
-                                       sprintf(string, _("Reading %s"), name);
-                                       mwindow->gui->lock_window("AssetPicon::create_objects");
-                                       mwindow->gui->show_message(string);
-                                       mwindow->gui->unlock_window(); }
                                        file->read_frame(gui->temp_picon);
                                        mwindow->video_cache->check_in(asset);
 
@@ -2073,6 +2076,21 @@ void AWindowGUI::update_asset_list()
                        AssetPicon *picon = new AssetPicon(mwindow,
                                this, current);
                        new_assets.append(picon);
+                       if( current->width > ASSET_MAX_WIDTH || current->height > ASSET_MAX_HEIGHT ) {
+                               eprintf(_("Warning: %s\n"
+                                       " dimensions %dx%d exceed asset maximum limits %dx%d\n"),
+                                       current->path, current->width, current->height,
+                                               ASSET_MAX_WIDTH, ASSET_MAX_HEIGHT);
+                       }
+                       else if( mwindow->edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL ) {
+                               int texture_limit = BC_DisplayInfo::get_gl_max_texture_size();
+                               if( texture_limit >= 0 &&
+                                   (current->width >= texture_limit || current->height >= texture_limit) ) {
+                                       eprintf(_("Warning: %s\n"
+                                               " dimensions %dx%d exceed OpenGL texture limit %d\n"),
+                                               current->path, current->width, current->height, texture_limit);
+                               }
+                       }
                }
        }
 
@@ -2863,6 +2881,18 @@ int AWindowAssets::selection_changed()
 
                deactivate_selection();
        }
+       else if( get_button_down() && get_buttonpress() == LEFT_BUTTON &&
+                get_double_click() ) {
+               item = (AssetPicon*)get_selection(0, 0);
+               if( item ) {
+                       switch( folder ) {
+                       case AW_LABEL_FOLDER:
+                               if( !item->label ) break;
+                               mwindow->set_position(item->label->position);
+                               break;
+                       }
+               }
+       }
        else if( get_button_down() && !gui->play_off &&
                 mwindow->edl->session->assetlist_format != ASSETS_TEXT ) {
                item = (AssetPicon*)get_selection(0, 0);