add refresh rate to vicons + a bunch of bug fixes
authorGood Guy <[email protected]>
Thu, 17 Dec 2015 16:37:25 +0000 (09:37 -0700)
committerGood Guy <[email protected]>
Thu, 17 Dec 2015 16:37:25 +0000 (09:37 -0700)
12 files changed:
cinelerra-5.0/cinelerra/awindowgui.C
cinelerra-5.0/cinelerra/awindowgui.h
cinelerra-5.0/cinelerra/dbwindow.C
cinelerra-5.0/cinelerra/dbwindow.h
cinelerra-5.0/cinelerra/ffmpeg.C
cinelerra-5.0/cinelerra/fileffmpeg.C
cinelerra-5.0/cinelerra/resourcethread.C
cinelerra-5.0/cinelerra/vwindowgui.C
cinelerra-5.0/global_config
cinelerra-5.0/guicast/vicon.C
cinelerra-5.0/guicast/vicon.h
cinelerra-5.0/guicast/vicon.inc

index f340bb0e207f92b6b0bdbf2de80ee7a07af74293..3e351957ae83b13d87fe3fd29feb8c72b8d8a3f1 100644 (file)
@@ -91,7 +91,8 @@ VFrame *AssetVIcon::frame()
                if( !temp )
                        temp = new VFrame(asset->width, asset->height, BC_RGB888);
                file->set_layer(0);
-               file->set_video_position(images.size(),0);
+               int64_t pos = seq_no / picon->gui->vicon_thread->refresh_rate * frame_rate;
+               file->set_video_position(pos,0);
                int ww = picon->gui->vicon_thread->view_w;
                int hh = picon->gui->vicon_thread->view_h;
                while( seq_no >= images.size() ) {
@@ -103,11 +104,10 @@ VFrame *AssetVIcon::frame()
        return *images[seq_no];
 }
 
-int64_t AssetVIcon::next_frame(int n)
+int64_t AssetVIcon::set_seq_no(int64_t no)
 {
-       age += n * period;
-       if( (seq_no+=n) >= length ) seq_no = 0;
-       return seq_no;
+       if( no >= length ) no = 0;
+       return seq_no = no;
 }
 
 int AssetVIcon::get_vx()
index f80cbca1f683a08818ccbf82d748fb4c260a18f2..d1c2455bc937073c7674fe261e2ecb91d9b6e827 100644 (file)
@@ -99,7 +99,7 @@ public:
        int64_t length;
 
        VFrame *frame();
-       int64_t next_frame(int n);
+       int64_t set_seq_no(int64_t no);
        int get_vx();
        int get_vy();
 
index 6d479b37ed357372aa35da42cb197a5358401d8e..2a6395cfe24d3a47d6db699d389135bd6c2c1d8f 100644 (file)
@@ -338,7 +338,7 @@ move_column_event()
 }
 
 DbWindowVIcon::DbWindowVIcon()
- : VIcon(SWIDTH, SHEIGHT, 24)
+ : VIcon(SWIDTH, SHEIGHT, VICON_RATE)
 {
        lbox = 0;
        item = 0;
@@ -392,11 +392,10 @@ VFrame *DbWindowVIcon::frame()
        return *images[seq_no];
 }
 
-int64_t DbWindowVIcon::next_frame(int n)
+int64_t DbWindowVIcon::set_seq_no(int64_t no)
 {
-       age += n * period;
-       if( (seq_no+=n) >= clip_size ) seq_no = 0;
-       return seq_no;
+       if( no >= clip_size ) no = 0;
+       return seq_no = no;
 }
 
 
@@ -449,7 +448,7 @@ update_image(DbWindowGUI *gui, int clip_id)
                        this->prefix_size = mdb->clip_prefix_size();
                        this->suffix_offset = mdb->clip_frames() - clip_size;
                        double framerate = mdb->clip_framerate();
-                       this->period = 1000. / (framerate > 0 ? framerate : 24);
+                       this->frame_rate = framerate > 0 ? framerate : VICON_RATE;
                        gui->vicon_thread->add_vicon(this);
                }
                mdb->detach();
index 4fcd2f0ad0bf6bd90ed43ff3393cb39537cc004b..f36644f5b46e84c436153d92ad4bc4a88a08a97c 100644 (file)
@@ -249,7 +249,7 @@ public:
         int prefix_size, suffix_offset;
 
        VFrame *frame();
-       int64_t next_frame(int n);
+       int64_t set_seq_no(int64_t no);
        void load_frames(DbWindow::MDb *mdb);
        void read_frames(DbWindow::MDb *mdb);
 
index a6bbabc15d0ec5bf3019cfd518e8b576c005fd94..4b585eaa531faed284d8740b781273ae28d0751e 100644 (file)
@@ -1887,7 +1887,6 @@ int FFMPEG::audio_seek(int stream, int64_t pos)
 {
        int aidx = astrm_index[stream].st_idx;
        FFAudioStream *aud = ffaudio[aidx];
-       pos = pos * aud->sample_rate / file_base->asset->sample_rate + 0.5;
        aud->audio_seek(pos);
        return 0;
 }
@@ -1896,7 +1895,6 @@ int FFMPEG::video_seek(int stream, int64_t pos)
 {
        int vidx = vstrm_index[stream].st_idx;
        FFVideoStream *vid = ffvideo[vidx];
-       pos = pos * vid->frame_rate / file_base->asset->frame_rate + 0.5;
        vid->video_seek(pos);
        return 0;
 }
@@ -1907,7 +1905,6 @@ int FFMPEG::decode(int chn, int64_t pos, double *samples, int len)
        if( !has_audio || chn >= astrm_index.size() ) return -1;
        int aidx = astrm_index[chn].st_idx;
        FFAudioStream *aud = ffaudio[aidx];
-       pos = pos * aud->sample_rate / file_base->asset->sample_rate + 0.5;
        if( aud->load(pos, len) < len ) return -1;
        int ch = astrm_index[chn].st_ch;
        int ret = aud->read(samples,len,ch);
@@ -1919,7 +1916,6 @@ int FFMPEG::decode(int layer, int64_t pos, VFrame *vframe)
        if( !has_video || layer >= vstrm_index.size() ) return -1;
        int vidx = vstrm_index[layer].st_idx;
        FFVideoStream *vid = ffvideo[vidx];
-       pos = pos * vid->frame_rate / file_base->asset->frame_rate + 0.5;
        return vid->load(vframe, pos);
 }
 
index 66fda8c193cb80a8fce6f01d98cbae5e227813d2..b5b459ef4faaca750407bdc743cbd755a0554a6e 100644 (file)
@@ -303,7 +303,7 @@ int FileFFMPEG::read_frame(VFrame *frame)
        int64_t pos = file->current_frame;
        int ret = ff->decode(layer, pos, frame);
        frame->set_status(ret);
-       if( ret > 0 ) return 0;
+       if( ret >= 0 ) return 0;
        frame->clear_frame();
        return -1;
 }
index ba6729c3fd7cabf0c87cef49f7b916e9349a2655..c14bf27b79ca0b7b36def8d5e1afc7aba6baf128 100644 (file)
@@ -195,6 +195,8 @@ ResourceThread::~ResourceThread()
                delete temp_buffer[i];
        delete timer;
        delete render_engine;
+       if( audio_asset ) audio_asset->remove_user();
+       if( video_asset ) video_asset->remove_user();
 }
 
 void ResourceThread::create_objects()
@@ -377,12 +379,14 @@ File *ResourceThread::get_audio_source(Asset *asset)
        {
                mwindow->audio_cache->check_in(audio_asset);
                audio_source = 0;
+               audio_asset->remove_user();
                audio_asset = 0;
 
        }
        if( !audio_asset && asset )
        {
                audio_asset = asset;
+               audio_asset->add_user();
                audio_source = mwindow->audio_cache->check_out(asset, mwindow->edl);
        }
        return audio_source;
@@ -395,12 +399,14 @@ File *ResourceThread::get_video_source(Asset *asset)
        {
                mwindow->video_cache->check_in(video_asset);
                video_source = 0;
+               video_asset->remove_user();
                video_asset = 0;
 
        }
        if( !video_asset && asset )
        {
                video_asset = asset;
+               video_asset->add_user();
                video_source = mwindow->video_cache->check_out(asset, mwindow->edl);
        }
        return video_source;
index 7fa2f4be3e112310c3de901b0706e708ac3f7f02..3c9ad5e62ef02fb6834e0fdae5044303dc4ce4ef 100644 (file)
@@ -806,6 +806,9 @@ void VWindowCanvas::zoom_resize_window(float percentage)
 
 void VWindowCanvas::close_source()
 {
+       gui->unlock_window();
+       gui->vwindow->playback_engine->interrupt_playback(1);
+       gui->lock_window("VWindowCanvas::close_source");
        gui->vwindow->delete_source(1, 1);
 }
 
index 4fbe48b3877bf4e19b6f6c877f95c7b61535e98e..623a0e3348d860b14a1c71f25fb700042a5ea9d8 100644 (file)
@@ -5,7 +5,7 @@ HAVE_XFT := y
 HAVE_ESOUND := y
 HAVE_FIREWIRE := y
 HAVE_OSS := y
-STATIC_LIBRARIES := n
+STATIC_LIBRARIES := y
 
 OBJDIR := $(shell uname --machine)
 
@@ -105,4 +105,3 @@ LOOP_BEGIN = @ for i in $(DIRS) ; \
 
 LOOP_END = done
 
-EXTRA_LIBS += -lnuma
index 269c96a2b23c18438366aa774a6cf6642bcfa060..428ed4c70ccfcf3b0abaccaeb94f016cb4388b6e 100644 (file)
@@ -12,9 +12,10 @@ VIcon(int vw, int vh, double rate)
 {
        this->vw = vw;
        this->vh = vh;
-       this->period = 1000./rate;
+       this->frame_rate = rate;
+       this->cycle_start = 0;
        this->age = 0;
-        this->seq_no = 0;
+       this->seq_no = 0;
        this->in_use = 1;
 }
 
@@ -73,6 +74,7 @@ VIconThread(BC_WindowBase *wdw, int vw, int vh)
        this->viewing = 0;
        draw_lock = new Condition(0, "VIconThread::draw_lock", 1);
        timer = new Timer();
+       this->refresh_rate = VICON_RATE;
        done = 0;
        interrupted = 1;
 }
@@ -175,14 +177,14 @@ ViewPopup *VIconThread::new_view_window(VFrame *frame)
 void VIconThread::
 reset_images()
 {
-       for( int i=t_heap.size(); --i>=0; ) t_heap[i]->age = 0;
+       for( int i=t_heap.size(); --i>=0; ) t_heap[i]->reset();
        timer->update();
        img_dirty = win_dirty = 0;
 }
 
-void VIconThread::add_vicon(VIcon *vip, double age)
+void VIconThread::add_vicon(VIcon *vip)
 {
-       vip->age = age;
+       double age = vip->age;
        int i = t_heap.size();  t_heap.append(vip);
        for( int k; i>0 && age<t_heap[(k=(i-1)/2)]->age; i=k )
                t_heap[i] = t_heap[k];
@@ -272,7 +274,7 @@ run()
                        if( !next ) break;
                        int64_t now = timer->get_difference();
                        if( next == first || (draw_flash && now >= draw_flash) ) {
-                               add_vicon(next, next->age);
+                               add_vicon(next);
                                if( !draw_flash ) draw_flash = now + 100;
                                else if( now >= draw_flash ) draw_flash = now + 1; 
                                wdw->unlock_window();
@@ -295,12 +297,14 @@ run()
                        if( draw(next) && !draw_flash )
                                draw_flash = next->age;
                        now = timer->get_difference();
-                       int64_t late = now - next->age;
-                       int count = late / next->period;
-                       int nfrms = count > 0 ? count : 1;
-                       if( !next->next_frame(nfrms) )
+                       if( !next->seq_no ) next->cycle_start = now;
+                       int64_t ref_no = (now - next->cycle_start) / 1000 * refresh_rate;
+                       int count = ref_no - next->seq_no;
+                       if( count < 1 ) count = 1;
+                       next->age += count * 1000 / refresh_rate;
+                       if( !next->set_seq_no(next->seq_no + count) )
                                next->age = now + 1000;
-                       add_vicon(next, next->age);
+                       add_vicon(next);
                }
                if( viewing != vicon )
                        update_view();
index da194c413525222537a27b8f489142782f72829b..6ae0119e547c7718866f4428fee479ee6b5a866e 100644 (file)
@@ -37,22 +37,17 @@ public:
 class VIcon
 {
 public:
-       int vw, vh, vcmdl, in_use;
+       int vw, vh, in_use;
        ArrayList<VIFrame *> images;
         int64_t seq_no;
-        double age, period;
+        double cycle_start, age, frame_rate;
 
-       double frame_rate() { return 1000/period; }
-       void frame_rate(double r) { period = 1000/r; }
        int64_t vframes() { return images.size(); }
+       void reset() { seq_no = 0; cycle_start = 0; age = 0; }
        void clear_images() { images.remove_all_objects(); }
 
+       virtual int64_t set_seq_no(int64_t no) { return seq_no = no; }
        virtual VFrame *frame() { return *images[seq_no]; }
-       virtual int64_t next_frame(int n) {
-               age += n * period;
-               if( (seq_no+=n) >= images.size() ) seq_no = 0;
-               return seq_no;
-       }
        virtual int get_vx() { return 0; }
        virtual int get_vy() { return 0; }
 
@@ -60,7 +55,7 @@ public:
        void draw_vframe(BC_WindowBase *wdw, int x, int y);
        void dump(const char *dir);
 
-       VIcon(int vw=VICON_WIDTH, int vh=VICON_HEIGHT, double rate=24);
+       VIcon(int vw=VICON_WIDTH, int vh=VICON_HEIGHT, double rate=VICON_RATE);
        virtual ~VIcon();
 };
 
@@ -75,10 +70,11 @@ public:
        VIcon *viewing, *vicon;
        int view_w, view_h;
        int img_dirty, win_dirty;
+       double refresh_rate;
 
        ArrayList<VIcon *>t_heap;
        VIcon *low_vicon();
-       void add_vicon(VIcon *vicon, double age=0);
+       void add_vicon(VIcon *vicon);
        int del_vicon(VIcon *&vicon);
        void run();
        void flash();
index 77b9ca87ab93835f512b06edeb035661abf99b0e..f105e4803b98cee17ee41484263f52cc91ddb05f 100644 (file)
@@ -3,6 +3,7 @@
 
 #define VICON_WIDTH 80
 #define VICON_HEIGHT 45
+#define VICON_RATE 24
 
 class ViewWindow;
 class VIconThread;