Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / vicon.C
index 9d6b94e0ed0add20e2721b3437d1499d0605b680..e0b4d1b8f7eb1b57e210b894a97d287262601761 100644 (file)
@@ -1,3 +1,24 @@
+/*
+ * CINELERRA
+ * Copyright (C) 2016-2020 William Morrow
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+
 #include "vicon.h"
 
 #include "bctimer.h"
@@ -35,8 +56,7 @@ void VIcon::
 add_image(VFrame *frm, int ww, int hh, int vcmdl)
 {
        VIFrame *vifrm = new VIFrame(ww, hh, vcmdl);
-       VFrame *img = *vifrm;
-       img->transfer_from(frm);
+       vifrm->vfrm->transfer_from(frm);
        images.append(vifrm);
 }
 
@@ -279,9 +299,10 @@ update_view(int do_audio)
 {
        if( viewing ) viewing->stop_audio();
        delete view_win;  view_win = 0;
-       if( (viewing=vicon) != 0 ) {
+       VFrame *vfrm;
+       if( (viewing=vicon) != 0 && (vfrm=viewing->frame()) != 0 ) {
                view_win = new_view_window(0);
-               view_win->draw_vframe(viewing->frame());
+               view_win->draw_vframe(vfrm);
                view_win->flash(0);
                view_win->show_window();
                if( do_audio ) vicon->start_audio();
@@ -292,14 +313,15 @@ update_view(int do_audio)
 
 int VIconThread::zoom_scale(int dir)
 {
-       if( !viewing || !view_win ) return 0;
+       VFrame *vfrm;
+       if( !viewing || !view_win || !(vfrm=viewing->frame()) ) return 0;
        int view_h = this->view_h;
        view_h += dir*view_h/10 + dir;
        bclamp(view_h, 16,512);
        this->view_h = view_h;
        this->view_w = view_h * vw/vh;
        new_view_window(view_win);
-       view_win->draw_vframe(viewing->frame());
+       view_win->draw_vframe(vfrm);
        view_win->flash(1);
        return 1;
 }
@@ -328,13 +350,14 @@ draw(VIcon *vicon)
        int draw_img = visible(vicon, x, y);
        int draw_win = view_win && viewing == vicon ? 1 : 0;
        if( !draw_img && !draw_win ) return 0;
-       if( !vicon->frame() ) return 0;
+       VFrame *vfrm = vicon->frame();
+       if( !vfrm ) return 0;
        if( draw_img ) {
                vicon->draw_vframe(this, wdw, x, y);
                img_dirty = 1;
        }
        if( draw_win ) {
-               view_win->draw_vframe(vicon->frame());
+               view_win->draw_vframe(vfrm);
                win_dirty = 1;
        }
        return 1;
@@ -434,10 +457,11 @@ void VIcon::dump(const char *dir)
 {
        mkdir(dir,0777);
        for( int i=0; i<images.size(); ++i ) {
+               VFrame *vfrm = images[i]->vfrm;
+               if( !vfrm ) continue;
                char fn[1024];  sprintf(fn,"%s/img%05d.png",dir,i);
                printf("\r%s",fn);
-               VFrame *img = *images[i];
-               img->write_png(fn);
+               vfrm->write_png(fn);
        }
        printf("\n");
 }