upgraded x265,ffmpeg,tdb,it.po fixed tab armed toggle
authorGood Guy <good1.2guy@gmail.com>
Thu, 18 Aug 2016 17:55:18 +0000 (11:55 -0600)
committerGood Guy <good1.2guy@gmail.com>
Thu, 18 Aug 2016 17:55:18 +0000 (11:55 -0600)
18 files changed:
cinelerra-5.1/bld_scripts/bld_prepare.sh
cinelerra-5.1/cinelerra/localsession.h
cinelerra-5.1/cinelerra/mwindowgui.C
cinelerra-5.1/cinelerra/timelinepane.C
cinelerra-5.1/cinelerra/timelinepane.h
cinelerra-5.1/cinelerra/trackcanvas.C
cinelerra-5.1/cinelerra/trackscroll.C
cinelerra-5.1/configure.ac
cinelerra-5.1/db/s.h [deleted file]
cinelerra-5.1/db/tdb.C
cinelerra-5.1/db/tdb.h
cinelerra-5.1/db/utils/Makefile
cinelerra-5.1/db/xsch.C
cinelerra-5.1/po/it.po
cinelerra-5.1/thirdparty/src/ffmpeg-3.1.2.tar.xz [moved from cinelerra-5.1/thirdparty/src/ffmpeg-3.1.1.tar.xz with 50% similarity]
cinelerra-5.1/thirdparty/src/x265.patch1 [deleted file]
cinelerra-5.1/thirdparty/src/x265_1.9.tar.xz [deleted file]
cinelerra-5.1/thirdparty/src/x265_2.0.tar.xz [new file with mode: 0644]

index f6a2b7ecbb7749cacad8e9d9f41b52e59c5e1f7c..399fe30da512c894e7cb902c2913cba07c006abe 100755 (executable)
@@ -45,6 +45,7 @@ case "$dir" in
     flac-devel libsndfile-devel libtheora-devel linux-firmware \
     ivtv-firmware libvorbis-devel texinfo xz-devel lzma-devel cmake git \
     autoconf automake
+#   ctags patch gcc-c++ perl::XML_Parser libtiff-devel python dvdauthor
   ;;
 "suse" | "leap")
   zypper -n install nasm gcc gcc-c++ zlib-devel texinfo libpng16-devel \
index c00f23185f0ab930f98a347a1d9b7bf096cee152..21b586cbb02dfc855b5e8b1f4d8a199ca078b837 100644 (file)
@@ -86,7 +86,7 @@ public:
        double preview_start, preview_end;
 
 // Vertical start of track view in pixels
-       int64_t track_start[TOTAL_PANES];
+       int track_start[TOTAL_PANES];
 // Horizontal start of view in pixels.  This has to be pixels since either
 // samples or seconds would require drawing in fractional pixels.
        int64_t view_start[TOTAL_PANES];
index 91bc6b8d61eb2ccb650ef60134a72365620363a2..660c6d88b18ede9b7fcd41b55c7c7f65147605c6 100644 (file)
@@ -1161,239 +1161,125 @@ int MWindowGUI::save_defaults(BC_Hash *defaults)
 int MWindowGUI::keypress_event()
 {
 //printf("MWindowGUI::keypress_event 1 %d\n", get_keypress());
-       int result = 0;
-       result = mbuttons->keypress_event();
+       int result = mbuttons->keypress_event();
+       if( result ) return result;
 
-       if(!result)
-       {
-               switch(get_keypress())
-               {
-                       case 'e':
-                               mwindow->toggle_editing_mode();
-                               result = 1;
-                               break;
-                       case '1': case '2': case '3': case '4':
-                       case '5': case '6': case '7': case '8':
-                       if( !alt_down() || shift_down() ) break;
-                       if( !mwindow->select_asset(get_keypress()-'1',1) )
-                               result = 1;
-                       break;
-                       case LEFT:
-                               if(!ctrl_down())
-                               {
-                                       if (alt_down())
-                                       {
-                                               unlock_window();
-                                               mbuttons->transport->handle_transport(STOP, 1, 0, 0);
-                                               lock_window("MWindowGUI::keypress_event 1");
-                                               mwindow->prev_edit_handle(shift_down());
-                                       }
-                                       else
-                                               mwindow->move_left();
-                                       result = 1;
-                               }
-                               break;
-                       case RIGHT:
-                               if(!ctrl_down())
-                               {
-                                       if (alt_down())
-                                       {
-                                               unlock_window();
-                                               mbuttons->transport->handle_transport(STOP, 1, 0, 0);
-                                               lock_window("MWindowGUI::keypress_event 2");
-                                               mwindow->next_edit_handle(shift_down());
-                                       }
-                                       else
-                                               mwindow->move_right();
-                                       result = 1;
-                               }
-                               break;
-
-                       case UP:
-                               if(ctrl_down() && !alt_down())
-                               {
-                                       mwindow->expand_y();
-                                       result = 1;
-                               }
-                               else
-                               if(!ctrl_down() && alt_down())
-                               {
-                                       mwindow->expand_autos(0,1,1);
-                                       result = 1;
-                               }
-                               else
-                               if(ctrl_down() && alt_down())
-                               {
-                                       mwindow->expand_autos(1,1,1);
-                                       result = 1;
-                               }
-                               else
-                               {
-                                       mwindow->expand_sample();
-                                       result = 1;
-                               }
-                               break;
-
-                       case DOWN:
-                               if(ctrl_down() && !alt_down())
-                               {
-                                       mwindow->zoom_in_y();
-                                       result = 1;
-                               }
-                               else
-                               if(!ctrl_down() && alt_down())
-                               {
-                                       mwindow->shrink_autos(0,1,1);
-                                       result = 1;
-                               }
-                               else
-                               if(ctrl_down() && alt_down())
-                               {
-                                       mwindow->shrink_autos(1,1,1);
-                                       result = 1;
-                               }
-                               else
-                               {
-                                       mwindow->zoom_in_sample();
-                                       result = 1;
-                               }
-                               break;
-
-                       case PGUP:
-                               if(!ctrl_down())
-                               {
-                                       mwindow->move_up();
-                                       result = 1;
-                               }
-                               else
-                               {
-                                       mwindow->expand_t();
-                                       result = 1;
-                               }
-                               break;
-
-                       case PGDN:
-                               if(!ctrl_down())
-                               {
-                                       mwindow->move_down();
-                                       result = 1;
-                               }
-                               else
-                               {
-                                       mwindow->zoom_in_t();
-                                       result = 1;
-                               }
-                               break;
-
-//                     case TAB:
-//                     case LEFTTAB:
-//                             //int cursor_x = 0;
-//                             int cursor_y = 0;
-//                             for(int i = 0; i < TOTAL_PANES; i++)
-//                             {
-//                                     if(pane[i])
-//                                     {
-//                                             //cursor_x = pane[i]->canvas->get_relative_cursor_x();
-//                                             cursor_y = pane[i]->canvas->get_relative_cursor_y();
-//                                     }
-//                             }
-//
-//
-//                             if(get_keypress() == TAB)
-//                             {
-// // Switch the record button
-//                                     for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
-//                                     {
-//                                             int64_t track_x, track_y, track_w, track_h;
-//                                             canvas->track_dimensions(track, track_x, track_y, track_w, track_h);
-//
-//                                             if(cursor_y >= track_y &&
-//                                                     cursor_y < track_y + track_h)
-//                                             {
-//                                                     if (track->record)
-//                                                             track->record = 0;
-//                                                     else
-//                                                             track->record = 1;
-//                                                     result = 1;
-//                                                     break;
-//                                             }
-//                                     }
-//                             }
-//                             else
-//                             {
-//                                     Track *this_track = 0;
-//                                     for(Track *track = mwindow->edl->tracks->first; track; track = track->next)
-//                                     {
-//                                             int64_t track_x, track_y, track_w, track_h;
-//                                             canvas->track_dimensions(track, track_x, track_y, track_w, track_h);
-//
-//                                             if(cursor_y >= track_y &&
-//                                                     cursor_y < track_y + track_h)
-//                                             {
-//                                                     // This is our track
-//                                                     this_track = track;
-//                                                     break;
-//                                             }
-//                                     }
-//
-//                                     int total_selected = mwindow->edl->tracks->total_of(Tracks::RECORD);
-//
-//     // nothing previously selected
-//                                     if(total_selected == 0)
-//                                     {
-//                                             mwindow->edl->tracks->select_all(Tracks::RECORD,
-//                                                     1);
-//                                     }
-//                                     else
-//                                     if(total_selected == 1)
-//                                     {
-//     // this patch was previously the only one on
-//                                             if(this_track && this_track->record)
-//                                             {
-//                                                     mwindow->edl->tracks->select_all(Tracks::RECORD,
-//                                                             1);
-//                                             }
-//     // another patch was previously the only one on
-//                                             else
-//                                             {
-//                                                     mwindow->edl->tracks->select_all(Tracks::RECORD,
-//                                                             0);
-//                                                     if (this_track)
-//                                                             this_track->record = 1;
-//
-//                                             }
-//                                     }
-//                                     else
-//                                     if(total_selected > 1)
-//                                     {
-//                                             mwindow->edl->tracks->select_all(Tracks::RECORD,
-//                                                     0);
-//                                             if (this_track)
-//                                                     this_track->record = 1;
-//                                     }
-//
-//                             }
-//
-//                             update (0,
-//                                             1,
-//                                             0,
-//                                             0,
-//                                             1,
-//                                             0,
-//                                             1);
-//                             unlock_window();
-//                             mwindow->cwindow->update(0, 1, 1);
-//                             lock_window("TrackCanvas::keypress_event 3");
-//
-//                             result = 1;
-//                             break;
+       switch(get_keypress()) {
+       case 'e':
+               mwindow->toggle_editing_mode();
+               result = 1;
+               break;
+
+       case '1': case '2': case '3': case '4':
+       case '5': case '6': case '7': case '8':
+               if( !alt_down() || shift_down() ) break;
+               if( !mwindow->select_asset(get_keypress()-'1',1) )
+                       result = 1;
+               break;
+
+       case LEFT:
+               if( !ctrl_down() ) {
+                       if( alt_down() ) {
+                               unlock_window();
+                               mbuttons->transport->handle_transport(STOP, 1, 0, 0);
+                               lock_window("MWindowGUI::keypress_event 1");
+                               mwindow->prev_edit_handle(shift_down());
+                       }
+                       else
+                               mwindow->move_left();
+                       result = 1;
                }
+               break;
 
-// since things under cursor have changed...
-               if(result)
-                       cursor_motion_event();
+       case RIGHT:
+               if( !ctrl_down() ) {
+                       if( alt_down() ) {
+                               unlock_window();
+                               mbuttons->transport->handle_transport(STOP, 1, 0, 0);
+                               lock_window("MWindowGUI::keypress_event 2");
+                               mwindow->next_edit_handle(shift_down());
+                       }
+                       else
+                               mwindow->move_right();
+                       result = 1;
+               }
+               break;
+
+       case UP:
+               if( ctrl_down() && !alt_down() )
+                       mwindow->expand_y();
+               else if( !ctrl_down() && alt_down() )
+                       mwindow->expand_autos(0,1,1);
+               else if( ctrl_down() && alt_down() )
+                       mwindow->expand_autos(1,1,1);
+               else
+                       mwindow->expand_sample();
+               result = 1;
+               break;
+
+       case DOWN:
+               if( ctrl_down() && !alt_down() )
+                       mwindow->zoom_in_y();
+               else if( !ctrl_down() && alt_down() )
+                       mwindow->shrink_autos(0,1,1);
+               else if( ctrl_down() && alt_down() )
+                       mwindow->shrink_autos(1,1,1);
+               else
+                       mwindow->zoom_in_sample();
+               result = 1;
+               break;
+
+       case PGUP:
+               if( !ctrl_down() )
+                       mwindow->move_up();
+               else
+                       mwindow->expand_t();
+               result = 1;
+               break;
+
+       case PGDN:
+               if( !ctrl_down() )
+                       mwindow->move_down();
+               else
+                       mwindow->zoom_in_t();
+               result = 1;
+               break;
+
+       case TAB:
+       case LEFTTAB:
+               Track *this_track = 0;
+               for( int i=0; i<TOTAL_PANES; ++i ) {
+                       if( (this_track = pane[i]->over_track()) != 0 ) break;
+                       if( (this_track = pane[i]->over_patchbay()) != 0 ) break;
+               }
+
+               if( get_keypress() == TAB ) { // Switch the record button
+                       if( this_track )
+                               this_track->record = !this_track->record ? 1 : 0;
+               }
+               else {
+                       int total_selected = mwindow->edl->tracks->total_of(Tracks::RECORD);
+                       // all selected if nothing previously selected or
+                       // if this patch was previously the only one selected and armed
+                       int selected = !total_selected || (total_selected == 1 &&
+                               this_track && this_track->record ) ? 1 : 0;
+                       mwindow->edl->tracks->select_all(Tracks::RECORD, selected);
+                       if( !selected && this_track ) this_track->record = 1;
+               }
+
+               update(0, 1, 0, 0, 1, 0, 1);
+               unlock_window();
+               mwindow->cwindow->update(0, 1, 1);
+               lock_window("TrackCanvas::keypress_event 3");
+
+               result = 1;
+               break;
        }
 
+// since things under cursor have changed...
+       if(result)
+               cursor_motion_event();
+
        return result;
 }
 
index 7698cb6936c1f512b07d2d0b0e61484987e0876c..dab40b898e5c549b711f04916ceafe500d7f07e2 100644 (file)
@@ -312,19 +312,13 @@ void TimelinePane::activate()
        gui->focused_pane = number;
 }
 
-Track *TimelinePane::is_over_patchbay()
+Track *TimelinePane::over_track()
 {
-       if( !patchbay ) return 0;
-       int cursor_x = gui->get_relative_cursor_x() - x;
-       if( cursor_x < 0 || cursor_x >= w ) return 0;
-       int cursor_y = gui->get_relative_cursor_y() - y;
-       if( cursor_y < 0 || cursor_y >= h ) return 0;
-       int no = number;
-       TrackScroll *trackscroll = gui->pane[no]->trackscroll;
-       if( !trackscroll )
-               trackscroll = gui->pane[++no]->trackscroll;
-// left panes have patchbays, right panes have trackscroll
-       int pane_y = cursor_y + trackscroll->get_position();
+       int canvas_x = canvas->get_relative_cursor_x();
+       if( canvas_x < 0 || canvas_x >= canvas->get_w() ) return 0;
+       int canvas_y = canvas->get_relative_cursor_y();
+       if( canvas_y < 0 || canvas_y >= canvas->get_h() ) return 0;
+       int pane_y = canvas_y + mwindow->edl->local_session->track_start[number];
        for( Track *track=mwindow->edl->tracks->first; track; track=track->next ) {
                int track_y = track->y_pixel; 
                if( pane_y < track_y ) continue;
@@ -336,4 +330,24 @@ Track *TimelinePane::is_over_patchbay()
        return 0;
 }
 
+Track *TimelinePane::over_patchbay()
+{
+       if( !patchbay ) return 0;
+       int patch_x = patchbay->get_relative_cursor_x() ;
+       if( patch_x < 0 || patch_x >= patchbay->get_w() ) return 0;
+       int patch_y = patchbay->get_relative_cursor_y();
+       if( patch_y < 0 || patch_y >= patchbay->get_h() ) return 0;
+//     int canvas_x = patch_x + patchbay->get_x() - canvas->get_x();
+       int canvas_y = patch_y + patchbay->get_y() - canvas->get_y();
+       int pane_y = canvas_y + mwindow->edl->local_session->track_start[number];
+       for( Track *track=mwindow->edl->tracks->first; track; track=track->next ) {
+               int track_y = track->y_pixel; 
+               if( pane_y < track_y ) continue;
+               track_y += track->vertical_span(mwindow->theme);
+               if( pane_y < track_y )
+                       return track;
+       }
+
+       return 0;
+}
 
index eb2da294bd8dd54720d7fc000a6f4255aac1118f..d5302c54508b035da84fe2b06198a06ff7d3bf86 100644 (file)
@@ -33,7 +33,8 @@ public:
        void activate();
        void create_track_scroll(int view_x, int view_y, int view_w, int view_h);
        void create_sample_scroll(int view_x, int view_y, int view_w, int view_h);
-       Track *is_over_patchbay();
+       Track *over_track();
+       Track *over_patchbay();
 
        MWindow *mwindow;
        MWindowGUI *gui;
index 2a64845af735e32a78d69bbac13b4298c386ac5c..661f473b53bd619f705701f50dc5a72272c2c646 100644 (file)
@@ -253,7 +253,7 @@ int TrackCanvas::drag_motion(Track **over_track,
        }
 
         if( !*over_track )
-               *over_track = pane->is_over_patchbay();
+               *over_track = pane->over_patchbay();
 
        return 0;
 }
@@ -281,7 +281,7 @@ int TrackCanvas::drag_stop(int *redraw)
                    (cursor_y = get_relative_cursor_y()) >= 0 && cursor_y < get_h() )
                        over_window = 1;
                else {
-                       Track *track = pane->is_over_patchbay();
+                       Track *track = pane->over_patchbay();
                        if( track && mwindow->session->track_highlighted == track )
                                over_window = 1;
                }
index c4341001adab98fbe0860d53af0e2cd490b32bad..4d5a4313426659e6d581541c1593e498e36aec24 100644 (file)
@@ -114,6 +114,14 @@ void TrackScroll::set_position()
        if( max_pos < 0 ) max_pos = 0;
        if( mwindow->edl->local_session->track_start[pane->number] > max_pos )
                mwindow->edl->local_session->track_start[pane->number] = max_pos;
+       if( pane->number == TOP_RIGHT_PANE ) {
+               if( mwindow->edl->local_session->track_start[TOP_LEFT_PANE] > max_pos )
+                       mwindow->edl->local_session->track_start[TOP_LEFT_PANE] = max_pos;
+       }
+       else if( pane->number == BOTTOM_RIGHT_PANE ) {
+               if( mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] > max_pos )
+                       mwindow->edl->local_session->track_start[BOTTOM_LEFT_PANE] = max_pos;
+       }
        update_length(
                mwindow->edl->get_tracks_height(mwindow->theme),
                mwindow->edl->local_session->track_start[pane->number],
index 72e81c28e792b3ee9bdb7401d3992e0db15f9496..df40ef58d91baffc5e8ef7dbae09cf8843ddcd36 100644 (file)
@@ -134,7 +134,7 @@ PKG_3RD([fdk],[auto],
   [ libAACdec/include libAACenc/include libSYS/include ])
 
 PKG_3RD([ffmpeg],[yes],
-  [ffmpeg-3.1.1],
+  [ffmpeg-3.1.2],
   [ libavutil/libavutil.a \
     libavcodec/libavcodec.a \
     libpostproc/libpostproc.a \
@@ -308,7 +308,7 @@ PKG_3RD([x264],[yes],
   [ . ])
 
 PKG_3RD([x265],[yes],
-  [x265_1.9],
+  [x265_2.0],
   [ libx265.a ],
   [ . source ])
 
diff --git a/cinelerra-5.1/db/s.h b/cinelerra-5.1/db/s.h
deleted file mode 100644 (file)
index 9b8cd35..0000000
+++ /dev/null
@@ -1,301 +0,0 @@
-#ifndef _S_H_
-#define _S_H_
-#include <cstdio>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include "tdb.h"
-
-
-// Video_frame
-DbObj(Video_frame)
-  basic_def(double,Frame_mean);
-  basic_def(double,Frame_std_dev);
-  basic_def(double,Frame_cx);
-  basic_def(double,Frame_cy);
-  basic_def(double,Frame_moment);
-  varray_def(unsigned char,Frame_data);
-};
-
-DbLoc(Video_frame)
-  basic_ref(double,Frame_mean);
-  basic_ref(double,Frame_std_dev);
-  basic_ref(double,Frame_cx);
-  basic_ref(double,Frame_cy);
-  basic_ref(double,Frame_moment);
-  varray_ref(unsigned char,Frame_data);
-
-  class ikey_Frame_weight : public Db::iKey { public:
-    Video_frameObj::t_Frame_mean v_Frame_mean;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Frame_weight(ObjectLoc &loc,
-        double Frame_mean, int id=-1)
-    : iKey("Frame_weight",loc,cmpr),
-      v_Frame_mean(Frame_mean),
-      v_id(id) {}
-  };
-  class rkey_Frame_weight : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Frame_weight(ObjectLoc &loc) : rKey("Frame_weight",loc,cmpr) {}
-  };
-
-  class ikey_Frame_center : public Db::iKey { public:
-    Video_frameObj::t_Frame_moment v_Frame_moment;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Frame_center(ObjectLoc &loc,
-        double Frame_moment, int id=-1)
-    : iKey("Frame_center",loc,cmpr),
-      v_Frame_moment(Frame_moment),
-      v_id(id) {}
-  };
-  class rkey_Frame_center : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Frame_center(ObjectLoc &loc) : rKey("Frame_center",loc,cmpr) {}
-  };
-
-  int Allocate();
-  int Construct();
-  int Destruct();
-  void Deallocate();
-};
-// Timeline
-DbObj(Timeline)
-  basic_def(unsigned int,Clip_id);
-  basic_def(unsigned int,Sequence_no);
-  basic_def(unsigned int,Frame_id);
-  basic_def(unsigned int,Group);
-  basic_def(double,Time_offset);
-};
-
-DbLoc(Timeline)
-  basic_ref(unsigned int,Clip_id);
-  basic_ref(unsigned int,Sequence_no);
-  basic_ref(unsigned int,Frame_id);
-  basic_ref(unsigned int,Group);
-  basic_ref(double,Time_offset);
-
-  class ikey_Timelines : public Db::iKey { public:
-    TimelineObj::t_Frame_id v_Frame_id;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Timelines(ObjectLoc &loc,
-        unsigned int Frame_id, int id=-1)
-    : iKey("Timelines",loc,cmpr),
-      v_Frame_id(Frame_id),
-      v_id(id) {}
-  };
-  class rkey_Timelines : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Timelines(ObjectLoc &loc) : rKey("Timelines",loc,cmpr) {}
-  };
-
-  class ikey_Sequences : public Db::iKey { public:
-    TimelineObj::t_Clip_id v_Clip_id;
-    TimelineObj::t_Sequence_no v_Sequence_no;
-    static int cmpr(char *a, char *b);
-    ikey_Sequences(ObjectLoc &loc,
-        unsigned int Clip_id,
-        unsigned int Sequence_no)
-    : iKey("Sequences",loc,cmpr),
-      v_Clip_id(Clip_id),
-      v_Sequence_no(Sequence_no) {}
-  };
-  class rkey_Sequences : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Sequences(ObjectLoc &loc) : rKey("Sequences",loc,cmpr) {}
-  };
-
-  int Allocate();
-  int Construct();
-  int Destruct();
-  void Deallocate();
-};
-// Clip_set
-DbObj(Clip_set)
-  sarray_def(char,Title);
-  sarray_def(char,Asset_path);
-  basic_def(double,Position);
-  basic_def(double,Framerate);
-  basic_def(double,Average_weight);
-  basic_def(unsigned int,Frames);
-  basic_def(unsigned int,Prefix_size);
-  basic_def(unsigned int,Suffix_size);
-  varray_def(unsigned char,Weights);
-  basic_def(long,System_time);
-  basic_def(long,Creation_time);
-};
-
-DbLoc(Clip_set)
-  sarray_ref(char,Title);
-  sarray_ref(char,Asset_path);
-  basic_ref(double,Position);
-  basic_ref(double,Framerate);
-  basic_ref(double,Average_weight);
-  basic_ref(unsigned int,Frames);
-  basic_ref(unsigned int,Prefix_size);
-  basic_ref(unsigned int,Suffix_size);
-  varray_ref(unsigned char,Weights);
-  basic_ref(long,System_time);
-  basic_ref(long,Creation_time);
-
-  class ikey_Clip_title : public Db::iKey { public:
-    Clip_setObj::t_Title v_Title;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Clip_title(ObjectLoc &loc,
-        const Clip_setObj::t_Title &Title, int id=-1)
-    : iKey("Clip_title",loc,cmpr),
-      v_Title(Title),
-      v_id(id) {}
-  };
-  class rkey_Clip_title : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Clip_title(ObjectLoc &loc) : rKey("Clip_title",loc,cmpr) {}
-  };
-
-  class ikey_Clip_system_time : public Db::iKey { public:
-    Clip_setObj::t_System_time v_System_time;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Clip_system_time(ObjectLoc &loc,
-        long System_time, int id=-1)
-    : iKey("Clip_system_time",loc,cmpr),
-      v_System_time(System_time),
-      v_id(id) {}
-  };
-  class rkey_Clip_system_time : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Clip_system_time(ObjectLoc &loc) : rKey("Clip_system_time",loc,cmpr) {}
-  };
-
-  class ikey_Clip_creation_time : public Db::iKey { public:
-    Clip_setObj::t_Creation_time v_Creation_time;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Clip_creation_time(ObjectLoc &loc,
-        long Creation_time, int id=-1)
-    : iKey("Clip_creation_time",loc,cmpr),
-      v_Creation_time(Creation_time),
-      v_id(id) {}
-  };
-  class rkey_Clip_creation_time : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Clip_creation_time(ObjectLoc &loc) : rKey("Clip_creation_time",loc,cmpr) {}
-  };
-
-  class ikey_Clip_path_pos : public Db::iKey { public:
-    Clip_setObj::t_Asset_path v_Asset_path;
-    Clip_setObj::t_Position v_Position;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Clip_path_pos(ObjectLoc &loc,
-        const Clip_setObj::t_Asset_path &Asset_path,
-        double Position, int id=-1)
-    : iKey("Clip_path_pos",loc,cmpr),
-      v_Asset_path(Asset_path),
-      v_Position(Position),
-      v_id(id) {}
-  };
-  class rkey_Clip_path_pos : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Clip_path_pos(ObjectLoc &loc) : rKey("Clip_path_pos",loc,cmpr) {}
-  };
-
-  int Allocate();
-  int Construct();
-  int Destruct();
-  void Deallocate();
-};
-// Clip_views
-DbObj(Clip_views)
-  basic_def(unsigned int,Access_clip_id);
-  basic_def(long,Access_time);
-  basic_def(unsigned int,Access_count);
-};
-
-DbLoc(Clip_views)
-  basic_ref(unsigned int,Access_clip_id);
-  basic_ref(long,Access_time);
-  basic_ref(unsigned int,Access_count);
-
-  class ikey_Clip_access : public Db::iKey { public:
-    Clip_viewsObj::t_Access_clip_id v_Access_clip_id;
-    static int cmpr(char *a, char *b);
-    ikey_Clip_access(ObjectLoc &loc,
-        unsigned int Access_clip_id)
-    : iKey("Clip_access",loc,cmpr),
-      v_Access_clip_id(Access_clip_id) {}
-  };
-  class rkey_Clip_access : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Clip_access(ObjectLoc &loc) : rKey("Clip_access",loc,cmpr) {}
-  };
-
-  class ikey_Last_view : public Db::iKey { public:
-    Clip_viewsObj::t_Access_time v_Access_time;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Last_view(ObjectLoc &loc,
-        long Access_time, int id=-1)
-    : iKey("Last_view",loc,cmpr),
-      v_Access_time(Access_time),
-      v_id(id) {}
-  };
-  class rkey_Last_view : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Last_view(ObjectLoc &loc) : rKey("Last_view",loc,cmpr) {}
-  };
-
-  class ikey_Total_views : public Db::iKey { public:
-    Clip_viewsObj::t_Access_count v_Access_count;
-    Clip_viewsObj::t_Access_clip_id v_Access_clip_id;
-    int v_id;
-    static int cmpr(char *a, char *b);
-    ikey_Total_views(ObjectLoc &loc,
-        unsigned int Access_count,
-        unsigned int Access_clip_id, int id=-1)
-    : iKey("Total_views",loc,cmpr),
-      v_Access_count(Access_count),
-      v_Access_clip_id(Access_clip_id),
-      v_id(id) {}
-  };
-  class rkey_Total_views : public Db::rKey { public:
-    static int cmpr(char *a, char *b);
-    rkey_Total_views(ObjectLoc &loc) : rKey("Total_views",loc,cmpr) {}
-  };
-
-  int Allocate();
-  int Construct();
-  int Destruct();
-  void Deallocate();
-};
-
-
-class theDb : public Db {
-  int dfd, dkey, no_atime;
-  int db_create();
-  int db_open();
-  int db_access();
-public:
-  Objects objects;
-  Entity Video_frame;  Video_frameLoc video_frame;
-  Entity Timeline;  TimelineLoc timeline;
-  Entity Clip_set;  Clip_setLoc clip_set;
-  Entity Clip_views;  Clip_viewsLoc clip_views;
-
-  int create(const char *dfn);
-  int open(const char *dfn, int key=-1);
-  int access(const char *dfn, int key=-1, int rw=0);
-  void close();
-  int attach(int rw=0) { return Db::attach(rw); }
-  int detach() { return Db::detach(); }
-
-  theDb();
-  ~theDb() { finit(objects); }
-};
-
-#endif
index 0e8d0f98f0b0a168b68725b295d2aea1eaf5a55c..566b7791baf30a97bce3879299ddf261121fe589 100644 (file)
@@ -221,19 +221,15 @@ Error(int v,const char *msg)
   dmsg(DBBUG_ERR,"%s\n",msg);
 }
 
-void
-Db::dmp()
+void Db::
+dmp()
 {
   tdmp();  pdmp();
-  printf("freeStoreIndex\n"); fdmp();
-  printf("addrStoreIndex\n"); admp();
-  printf("freeSpaceIndex\n"); edmp();
-  printf("addrSpaceIndex\n"); bdmp();
   printf("\n");
 }
 
-void
-Db::tdmp()
+void Db::
+tdmp()
 {
   printf("dmp  root_info->file_size %016lx\n",
     root_info->file_size);
@@ -249,10 +245,12 @@ Db::tdmp()
   for( int idx=0; idx<root_info->indeciesUsed; ++idx ) {
     IndexBase *ib = indecies[idx];
     if( !ib ) continue;
-    printf("     idx %d. %-24s %s  pop %5ld"
+    printf("     idx %d. %-24s %s%c pop %5ld"
       "   root %-5d rhs %-5d ky/Dt %2d/%-2d ",
       idx, &ib->st->name[0], ib->st->type==idxBin ? "bin" :
-      ib->st->type==idxStr ? "str" : "???", ib->st->count,
+      ib->st->type==idxStr ? "str" : "???",
+      ib->st->key_type >= ktyBin && ib->st->key_type <= ktyDir ?
+        " *="[ib->st->key_type] : '?', ib->st->count,
       ib->st->rootPageId, ib->st->rightHandSide,
       ib->st->keySz, ib->st->dataSz);
     printf("   free %d/",ib->st->freeBlocks);
@@ -282,8 +280,8 @@ Db::tdmp()
   } while( !entityIdIndex->Next(&eid,&ent.obj) );
 }
 
-void
-Db::pdmp()
+void Db::
+pdmp()
 {
   printf("   root_info->pageTableUsed %d\n",root_info->pageTableUsed);
   for( int pid=0; pid<root_info->pageTableUsed; ++pid ) {
@@ -304,8 +302,8 @@ Db::pdmp()
   printf(",  pages = %d\n",n);
 }
 
-void
-Db::fdmp()
+void Db::
+fdmp()
 {
   freeStoreRecord free;
   if( !freeStoreIndex->First(&free,0) ) do {
@@ -313,8 +311,8 @@ Db::fdmp()
   } while( !freeStoreIndex->Next(&free,0) );
 }
 
-void
-Db::admp()
+void Db::
+admp()
 {
   addrStoreRecord addr;
   if( !addrStoreIndex->First(&addr,0) ) do {
@@ -322,8 +320,19 @@ Db::admp()
   } while( !addrStoreIndex->Next(&addr,0) );
 }
 
-void
-Db::achk()
+void Db::
+cdmp()
+{
+  Entity e(this);  EntityLoc &ent = e.ent;  int ret, eid;
+  if( !(ret=entityIdIndex->First(&eid,&ent.obj)) ) do {
+    printf(" %d. %-32s  %5d/%-5d  %d\n",eid,ent->name,
+      ent->alloc_cache.loc.id, ent->alloc_cache.loc.offset,
+      ent->alloc_cache.avail);
+  } while( !(ret=entityIdIndex->Next(&eid,&ent.obj)) );
+}
+
+void Db::
+achk()
 {
   if( !indecies ) return;  addrStoreRecord addr;
   addrStoreRecord last;  last.io_addr = 0; last.size = 0;
@@ -338,8 +347,8 @@ Db::achk()
   } while( !addrStoreIndex->Next(&addr,0) );
 }
 
-void
-Db::fchk()
+void Db::
+fchk()
 {
   if( !indecies ) return;  freeStoreRecord free;
   freeStoreRecord last;  last.size = 0; last.io_addr = 0;
@@ -354,8 +363,8 @@ Db::fchk()
   } while( !freeStoreIndex->Next(&free,0) );
 }
 
-void
-Db::edmp()
+void Db::
+edmp(AllocCache &cache)
 {
   freeSpaceRecord free;
   if( !freeSpaceIndex->First(&free,0) ) do {
@@ -363,8 +372,8 @@ Db::edmp()
   } while( !freeSpaceIndex->Next(&free,0) );
 }
 
-void
-Db::bdmp()
+void Db::
+bdmp(AllocCache &cache)
 {
   addrSpaceRecord addr;
   if( !addrSpaceIndex->First(&addr,0) ) do {
@@ -373,7 +382,7 @@ Db::bdmp()
 }
 
 void Db::
-stats(int chk)
+stats()
 {
   long store_allocated=0, store_used=0;
   long loaded_allocated=0, loaded_used=0;
@@ -412,21 +421,6 @@ stats(int chk)
   printf("    write  %8d/%-7.3f%%  alloc:%-12ld  used:%-12ld  %7.3f%%\n",
     pages_written, percent(pages_written, root_info->pageTableUsed),
     written_allocated, written_used, percent(written_used, written_allocated));
-  if( chk ) {
-    long store_avail=0, space_avail=0;
-    freeStoreRecord store;
-    if( !freeStoreIndex->First(&store,0) ) do {
-      store_avail += store.size;
-    } while( !freeStoreIndex->Next(&store,0) );
-    freeSpaceRecord space;
-    if( !freeSpaceIndex->First(&space,0) ) do {
-      space_avail += space.size;
-    } while( !freeSpaceIndex->Next(&space,0) );
-    printf("  file %-12ld", root_info->file_size);
-    printf("  store %12ld/%-7.3f%%  space %12ld/%-7.3f%%\n",
-      store_avail, percent(store_avail, root_info->file_size),
-      space_avail, percent(space_avail, root_info->file_size));
-  }
 #undef percent
 }
 
@@ -1024,9 +1018,9 @@ Locate(int op, void *key, CmprFn cmpr, void *rtnKey, void *rtnData)
   if_fail( refLocate(last, op, key, cmpr) );
   char *kp = 0;
   if_err( db->addrRead_(last,kp) );
-  if( rtnKey )
-    memmove(rtnKey,kp,st->keySz);
-  if( rtnData )
+  if( rtnKey && st->keySz > 0 )
+    wr_key(kp, (char*)rtnKey,st->keySz);
+  if( rtnData && st->dataSz > 0 )
     memmove(rtnData,kp+st->keySz,st->dataSz);
   return 0;
 }
@@ -1210,8 +1204,10 @@ chkInsert(void *key, void *data)
   if( !rhs ) return 0;                          /* not a hit */
   if( spp->iallocated()-slen < kdSz ) return 0; /* doesnt fit */
   if( rp > kn ) memmove(kn+kdSz,kn,rp-kn);      /* move data up */
-  memmove(kn,key,st->keySz);
-  memmove(kn+st->keySz,data,st->dataSz);        /* add new key/data */
+  if( key && st->keySz > 0 )
+    wr_key(key, kn,st->keySz);
+  if( data && st->dataSz > 0 )
+    memmove(kn+st->keySz,data,st->dataSz);        /* add new key/data */
   spp->iused(slen + kdSz);
   keyInterior = 0;
   lastAccess.id = s;
@@ -1356,9 +1352,9 @@ keyInsert(pageId s, pageId &t)
 void Db::IndexBinary::
 makeKey(char *cp,char *key,int l,char *recd,int n)
 {
-  writePageId(cp,NIL);
-  memmove(cp+=sizeof(pageId),key,l);
-  if( recd ) memmove(cp+=l,recd,n);
+  writePageId(cp,NIL);  cp += sizeof(pageId);
+  if( l > 0 ) { wr_key(key, cp,l);  cp += l; }
+  if( n > 0 && recd ) memmove(cp,recd,n);
 }
 
 /***
@@ -1722,9 +1718,9 @@ First(void *rtnKey,void *rtnData)
   if_fail( keyFirst(first, st->rootPageId) );
   char *kp = 0;
   if_err( db->addrRead_(first,kp) );
-  if( rtnKey )
-    memmove(rtnKey,kp,st->keySz);
-  if( rtnData )
+  if( rtnKey && st->keySz > 0 )
+    wr_key(kp, (char*)rtnKey,st->keySz);
+  if( rtnData && st->dataSz > 0 )
     memmove(rtnData,kp+st->keySz,st->dataSz);
 { locked by(idxLk);
   lastNext = lastAccess = first; }
@@ -1780,9 +1776,9 @@ Last(void *rtnKey,void *rtnData)
   if_fail( keyLast(last, st->rootPageId) );
   char *kp = 0;
   if_err( db->addrRead_(last,kp) );
-  if( rtnKey )
-    memmove(rtnKey,kp,st->keySz);
-  if( rtnData )
+  if( rtnKey && st->keySz > 0 )
+    wr_key(kp, (char*)rtnKey,st->keySz);
+  if( rtnData && st->dataSz > 0 )
     memmove(rtnData,kp+st->keySz,st->dataSz);
 { locked by(idxLk);
   lastNext = lastAccess = last; }
@@ -1856,16 +1852,20 @@ Next(pgRef &loc,void *rtnKey,void *rtnData)
   if_ret( ret );
   if( !ret ) {
     char *ky = 0;
-    if( !st->keySz && rtnKey )                      // rtnKey is rKey class
+    switch( st->key_type ) {
+    case ktyInd:
       ky = (char *)rtnKey;
-    else 
+      break;
+    case ktyBin: case ktyDir:
       if_err( db->addrRead_(loc,ky) );
+      break;
+    }
     if_ret( keyNext(loc, ky) );                 // try the hard way
   }
   if_err( db->addrRead_(loc,kp) );
-  if( rtnKey )
-    memmove(rtnKey,kp,st->keySz);
-  if( rtnData )
+  if( rtnKey && st->keySz > 0 )
+    wr_key(kp, (char*)rtnKey,st->keySz);
+  if( rtnData && st->dataSz > 0 )
     memmove(rtnData,kp+st->keySz,st->dataSz);
 { locked by(idxLk);
   lastAccess = loc; }
@@ -1883,7 +1883,7 @@ Db::IndexBinary::
 IndexBinary(Db *zdb, int zidx, int ksz, int dsz, CmprFn cmpr)
  : IndexBase(zdb, idxBin, zidx, ksz, dsz)
 {
-  compare = !cmpr && !ksz ? cmprKey : cmpr;
+  compare = cmpr;
   bst = new(st+1) IndexBinaryStorage(zdb->findCmprFn(compare));
   iky = new char[st->blockSize/2+1];
   tky = new char[st->blockSize/2+1];
@@ -1895,7 +1895,7 @@ IndexBinary(Db *zdb, IndexBaseStorage *b, IndexBinaryStorage *d)
  : IndexBase(zdb, *b)
 {
   bst = new(d) IndexBinaryStorage();
-  compare = !bst->cmprId && !b->keySz ? cmprKey : cmprFns[bst->cmprId];
+  compare = cmprFns[bst->cmprId];
   iky = new char[st->blockSize/2+1];
   tky = new char[st->blockSize/2+1];
   init();
@@ -1906,7 +1906,7 @@ IndexBinary(IndexBase *ib, IndexBaseStorage *b, IndexBinaryStorage *d)
  : IndexBase(ib->db, *b)
 {
   bst = new(d) IndexBinaryStorage();
-  compare = !bst->cmprId && !ib->st->keySz ? cmprKey : cmprFns[bst->cmprId];
+  compare = cmprFns[bst->cmprId];
   init();
 }
 
@@ -3097,6 +3097,17 @@ UnmakeRoot()
   return 0;
 }
 
+void Db::IndexBase::
+chkLastReset()
+{
+  lastOp = opFind;
+  lastAccess.id = lastDelete.id = lastInsert.id =
+    lastFind.id = lastNext.id = NIL;
+  lastAccess.offset = lastDelete.offset = lastInsert.offset =
+    lastFind.offset = lastNext.offset = 0;
+  cFindCount = cDelCount = cInsCount = 0;
+}
+
 void Db::IndexBase::
 chkLastInsert()
 {
@@ -3217,7 +3228,7 @@ Db::IndexBase::
  */
 
 int Db::
-objectHeapInsert(int sz,int id,int offset)
+objectHeapInsert(int sz,int id,int offset,AllocCache &cache)
 {
   freeSpaceRecord free;
   free.size = sz;  free.id = id;  free.offset = offset;
@@ -3241,7 +3252,7 @@ objectHeapInsert(int sz,int id,int offset)
  */
 
 int Db::
-objectHeapDelete(int sz,int id,int offset)
+objectHeapDelete(int sz,int id,int offset,AllocCache &cache)
 {
   freeSpaceRecord free;
   free.size = sz;  free.id = id;  free.offset = offset;
@@ -3278,7 +3289,7 @@ pgRefGet(int &size, pgRef &loc, AllocCache &cache)
     if( status == errNotFound ) return 1;
     if_err( status );
   }
-  if_err( objectHeapDelete(find.size,find.id,find.offset) );
+  if_err( objectHeapDelete(find.size,find.id,find.offset,cache) );
   loc.id = find.id;
   loc.offset = find.offset ? find.offset : sizeof(pagePrefix);
   Page &pg = *get_page(loc.id);
@@ -3286,7 +3297,7 @@ pgRefGet(int &size, pgRef &loc, AllocCache &cache)
   if( ofs > pg->used ) pg->used = ofs;
   int sz = find.offset+find.size - ofs;
   if( sz >= min_heap_allocation ) {
-    //if_err( objectHeapInsert(sz,find.id,ofs) );
+    //if_err( objectHeapInsert(sz,find.id,ofs,cache) );
     if_err( cache.Load(this, find.id, ofs, sz) );
   }
   else
@@ -3324,7 +3335,7 @@ pgRefNew(int &size, pgRef &loc, AllocCache &cache)
   int used = loc.offset + size;
   int free = pg->allocated - used;
   if( free >= min_heap_allocation ) {
-    //if_err( objectHeapInsert(free,id,used) );
+    //if_err( objectHeapInsert(free,id,used,cache) );
     if_err( cache.Load(this, id, used, free) );
   }
   else
@@ -3403,7 +3414,7 @@ objectAllocate(int typ, int &size, pgRef &loc, AllocCache &cache)
  * returns zero on success, error code on failure
  */
 
-int Db::objectFree(pgRef &loc)
+int Db::objectFree(pgRef &loc,AllocCache &cache)
 {
   allocPrefix *mp;
   if_err( addrRead_(loc,mp) );
@@ -3428,14 +3439,14 @@ int Db::objectFree(pgRef &loc)
   /* merge with prev if possible */
   if( prev.id == addr.id &&
     prev.offset + prev.size == addr.offset ) {
-    if_err( objectHeapDelete(prev.size,prev.id,prev.offset) );
+    if_err( objectHeapDelete(prev.size,prev.id,prev.offset,cache) );
     addr.offset = prev.offset;
     addr.size += prev.size;
   }
   /* merge with next if possible */
   if( addr.id == next.id &&
       addr.offset + addr.size == next.offset ) {
-    if_err( objectHeapDelete(next.size,next.id,next.offset) );
+    if_err( objectHeapDelete(next.size,next.id,next.offset,cache) );
     addr.size += next.size;
   }
   /* reduce used block bytes if possible */
@@ -3446,7 +3457,7 @@ int Db::objectFree(pgRef &loc)
   if( pg->used == sizeof(pagePrefix) )
     pg.release();
   else
-    if_err( objectHeapInsert(addr.size,addr.id,addr.offset) );
+    if_err( objectHeapInsert(addr.size,addr.id,addr.offset,cache) );
   return 0;
 }
 
@@ -3545,6 +3556,14 @@ blockRelease(pageId pid)
   return pp->release();
 }
 
+int Db::IndexBase::
+blockLoad(pageId pid)
+{
+  pgRef loc;  char *op = 0;
+  loc.id = pid;  loc.offset = 0;
+  return db->addrRead(loc, op);
+}
+
 /*** int Db::deleteFreeBlock()
  *
  * Purpose: release database memory/storage
@@ -3847,7 +3866,7 @@ int Db::AllocCache::
 cacheFlush(Db *db)
 {
   if( loc.id >= 0 ) {
-    if_ret( db->objectHeapInsert(avail,loc.id,loc.offset) );
+    if_ret( db->objectHeapInsert(avail,loc.id,loc.offset,*this) );
     loc.id = NIL;
   }
   return 0;
@@ -3880,7 +3899,7 @@ Load(Db *db, pageId id, int ofs, int sz)
 {
   if( loc.id >= 0 ) {
     if( avail > sz ) {
-      if_ret( db->objectHeapInsert(sz,id,ofs) );
+      if_ret( db->objectHeapInsert(sz,id,ofs,*this) );
       return 0;
     }
     cacheFlush(db);
@@ -3889,15 +3908,31 @@ Load(Db *db, pageId id, int ofs, int sz)
   return 0;
 }
 
+void Db::
+cacheDelete(AllocCache &cache)
+{
+  freeSpaceRecord free;
+  if( !freeSpaceIndex->First(&free,0) ) do {
+//    printf("free=%04lx %d/%d\n", free.size,free.id,free.offset);
+    objectHeapInsert(free.size, free.id, free.offset,alloc_cache);
+  } while( !freeSpaceIndex->Next(&free,0) );
+  indecies[cache.freeIdx]->Clear();
+  indecies[cache.addrIdx]->Clear();
+  del_index(cache.freeIdx);
+  del_index(cache.addrIdx);
+  cache.freeIdx = -1;
+  cache.addrIdx = -1;
+}
+
 int Db::cache_all_flush()
 {
-  if_err( cacheFlush() );
   Entity e(this);  EntityLoc &ent = e.ent;  int ret;
   if( !(ret=entityIdIndex->First(0,&ent.obj)) ) do {
     if_err( ent.cacheFlush() );
   } while( !(ret=entityIdIndex->Next(0,&ent.obj)) );
   if( ret == errNotFound ) ret = 0;
   if_err( ret );
+  if_err( cacheFlush() );
   return 0;
 }
 
@@ -3924,7 +3959,7 @@ deallocate(pgRef &loc, AllocCache &cache)
   locked by(db_info->objAlLk);
   cache.cacheFlush(this);
   if( loc.id < 0 ) return 0;
-  if_fail( objectFree(loc) );
+  if_fail( objectFree(loc, cache) );
   loc.id = NIL;  loc.offset = 0;
   return 0;
 }
@@ -4388,6 +4423,7 @@ start_transaction(int undo_save)
   for( int idx=0; idx<root_info->indeciesUsed; ++idx ) {
     IndexBase *bip = indecies[idx];
     if( !bip ) continue;
+    bip->chkLastReset();
     pageId r = bip->st->rootPageId;
     if( r < 0 ) continue;
     if( r != bip->st->rightHandSide ) continue;
@@ -4577,9 +4613,11 @@ icommit(int force)
       if( pg->used )
         if_err( pageWrite(pg) );
     }
-    if( force < 0 ) {
-      pageDealloc(pg);
-      pg->set_flags(fl_rd);
+    if( force ) {
+      if( force < 0 || pg->type < pg_index || pg->type > max_index_type ) {
+        pageDealloc(pg);
+        pg->set_flags(fl_rd);
+      }
     }
   }
 
@@ -4740,6 +4778,14 @@ readRootInfo(int(Db::*fn)(char *dp,int sz))
     }
   }
 
+  // allocator
+  int fidx = get_index(".free");
+  if( fidx < 0 ) Err(errCorrupt);
+  int aidx = get_index(".addr");
+  if( aidx < 0 ) Err(errCorrupt);
+  alloc_cache.freeIdx = fidx;
+  alloc_cache.addrIdx = aidx;
+
   // pageTable data
   page_table_sz = root_info->pageTableUsed;
   sz = pageTableHunks(page_table_sz) * pageTableHunkSize;
@@ -5402,49 +5448,55 @@ copy(Db *db, Objects objs)
   int id, n = db->root_info->indeciesUsed;
   for( id=usrIdx; id<n; ++id ) {
     IndexBase *ib = db->indecies[id];
-    if( ib && ib->st->type != idxNil ) {
-      int ret = 0;
-      switch( ib->st->type ) {
-      // copy binary index
-      case idxBin: {
-        IndexBinary *bidx = (IndexBinary *)ib;
+    if( !ib ) continue;
+    int ret = 0;
+    switch( ib->st->type ) {
+    // copy binary index
+    case idxBin: {
+      IndexBinary *bidx = (IndexBinary *)ib;
+      int idx = get_index(&bidx->st->name[0]);
+      if( idx < 0 ) {
         int kySz = bidx->st->keySz, dtSz = bidx->st->dataSz;
-        int idx = get_index(&bidx->st->name[0]);
-        if( idx < 0 )
-          idx = new_binary_index(&bidx->st->name[0], kySz, dtSz, bidx->compare);
+        idx = new_binary_index(&bidx->st->name[0], kySz, dtSz, bidx->compare);
         if_err( idx );
-        // ignore empty indecies
-        if( bidx->st->rootPageId >= 0 ) {
-          // entity id indecies are processed below
-          if( db->entityNmIndex->Find(&ib->st->name[0],0) != 0 ) {
-            IndexBinary *bip = (IndexBinary *)indecies[idx];
-            // use cmprLast since index is in-order. Avoids using
-            //   user defined class key cmprs and compare functions.
-            bip->compare = cmprLast;
-            ret = bidx->keyCopy(bidx->st->rootPageId, indecies[idx]);
-            bip->compare = cmprFns[bip->bst->cmprId];
-          }
-        }
-        break; }
-      // copy string index
-      case idxStr: {
-        IndexString *sidx = (IndexString *)ib;
+      }
+      IndexBase *bib = indecies[idx];
+      bib->st->key_type = ib->st->key_type;
+      // ignore empty indecies
+      if( bidx->st->rootPageId < 0 ) break;
+      // ignore allocator indecies
+      if( bidx->compare == Db::cmprFrSp ) break;
+      if( bidx->compare == Db::cmprAdSp ) break;
+      // entity id indecies are processed below
+      if( !db->entityNmIndex->Find(&ib->st->name[0],0) ) break;
+      IndexBinary *bip = (IndexBinary *)bib;
+      // use cmprLast since index is in-order. Avoids using
+      //   user defined class key cmprs and compare functions.
+      bip->compare = cmprLast;
+      bib->st->key_type = ktyBin;
+      ret = bidx->keyCopy(bidx->st->rootPageId, bib);
+      bip->compare = cmprFns[bip->bst->cmprId];
+      bib->st->key_type = ib->st->key_type;
+      break; }
+    // copy string index
+    case idxStr: {
+      IndexString *sidx = (IndexString *)ib;
+      int idx = get_index(&sidx->st->name[0]);
+      if( idx < 0 ) {
         int dtSz = sidx->st->dataSz;
-        int idx = get_index(&sidx->st->name[0]);
-        if( idx < 0 )
-          idx = new_string_index(&sidx->st->name[0], dtSz);
+        idx = new_string_index(&sidx->st->name[0], dtSz);
         if_err( idx );
-        // copy key/data
-        if( sidx->st->rootPageId >= 0 )
-          ret = sidx->keyCopy(sidx->st->rootPageId, indecies[idx]);
-        break; }
       }
-      if_err( ret );
-      if_err( db->flush() );
-      if_err( commit(-1) );
+      IndexBase *bib = indecies[idx];
+      bib->st->key_type = ib->st->key_type;
+      if( sidx->st->rootPageId < 0 ) break;
+      // copy key/data
+      ret = sidx->keyCopy(sidx->st->rootPageId, bib);
+      break; }
     }
-    else
-      indecies[id] = 0;
+    if_err( ret );
+    if_err( db->flush() );
+    if_err( commit(-1) );
   }
   // copy entity indecies/data
   IndexBinary *eidx = (IndexBinary *)db->entityIdIndex;
@@ -5480,6 +5532,19 @@ copy(Db *db, Objects objs)
         EntityObj(*(EntityObj*)dent.addr(),eid);
       if_err( entityIdIndex->Insert(&eid,&nent.obj) );
       if_err( entityNmIndex->Insert(&name[0],&eid) );
+      // connect entity allocator
+      char idxNm[nmSz];  memset(idxNm,0,sizeof(idxNm));
+      strncpy(idxNm,name,sizeof(idxNm)-1);
+      strncat(idxNm,".free",sizeof(idxNm)-1);
+      int fidx = get_index(idxNm);
+      if( fidx < 0 ) Err(errCorrupt);
+      memset(idxNm,0,sizeof(idxNm));
+      strncpy(idxNm,name,sizeof(idxNm)-1);
+      strncat(idxNm,".addr",sizeof(idxNm)-1);
+      int aidx = get_index(idxNm);
+      if( aidx < 0 ) Err(errCorrupt);
+      nent->alloc_cache.freeIdx = fidx;
+      nent->alloc_cache.addrIdx = aidx;
     }
     else if( nid == eid )
       if_err( entityIdIndex->Find(&eid,&nent.obj) );
@@ -5593,7 +5658,7 @@ Db::CmprFn Db::cmprFns[] = {
   0,        cmprFrSt,
   cmprAdSt, cmprFrSp,
   cmprAdSp, cmprOIds,
-  cmprStr,  cmprKey,
+  cmprKey,  cmprStr,
   cmprLast,
 };
 
@@ -5606,15 +5671,33 @@ findCmprFn(CmprFn fn)
   return 0;
 }
 
+int Db::AllocCache::
+init_idx(Db *db,const char *nm)
+{
+  char idxNm[nmSz];
+  memset(idxNm,0,sizeof(idxNm));
+  snprintf(idxNm,sizeof(idxNm),"%s.free",nm);
+  int fidx = db->new_binary_index(idxNm, sizeof(freeSpaceRecord), 0, cmprFrSp);
+  if_ret( fidx );
+  memset(idxNm,0,sizeof(idxNm));
+  snprintf(idxNm,sizeof(idxNm),"%s.addr",nm);
+  int aidx = db->new_binary_index(idxNm, sizeof(addrSpaceRecord), 0, cmprAdSp);
+  if( aidx < 0 ) db->del_index(fidx);
+  if_ret( aidx );
+  freeIdx = fidx;  addrIdx = aidx;
+  loc.id = NIL;    loc.offset = 0;
+  avail = 0;
+  return 0;
+}
+
 int Db::
 init_idx()
 {
-  if_err( new_binary_index("freeStoreIndex", sizeof(freeStoreRecord), 0, cmprFrSt) );
-  if_err( new_binary_index("addrStoreIndex", sizeof(addrStoreRecord), 0, cmprAdSt) );
-  if_err( new_binary_index("freeSpaceIndex", sizeof(freeSpaceRecord), 0, cmprFrSp) );
-  if_err( new_binary_index("addrSpaceIndex", sizeof(addrSpaceRecord), 0, cmprAdSp) );
   if_err( new_binary_index("entityIdIndex", sizeof(int), sizeof(pgRef), cmprOIds) );
   if_err( new_binary_index("entityNmIndex", sizeof(char[nmSz]), sizeof(int), cmprStr) );
+  if_err( new_binary_index("freeStoreIndex", sizeof(freeStoreRecord), 0, cmprFrSt) );
+  if_err( new_binary_index("addrStoreIndex", sizeof(addrStoreRecord), 0, cmprAdSt) );
+  if_err( alloc_cache.init_idx(this,"") );
   return 0;
 }
 
@@ -5841,7 +5924,7 @@ new_entity_(Entity &entity, const char *nm, int sz)
   char name[nmSz];  memset(&name[0],0,sizeof(name));
   strncpy(name,nm,sizeof(name)-1);
   memmove(&ent->name[0],name,sizeof(name));
-  ent->alloc_cache.init();
+  if_err( ent->alloc_cache.init_idx(this,name) );
   ent->maxId = 0;
   ent->recdSz = sz;
   ent->count = 0;
@@ -5873,6 +5956,7 @@ del_entity(Entity &entity)
     } while( !(status=loc.NextId()) );
     if( status != errNotFound )
       if_err( status );
+    cacheDelete(ent->alloc_cache);
     for( int i=ent->nidxs; --i>=0; ) entity.del_index_(i);
     int id = ent->id;
     entityIdIndex->Delete(&id);
@@ -5935,7 +6019,7 @@ get_index(const char *nm, CmprFn cmpr)
 }
 
 int Db::Entity::
-add_index(int idx)
+add_index(int idx, int kty)
 {
   EntityLoc nent(this);
   // construct EntityObj
@@ -5957,6 +6041,8 @@ add_index(int idx)
   nent->nidxs = nidx+1;
   if_err( db->deallocate(ent.obj, db->alloc_cache) );
   ent.obj = nent.obj;
+  IndexBase *ib = db->indecies[idx];
+  ib->st->key_type = kty;
   return 0;
 }
 
@@ -6031,42 +6117,42 @@ size(varObj &vobj, int sz)
   return 0;
 }
 
-// get last index id on member accessed with ip
+
 int Db::ObjectLoc::
-last(const char *nm,int (ObjectLoc::*ip)())
+last(Index idx, ObjectLoc &last_loc)
 {
-  int idx;  if_ret( idx = entity->get_index(nm) );
-  return last(idx, ip);
+  int id = -1;
+  if_ret( idx->Last(0,&id) );
+  if_err( last_loc.FindId(id) );
+  return 0;
 }
 
+// get last index id on member accessed with ip
 int Db::ObjectLoc::
-last(int idx,int (ObjectLoc::*ip)())
+last(const char *nm,int (ObjectLoc::*ip)())
 {
+  Index idx = entity->index(nm);
+  if( !idx ) Err(errInvalid);
   ObjectLoc last_loc(*this);
-  int id, ret = entity->index(idx)->Last(0,&id);
-  if( ret < 0 ) return ret == errNotFound ? 0 : ret;
-  if_ret( entity->index(idxId)->Find((void*)&id, &last_loc.obj) );
+  int ret = last(idx, last_loc);
+  if( ret == errNotFound ) return 0;
+  if_err( ret );
   return (last_loc.*ip)();
 }
 
-// get last index unsigned id on member accessed with ip
 unsigned int Db::ObjectLoc::
 last(const char *nm,unsigned int (ObjectLoc::*ip)())
 {
-  int idx;  if_ret( idx = entity->get_index(nm) );
-  return last(idx, ip);
-}
-
-unsigned int Db::ObjectLoc::
-last(int idx,unsigned int (ObjectLoc::*ip)())
-{
+  Index idx = entity->index(nm);
+  if( !idx ) Err(errInvalid);
   ObjectLoc last_loc(*this);
-  int id, ret = entity->index(idx)->Last(0,&id);
-  if( ret < 0 ) return ret == errNotFound ? 0 : ret;
-  if_ret( entity->index(idxId)->Find((void*)&id, &last_loc.obj) );
+  int ret = last(idx, last_loc);
+  if( ret == errNotFound ) return 0;
+  if_err( ret );
   return (last_loc.*ip)();
 }
 
+
 #define cmpr_type(nm,ty) int Db::ObjectLoc:: \
 nm(const ty *ap, int asz, const ty *bp, int bsz) { \
   int n = asz < bsz ? asz : bsz; \
@@ -6099,77 +6185,21 @@ cmpr_media(const unsigned char *ap, int asz, const unsigned char *bp, int bsz)
 }
 #endif
 
-int Db::iKey::
-Find()
-{
-  if( !idx ) Err(errInvalid);
-  int id;  if_fail( idx->Find(*this, &id) );
-  if_err( loc.entity->index(idxId)->Find(&id, &loc.obj) );
-  return 0;
-}
-
-int Db::iKey::
-Locate(int op)
-{
-  if( !idx ) Err(errInvalid);
-  int id;  if_fail( idx->Locate(op, *this,0, 0,&id) );
-  if_err( loc.entity->index(idxId)->Find(&id, &loc.obj) );
-  return 0;
-}
-
-int Db::rKey::
-First()
-{
-  if( !idx ) Err(errInvalid);
-  int id;  if_fail( idx->First(0,&id) );
-  if_err( loc.entity->index(idxId)->Find(&id, &loc.obj) );
-  return 0;
-}
-
-int Db::rKey::
-Last()
-{
-  if( !idx ) Err(errInvalid);
-  int id;  if_fail( idx->Last(0,&id) );
-  if_err( loc.entity->index(idxId)->Find(&id, &loc.obj) );
-  return 0;
-}
-
-int Db::rKey::
-Next()
-{
-  if( !idx ) Err(errInvalid);
-  int id;  if_fail( idx->Next(this,&id) );
-  if_err( loc.entity->index(idxId)->Find(&id, &loc.obj) );
-  return 0;
-}
-
-int Db::rKey::
-First(pgRef &pos)
-{
-  if( !idx ) Err(errInvalid);
-  int id;  if_fail( idx->First(pos,0,&id) );
-  if_err( loc.entity->index(idxId)->Find(&id, &loc.obj) );
-  return 0;
-}
-
-int Db::rKey::
-Next(pgRef &pos)
-{
-  if( !idx ) Err(errInvalid);
-  int id;  if_fail( idx->Next(pos,this,&id) );
-  if_err( loc.entity->index(idxId)->Find(&id, &loc.obj) );
-  return 0;
+#define KeyFn(fn) { \
+  int id = -1; \
+  if_fail( idx->fn ); \
+  if_err( loc.FindId(id) ); \
+  return 0; \
 }
 
-int Db::rKey::
-Locate(int op)
-{
-  if( !idx ) Err(errInvalid);
-  int id;  if_fail( idx->Locate(op, *this,0, 0,&id) );
-  if_err( loc.entity->index(idxId)->Find(&id, &loc.obj) );
-  return 0;
-}
+int Db::iKey::Find() KeyFn(Find(*this, &id))
+int Db::iKey::Locate(int op) KeyFn(Locate(op, *this,0, 0,&id))
+int Db::rKey::First() KeyFn(First(0,&id))
+int Db::rKey::Last() KeyFn(Last(0,&id))
+int Db::rKey::Next() KeyFn(Next(this,&id))
+int Db::rKey::First(pgRef &pos) KeyFn(First(pos,0,&id))
+int Db::rKey::Next(pgRef &pos) KeyFn(Next(pos,this,&id))
+int Db::rKey::Locate(int op) KeyFn(Locate(op, *this,0, 0,&id))
 
 int Db::ioCmpr(const void *a, const void *b, void *c)
 {
@@ -6186,9 +6216,22 @@ int Db::load()
   pageId *pages = new pageId[npages];
   for( int i=0 ; i<npages; ++i ) pages[i] = i;
   qsort_r(pages, npages, sizeof(*pages), ioCmpr, this);
-  for( int i=0 ; i<npages; ++i )
-    pageLoad(pages[i], *get_page(pages[i]));
+  for( int i=0 ; i<npages; ++i ) {
+    pgRef loc;  char *op = 0;
+    loc.id = pages[i];  loc.offset = 0;
+    if_err( addrRead(loc, op) );
+  }
   delete [] pages;
   return 0;
 }
 
+int Db::load_indecies()
+{
+  for( int i=0 ; i<indecies_sz; ++i ) {
+    Index idx = indecies[i];
+    if( !idx || idx->st->rootPageId < 0 ) continue;
+    if_err( idx->keyMap(idx->st->rootPageId, &Db::IndexBase::blockLoad) );
+  }
+  return 0;
+}
+
index 2b791833cdb60f8f681fc5284c9770dcc5e67226..d71fc03ee8b975d93df7c2f0d9ced038d9856eff 100644 (file)
@@ -6,12 +6,12 @@
 #include <limits.h>
 #include <sys/types.h>
 
-#define freeStoreIndex indecies[freeStoreIdx]
-#define addrStoreIndex indecies[addrStoreIdx]
-#define freeSpaceIndex indecies[freeSpaceIdx]
-#define addrSpaceIndex indecies[addrSpaceIdx]
 #define entityIdIndex indecies[entityIdIdx]
 #define entityNmIndex indecies[entityNmIdx]
+#define freeStoreIndex indecies[freeStoreIdx]
+#define addrStoreIndex indecies[addrStoreIdx]
+#define freeSpaceIndex indecies[cache.freeIdx]
+#define addrSpaceIndex indecies[cache.addrIdx]
 
 #define noThrow std::nothrow
 #ifndef likely
@@ -430,15 +430,17 @@ private:
     root_info_offset=4,
     root_info_extra_pages = 2,
     idxNil=0, idxBin=1, idxStr=2,
+    ktyBin=0, ktyInd=1, ktyDir=2,
     opDelete=-1, opFind=0, opInsert=1,
     pg_unknown=0, pg_root_info=1, pg_free=2,
     pg_entity=0x0100, pg_index=0x1000,
     max_entity_type = pg_index-pg_entity-1,
     max_index_type = 0x10000-pg_index-1,
     min_heap_allocation = 32,
-    freeStoreIdx = 0, addrStoreIdx = 1,
-    freeSpaceIdx = 2, addrSpaceIdx = 3,
-    entityIdIdx = 4, entityNmIdx = 5, usrIdx = 6,
+    entityIdIdx = 0, entityNmIdx = 1,
+    freeStoreIdx = 2, addrStoreIdx = 3,
+    freeSpaceIdx = 4, addrSpaceIdx = 5,
+    usrIdx = 6,
     fl_wr=1, fl_rd=2, fl_new=4, fl_free=8,
     defaultNoShm = 1,
     defaultStoreBlockSize = 8192,
@@ -556,7 +558,8 @@ private:
   class IndexTypeInfo {
   public:
     int magic;
-    int type;                      /* type of index */
+    short type;                    /* type of index */
+    short key_type;
     char name[nmSz];               /* index string identifier */
   };
 
@@ -620,7 +623,9 @@ private:
     }
     int blockFree(pageId pid);
     int blockRelease(pageId pid);
+    int blockLoad(pageId pid);
     int deleteFreeBlocks();
+    void chkLastReset();
     void chkLastInsert();
     void chkLastDelete();
     void chkLastFind(pgRef &last);
@@ -715,7 +720,13 @@ private:
     int Next(void *rtnKey,void *rtnData) {
       return IndexBase::Next(rtnKey,rtnData);
     }
-
+    void wr_key(void *kp, char *bp, int sz) {
+      switch( st->key_type ) {
+      case ktyBin: memcpy(bp,kp,sz); break;
+      case ktyDir:
+      case ktyInd: ((Key *)kp)->wr_key(bp); break;
+      }
+    }
     char *ikey() { return iky; }
     char *tkey() { return tky; }
   public:
@@ -846,6 +857,7 @@ private:
   class AllocCache {
     pgRef loc;
     int avail;
+    friend class Db;
   public:
     int cacheFlush(Db *db);
     int Get(Db *db,int &size, pgRef &ref);
@@ -857,10 +869,12 @@ private:
     void dmp() {
       printf("loc: %d/%d  avl: %d\n", loc.id,loc.offset,avail);
     }
+    int freeIdx, addrIdx;
+    int init_idx(Db *db, const char *nm);
   } alloc_cache;
-  int cacheFlush() {
-    return alloc_cache.cacheFlush(this);
-  }
+
+  int cacheFlush() { return alloc_cache.cacheFlush(this); }
+  void cacheDelete(AllocCache &cache);
   int cache_all_flush();
 
   class PageStorage {
@@ -1162,9 +1176,8 @@ public:
     int _fail_(int v) { return entity->db->_fail_(v); }
 #endif
 
-    int last(int idx,int (ObjectLoc::*ip)());
+    int last(Index idx,ObjectLoc &last_loc);
     int last(const char *nm,int (ObjectLoc::*ip)());
-    unsigned int last(int idx,unsigned int (ObjectLoc::*ip)());
     unsigned int last(const char *nm,unsigned int (ObjectLoc::*ip)());
   };
 
@@ -1173,6 +1186,7 @@ public:
     ObjectLoc &loc;
     Index idx;
     CmprFn cmpr;
+    virtual int wr_key(char *cp) = 0;
     Key(Index i, ObjectLoc &l, CmprFn c) : loc(l), idx(i), cmpr(c) {}
     Key(const char *nm, ObjectLoc &l, CmprFn c) : loc(l), cmpr(c) {
       idx = loc.entity->index(nm);
@@ -1187,19 +1201,11 @@ public:
 #endif
   };
 
-  class iKey : public Key {
-  public:
-    iKey(Index i, ObjectLoc &l, CmprFn c) : Key(i,l,c) {}
-    iKey(const char *nm, ObjectLoc &l, CmprFn c) : Key(nm,l,c) {}
-    int NextLoc(pgRef &pos) { return idx->NextLoc(pos); }
-    int Find();
-    int Locate(int op=keyGE);
-  };
-
   class rKey : public Key {
   public:
     rKey(Index i, ObjectLoc &l, CmprFn c) : Key(i,l,c) {}
     rKey(const char *nm, ObjectLoc &l, CmprFn c) : Key(nm,l,c) {}
+    virtual int wr_key(char *cp=0) { return -1; }
     int NextLoc(pgRef &pos) { return idx->NextLoc(pos); }
     int First();  int First(pgRef &pos);
     int Next();   int Next(pgRef &pos);
@@ -1207,6 +1213,15 @@ public:
     int Locate(int op=keyGE);
   };
 
+  class iKey : protected rKey {
+  public:
+    iKey(Index i, ObjectLoc &l, CmprFn c) : rKey(i,l,c) {}
+    iKey(const char *nm, ObjectLoc &l, CmprFn c) : rKey(nm,l,c) {}
+    int NextLoc(pgRef &pos) { return idx->NextLoc(pos); }
+    int Find();
+    int Locate(int op=keyGE);
+  };
+
 private:
   class EntityObj : public Obj { /* entity storage */
   public:
@@ -1269,7 +1284,6 @@ public:
     int deallocate(pgRef &obj) { return db->deallocate(obj,ent->alloc_cache); }
     int deallocate(ObjectLoc &loc) { return deallocate(loc.obj); }
     int get_index(const char *nm, CmprFn cmpr=0);
-    int key_index(const char *nm) { return get_index(nm,Db::cmprKey); }
     Index index(int i) { return db->indecies[ent->indexs[i]]; }
     Index index(const char *nm) {
       int idx = get_index(nm);
@@ -1277,17 +1291,26 @@ public:
     }
     int MaxId() { return ent->maxId; }
     int Count() { return ent->count; }
-    int add_index(int idx);
+    int add_index(int idx, int kty=ktyBin);
     int add_bindex(const char *nm,int keySz,int dataSz) {
       int idx = db->new_binary_index(nm,keySz,dataSz);
-      if_err( idx );  if_err( add_index(idx) );
-      return 0;
+      if_err( idx );  if_err( add_index(idx,ktyBin) );
+      return idx;
     }
-    int add_kindex(const char *nm) { return add_bindex(nm,0,sizeof(int)); }
-    int add_sindex(const char *nm,int dataSz) {
-      int idx = db->new_string_index(nm,dataSz);
-      if_err( idx );  if_err( add_index(idx) );
-      return 0;
+    int add_ind_index(const char *nm) {
+      int idx = db->new_binary_index(nm,0,sizeof(int),Db::cmprKey);
+      if_err( idx );  if_err( add_index(idx,ktyInd) );
+      return idx;
+    }
+    int add_dir_index(const char *nm,int keySz) {
+      int idx = db->new_binary_index(nm,keySz,sizeof(int),Db::cmprKey);
+      if_err( idx );  if_err( add_index(idx,ktyDir) );
+      return idx;
+    }
+    int add_str_index(const char *nm,int dataSz) {
+      int idx = db->new_string_index(nm, dataSz);
+      if_err( idx );  if_err( add_index(idx,ktyDir) );
+      return idx;
     }
     int del_index_(int idx);
     int del_index(int idx);
@@ -1356,10 +1379,10 @@ private:
     return addrWrite_(loc, vp, sizeof(allocPrefix));
   }
 
-  int objectHeapInsert(int sz,int pg,int off);
-  int objectHeapDelete(int sz,int pg,int off);
+  int objectHeapInsert(int sz,int pg,int off,AllocCache &cache);
+  int objectHeapDelete(int sz,int pg,int off,AllocCache &cache);
   int objectAllocate(int typ, int &size, pgRef &loc,AllocCache &cache);
-  int objectFree(pgRef &loc);
+  int objectFree(pgRef &loc,AllocCache &cache);
   int pgRefGet(int &size, pgRef &loc,AllocCache &cache);
   int pgRefNew(int &size, pgRef &lo,AllocCache &cache);
   int pgRefAllocate(int &size, pgRef &lo,AllocCache &cache);
@@ -1471,6 +1494,7 @@ public:
   void error(int v);
   void Error(int v,const char *msg);
   int load();
+  int load_indecies();
 
   Db();
   ~Db();
@@ -1481,9 +1505,10 @@ public:
   void pdmp();
   void fdmp();
   void admp(); void achk(); void fchk();
-  void edmp();
-  void bdmp();
-  void stats(int chk=1);
+  void edmp(AllocCache &cache);
+  void bdmp(AllocCache &cache);
+  void cdmp();
+  void stats();
 #endif
 
 };
index 3ded9944876f55d4bcd1c802cee56ec2688ba82f..0e5a8f1abef4ec73b180813ff30eb08bda73353e 100644 (file)
@@ -32,11 +32,12 @@ TARGETS:=clip_accesses \
        root_info \
        dmp \
        cpdb \
-       add_path_pos \
        path_ls \
-       dbcvt \
        xtv
 
+#      add_path_pos \
+#      dbcvt \
+
 all:   $(TARGETS)
 
 dbtv:  dbtv.C
index f05ef0aa26f4eb2c8ff3f8dc1a78e6e502d87f11..0cfee412fb557e145181e2d0b23674a848a16a74 100644 (file)
@@ -14,7 +14,7 @@ public:
   FILE *fp;  long pos;
   char line[MAX_LINE_SZ];
   int no;
-  iline(FILE *f) : fp(f), pos(0), no(0) {}
+  iline(FILE *f) : fp(f), pos(0), no(0) { line[0] = 0; }
   iline(iline &i) {
     fp = i.fp;  pos = i.pos;
     strcpy(line,i.line);  no = i.no;
@@ -74,9 +74,14 @@ public:
       (1<<ty_media),
     text_types = (1<<ty_text) |
       (1<<ty_tinytext) | (1<<ty_mediumtext) | (1<<ty_longtext),
+    integer_types = (1<<ty_boolean) | (1<<ty_bit) | (1<<ty_binary) |
+      (1<<ty_tinyint) | (1<<ty_smallint) | (1<<ty_decimal) |
+      (1<<ty_mediumint) | (1<<ty_integer) | (1<<ty_bigint),
+    double_types = (1<<ty_real) | (1<<ty_double) | (1<<ty_float),
   };
   int is_var() { return (var_types>>ty) & 1; }
-  int is_text() { return (text_types>>ty) & 1; }
+  int is_integer() { return (integer_types>>ty) & 1; }
+  int is_double() { return (double_types>>ty) & 1; }
   int length, zeroed, is_null, is_autoincr, is_binary, is_unsign, has_def;
   iobj *idx;
   eobjs eop;
@@ -95,40 +100,44 @@ class tobj {
 public:
   string *name;
   dobjs dop;
+  dobj *dobj_of(const char *knm);
 
-  tobj() : name(0), dop(0) {}
+  tobj() : name(0) {}
   ~tobj() {};
 };
 
 list<tobj*> tables;
 
+tobj *tobj_of(const char *tnm)
+{
+  list<tobj*>::iterator it = tables.begin();
+  list<tobj*>::iterator eit = tables.end();
+  while( it!=eit && *(*it)->name!=tnm ) ++it;
+  return it == eit ? 0 : *it;
+}
 
-class kobj {
-public:
-  string *name;
-
-  kobj(string *s) : name(s) {}
-  ~kobj() {};
-};
-
-typedef list<kobj> kobjs;
+dobj *tobj::dobj_of(const char *knm)
+{
+    dobjs::iterator eid = dop.end();
+    dobjs::iterator id = dop.begin();
+    while( id!=eid && *(*id)->name!=knm ) ++id;
+    return id == eid ? 0 : *id;
+}
 
 class iobj {
 public:
   string *name;
-  string *tbl;
-  list<string *> keys;
-  short unique;
-  short primary;
-  int length;
-
-  iobj() : name(0), tbl(0), unique(0), primary(0), length(-1) {}
+  tobj *tbl;
+  dobjs keys;
+  short unique, primary;
+  int is_dir;
+  int is_direct();
+  iobj() : name(0), tbl(0), unique(0), primary(0), is_dir(-1) {}
   ~iobj() {};
 };
 
 list<iobj*> indecies;
 
-
 class robj {
 public:
   string *name;
@@ -561,10 +570,10 @@ int xtype(ichar &cp, dobj *dp)
       dp->idx = idx;
       idx->name = new string(*dp->name);
       idx->name->push_back('_');
-      idx->tbl = new string(*dp->top->name);
+      idx->tbl = dp->top;
       idx->unique = unique;
       idx->primary = primary;
-      idx->keys.push_back(dp->name);
+      idx->keys.push_back(dp);
       indecies.push_back(idx);
       return 0;
     }
@@ -618,7 +627,11 @@ int table(ichar &cp, tobj *top)
   int ch = *tws(cp);  expect('(');
   for(;;) {
     dobj *dp = new dobj(top);
-    if( member(cp,dp) < 0 ) return -1;
+    if( member(cp,dp) < 0 ) {
+      printf("  err in %s/%s at %d\n",id->c_str(),dp->name->c_str(),cp.no);
+      delete dp;
+      return -1;
+    }
     top->dop.push_back(dp);
     if( (ch=*tws(cp)) == ')' ) break;
     expect(',');
@@ -634,6 +647,22 @@ int table(ichar &cp, tobj *top)
   return 0;
 }
 
+int iobj::is_direct()
+{
+  if( is_dir < 0 ) {
+    is_dir = 1;
+    dobjs::iterator ekey = keys.end();
+    dobjs::iterator key = keys.begin();
+    for( int i=0; key!=ekey; ++i ) {
+      dobj *dp = *key++;
+      if( dp->is_integer() ) continue;
+      if( dp->is_double() ) continue;
+      is_dir = 0; break;
+    }
+  }
+  return is_dir;
+}
+
 // scan (number)
 int keylen(ichar &cp, iobj *ip)
 {
@@ -645,7 +674,6 @@ int keylen(ichar &cp, iobj *ip)
       n = n*10 + ch;  ch = *++cp;
     }
     ch = *tws(cp);  expect(')');
-    ip->length = n;
   }
   return 0;
 }
@@ -659,14 +687,29 @@ int index(ichar &cp, iobj *iop)
   if( !(id=tid(cp)) ) return -1;
   if( *id != "On" ) return -1;
   if( !(id=tid(cp)) ) return -1;
-  iop->tbl = id;
+  tobj *tp = tobj_of(id->c_str());
+  if( !tp ) {
+    printf("index err On:%s at %d\n",id->c_str(),cp.no);
+    return -1;
+  }
+  iop->tbl = tp;
   int ch = *tws(cp);  expect('(');
   if( !(id=tid(cp)) ) return -1;
-  iop->keys.push_back(id);
+  dobj *dp = tp->dobj_of(id->c_str());
+  if( !dp ) {
+    printf("index err Key:%s/%s at %d\n",tp->name->c_str(),id->c_str(),cp.no);
+    return -1;
+  }
+  iop->keys.push_back(dp);
   if( keylen(cp,iop) < 0 ) return -1;
   while( *tws(cp) == ',' ) {
     if( !(id=tid(++cp)) ) return -1;
-    iop->keys.push_back(id);
+    dp = tp->dobj_of(id->c_str());
+    if( !dp ) {
+      printf("index err Key:%s/%s at %d\n",tp->name->c_str(),id->c_str(),cp.no);
+      return -1;
+    }
+    iop->keys.push_back(dp);
     if( keylen(cp,iop) < 0 ) return -1;
   }
   ch = *tws(cp);  expect(')');
@@ -716,6 +759,7 @@ int create(ichar &cp)
     iobj *iop = new iobj();
     if( index(cp, iop) < 0 ) {
       delete iop;
+      printf("== FAILED!\n");
       return -1;
     }
     if( modifier == unique ) iop->unique = 1;
@@ -726,48 +770,12 @@ int create(ichar &cp)
   return -1;
 }
 
-#if 0
-void put_args(FILE *sp, tobj *tp, iobj *ip)
-{
-  list<string*>::iterator ekey=ip->keys.end();
-  list<string*>::iterator key=ip->keys.begin();
-  if( key == ekey ) return;
-
-  for(;;) {
-    const char *knm = (*key)->c_str();
-
-    list<dobj*>::iterator eid = tp->dop.end();
-    list<dobj*>::iterator id = tp->dop.begin();
-    while( id!=eid && *(*id)->name!=knm ) ++id;
-    if( id == eid ) {
-      fprintf(stderr,"  error: cant find index key %s in %s\n",knm,tp->name->c_str());
-      continue;
-    }
-
-    dobj *dp = *id;
-    const char *nm = dp->name->c_str();
-    fprintf(sp,"%s::t_%s &%s",tp->name->c_str(),nm,nm);
-    if( ++key == ekey ) break;
-    fprintf(sp, ", ");
-  }
-}
-#endif
-
-#if 0
-void varg_dobj(FILE *sp, dobj *dp, const char *ty, int is_unsign=-1)
-{
-  if( is_unsign < 0 ) is_unsign = dp->is_unsign;
-  if( is_unsign > 0 ) fprintf(sp, "unsigned ");
-  fprintf(sp,"%s *%s", ty, dp->name->c_str());
-}
-#else
 void varg_dobj(FILE *sp, dobj *dp, const char *ty, int is_unsign=-1)
 {
   const char *tnm = dp->top->name->c_str();
   const char *nm = dp->name->c_str();
   fprintf(sp,"const %sObj::t_%s &%s", tnm, nm, nm);
 }
-#endif
 
 void arg_dobj(FILE *sp, dobj *dp, const char *ty, int is_unsign=-1)
 {
@@ -820,32 +828,24 @@ void arg_dobj(FILE *sp, dobj *dp)
 
 void put_targs(FILE *sp, tobj *tp, iobj *ip)
 {
-  list<string*>::iterator ekey=ip->keys.end();
-  list<string*>::iterator key=ip->keys.begin();
+  dobjs::iterator ekey=ip->keys.end();
+  dobjs::iterator key=ip->keys.begin();
 
-  for( ; key != ekey; ) {
-    const char *knm = (*key)->c_str();  ++key;
-    list<dobj*>::iterator eid = tp->dop.end();
-    list<dobj*>::iterator id = tp->dop.begin();
-    while( id!=eid && *(*id)->name!=knm ) ++id;
-    if( id == eid ) {
-      fprintf(stderr,"  error: cant find index key %s in %s\n",knm,tp->name->c_str());
-      continue;
-    }
-    dobj *dp = *id;
-    if( dp->ty == dobj::ty_none ) {
+  while( key != ekey ) {
+    dobj *dp = *key++;
+    if( !dp || dp->ty == dobj::ty_none ) {
       fprintf(stderr," %s member %s error: ty_none\n",
         tp->name->c_str(),dp->name->c_str());
       continue;
     }
     fprintf(sp,"        ");
     arg_dobj(sp, dp);
-    if( key == ekey ) continue;
+    if( key == ekey ) break;
     fprintf(sp,",\n");
   }
 }
 
-void typ_dobj(FILE *sp, dobj *dp)
+const char *typ_dobj(dobj *dp)
 {
   const char *cp;
   switch( dp->ty ) {
@@ -882,27 +882,31 @@ void typ_dobj(FILE *sp, dobj *dp)
   case dobj::ty_media:     cp = "unsigned char"; break;
   default:                 cp = "unimplemented"; break;
   }
-  fprintf(sp,"%s",cp);
+  return cp;
 }
 
-void put_keys(FILE *sp, tobj *tp, iobj *ip)
+void put_keysz(FILE *sp, tobj *tp, iobj *ip)
 {
-  list<string*>::iterator ekey=ip->keys.end();
-  list<string*>::iterator key=ip->keys.begin();
+  dobjs::iterator ekey=ip->keys.end();
+  dobjs::iterator key=ip->keys.begin();
   const char *tnm = tp->name->c_str();
 
-  for( ; key != ekey; ++key ) {
-    const char *knm = (*key)->c_str();
+  while( key != ekey ) {
+    dobj *dp = *key++;
+    const char *nm = dp->name->c_str();
+    fprintf(sp," +sizeof(%sObj::t_%s)", tnm, nm);
+  }
+  if( ip->unique <= 0 ) fprintf(sp,"+sizeof(int)");
+}
 
-    list<dobj*>::iterator eid = tp->dop.end();
-    list<dobj*>::iterator id = tp->dop.begin();
-    while( id!=eid && *(*id)->name!=knm ) ++id;
-    if( id == eid ) {
-      fprintf(stderr,"  error: cant find index key %s in %s\n", knm, tnm);
-      continue;
-    }
+void put_keys(FILE *sp, tobj *tp, iobj *ip)
+{
+  dobjs::iterator ekey = ip->keys.end();
+  dobjs::iterator key = ip->keys.begin();
+  const char *tnm = tp->name->c_str();
 
-    dobj *dp = *id;
+  while( key != ekey ) {
+    dobj *dp = *key++;
     const char *nm = dp->name->c_str();
     fprintf(sp,"    %sObj::t_%s v_%s;\n", tnm, nm, nm);
   }
@@ -911,27 +915,17 @@ void put_keys(FILE *sp, tobj *tp, iobj *ip)
 
 void put_init(FILE *sp, tobj *tp, iobj *ip)
 {
-  list<string*>::iterator ekey=ip->keys.end();
-  list<string*>::iterator key;
+  dobjs::iterator ekey = ip->keys.end();
+  dobjs::iterator key = ip->keys.begin();
 
-  for( key=ip->keys.begin(); key!=ekey; ++key ) {
-    const char *knm = (*key)->c_str();
-
-    list<dobj*>::iterator eid = tp->dop.end();
-    list<dobj*>::iterator id = tp->dop.begin();
-    while( id!=eid && *(*id)->name!=knm ) ++id;
-    if( id == eid ) {
-      fprintf(stderr,"  error: cant find index key %s in %s\n",knm,tp->name->c_str());
-      continue;
-    }
-
-    dobj *dp = *id;
+  while( key != ekey ) {
+    dobj *dp = *key++;
     const char *nm = dp->name->c_str();
     fprintf(sp,",\n      v_%s(%s)", nm, nm);
   }
 }
 
-void put_cmpr(FILE *sp, dobj *dp)
+const char *put_cmpr(dobj *dp)
 {
   const char *cp;
   switch( dp->ty ) {
@@ -968,67 +962,123 @@ void put_cmpr(FILE *sp, dobj *dp)
   case dobj::ty_media:     cp = "media"; break;
   default:                 cp = "unimplemented"; break;
   }
-  fprintf(sp,"%s",cp);
+  return cp;
 }
 
-void put_rcmpr(FILE *sp, tobj *tp, iobj *ip)
+void put_rkey(FILE *sp, tobj *tp, iobj *ip)
 {
-  list<string*>::iterator ekey=ip->keys.end();
-  list<string*>::iterator skey=ip->keys.begin();
-  list<string*>::iterator key;
+  dobjs::iterator ekey=ip->keys.end();
+  dobjs::iterator key=ip->keys.begin();
 
-  for( key=skey; key!=ekey; ++key ) {
-    const char *knm = (*key)->c_str();
+  while( key != ekey ) {
+    dobj *dp = *key++;
+    const char *nm = dp->name->c_str();
+    fprintf(sp,"  if( bp ) memcpy(cp, kloc._%s(), kloc.size_%s());\n", nm, nm);
+    fprintf(sp,"  cp += kloc.size_%s();\n", nm);
+  }
+  if( ip->unique <= 0 ) {
+    fprintf(sp,"  if( bp ) memcpy(cp, kloc._id(), kloc._id_size());\n");
+    fprintf(sp,"  cp += kloc._id_size();\n");
+  }
+}
 
-    list<dobj*>::iterator eid = tp->dop.end();
-    list<dobj*>::iterator id = tp->dop.begin();
-    while( id!=eid && *(*id)->name!=knm ) ++id;
-    if( id == eid ) {
-      fprintf(stderr,"  error: cant find index key %s in %s\n",knm,tp->name->c_str());
-      continue;
-    }
+void dir_rcmpr(FILE *sp, tobj *tp, iobj *ip)
+{
+  dobjs::iterator ekey=ip->keys.end();
+  dobjs::iterator key=ip->keys.begin();
+
+  while( key != ekey ) {
+    dobj *dp = *key++;
+    fprintf(sp,"  { %s vv", typ_dobj(dp));
+    if( dp->length > 0 ) fprintf(sp, "[%d]", dp->length);
+    fprintf(sp,"; memcpy(&vv,b,sizeof(vv)); b += sizeof(vv);\n");
+    fprintf(sp,"    int v = cmpr_%s", put_cmpr(dp));
+    const char *nm = dp->name->c_str();
+    fprintf(sp,"( kloc._%s(), kloc->v_%s.size(), &vv", nm, nm);
+    if( dp->length > 0 ) fprintf(sp, "[0]");
+    fprintf(sp,", sizeof(vv));\n");
+    fprintf(sp,"    if( v != 0 ) return v; }\n");
+  }
+  if( ip->unique <= 0 ) {
+    fprintf(sp,"  int vid; memcpy(&vid,b,sizeof(vid)); b += sizeof(vid);\n");
+    fprintf(sp,"  int v = cmpr_int(kloc._id(), kloc._id_size(), &vid, sizeof(vid));\n");
+    fprintf(sp,"  if( v != 0 ) return v;\n");
+  }
+}
 
-    dobj *dp = *id;
+void ind_rcmpr(FILE *sp, tobj *tp, iobj *ip)
+{
+  fprintf(sp,"  int b_id; memcpy(&b_id,b,sizeof(b_id));\n");
+  fprintf(sp,"  if( kloc->id == b_id ) return 0;\n");
+  fprintf(sp,"  %sLoc vloc(kloc.entity);\n", tp->name->c_str());
+  fprintf(sp,"  if( vloc.FindId(b_id) )\n");
+  fprintf(sp,"    kloc.err_(Db::errCorrupt);\n");
+  dobjs::iterator ekey=ip->keys.end();
+  dobjs::iterator key=ip->keys.begin();
+
+  while( key != ekey ) {
+    dobj *dp = *key++;
     const char *nm = dp->name->c_str();
-    fprintf(sp,"  v = cmpr_");  put_cmpr(sp,dp);
+    fprintf(sp,"  { int v = cmpr_%s", put_cmpr(dp));
     fprintf(sp,"( kloc._%s(), kloc->v_%s.size(),\n", nm, nm);
     fprintf(sp,"                   vloc._%s(), vloc->v_%s.size());\n", nm, nm);
-    fprintf(sp,"  if( v != 0 ) return v;\n");
+    fprintf(sp,"    if( v != 0 ) return v; }\n");
   }
   if( ip->unique <= 0 ) {
-    fprintf(sp,"  v = cmpr_int(kloc._id(), kloc._id_size(),\n");
+    fprintf(sp,"  { int v = cmpr_int(kloc._id(), kloc._id_size(),\n");
     fprintf(sp,"               vloc._id(), vloc._id_size());\n");
-    fprintf(sp,"  if( v != 0 ) return v;\n");
+    fprintf(sp,"    if( v != 0 ) return v; }\n");
   }
 }
 
-void put_icmpr(FILE *sp, tobj *tp, iobj *ip)
+void dir_icmpr(FILE *sp, tobj *tp, iobj *ip)
 {
-  list<string*>::iterator ekey=ip->keys.end();
-  list<string*>::iterator skey=ip->keys.begin();
-  list<string*>::iterator key;
+  dobjs::iterator ekey=ip->keys.end();
+  dobjs::iterator key=ip->keys.begin();
+
+  while( key != ekey ) {
+    dobj *dp = *key++;
+    fprintf(sp,"  { %s vv", typ_dobj(dp));
+    if( dp->length > 0 ) fprintf(sp, "[%d]", dp->length);
+    fprintf(sp,"; memcpy(&vv,b,sizeof(vv)); b += sizeof(vv);\n");
+    fprintf(sp,"    int v = cmpr_%s", put_cmpr(dp));
+    const char *nm = dp->name->c_str();
+    fprintf(sp,"( kp->v_%s.addr(), kp->v_%s.size(), &vv", nm, nm);
+    if( dp->length > 0 ) fprintf(sp, "[0]");
+    fprintf(sp,", sizeof(vv));\n");
+    fprintf(sp,"    if( v != 0 ) return v; }\n");
+  }
+  if( ip->unique <= 0 ) {
+    fprintf(sp,"  if( kp->v_id >= 0 ) {\n");
+    fprintf(sp,"    int vid; memcpy(&vid,b,sizeof(vid)); b += sizeof(vid);\n");
+    fprintf(sp,"    int v = cmpr_int(&kp->v_id, sizeof(kp->v_id), &vid, sizeof(vid));\n");
+    fprintf(sp,"    if( v != 0 ) return v;\n");
+    fprintf(sp,"  }\n");
+  }
+}
 
-  for( key=skey; key!=ekey; ++key ) {
-    const char *knm = (*key)->c_str();
+void ind_icmpr(FILE *sp, tobj *tp, iobj *ip)
+{
+  fprintf(sp,"  int b_id;  memcpy(&b_id,b,sizeof(b_id)); b += sizeof(b_id);\n");
+  if( ip->unique <= 0 ) fprintf(sp,"  if( kp->v_id == b_id ) return 0;\n");
+  fprintf(sp,"  %sLoc vloc(kp->loc.entity);\n", tp->name->c_str());
+  fprintf(sp,"  if( vloc.FindId(b_id) )\n");
+  fprintf(sp,"    vloc.err_(Db::errCorrupt);\n");
 
-    list<dobj*>::iterator eid = tp->dop.end();
-    list<dobj*>::iterator id = tp->dop.begin();
-    while( id!=eid && *(*id)->name!=knm ) ++id;
-    if( id == eid ) {
-      fprintf(stderr,"  error: cant find index key %s in %s\n",knm,tp->name->c_str());
-      continue;
-    }
+  dobjs::iterator ekey=ip->keys.end();
+  dobjs::iterator key=ip->keys.begin();
 
-    dobj *dp = *id;
+  while( key != ekey ) {
+    dobj *dp = *key++;
     const char *nm = dp->name->c_str();
-    fprintf(sp,"  v = cmpr_");  put_cmpr(sp,dp);
+    fprintf(sp,"  { int v = cmpr_%s", put_cmpr(dp));
     fprintf(sp,"( kp->v_%s.addr(), kp->v_%s.size(),\n", nm, nm);
     fprintf(sp,"                  vloc._%s(), vloc->v_%s.size());\n", nm, nm);
-    fprintf(sp,"  if( v != 0 ) return v;\n");
+    fprintf(sp,"    if( v != 0 ) return v; }\n");
   }
   if( ip->unique <= 0 ) {
     fprintf(sp,"  if( kp->v_id >= 0 ) {\n");
-    fprintf(sp,"    v = cmpr_int(&kp->v_id, sizeof(kp->v_id),\n");
+    fprintf(sp,"    int v = cmpr_int(&kp->v_id, sizeof(kp->v_id),\n");
     fprintf(sp,"                 vloc._id(), vloc._id_size());\n");
     fprintf(sp,"    if( v != 0 ) return v;\n");
     fprintf(sp,"  }\n");
@@ -1143,6 +1193,15 @@ int main(int ac, char **av)
   list<tobj*>::iterator eit = tables.end();
   list<tobj*>::iterator it;
 
+  list<iobj*>::iterator sidx = indecies.begin();
+  list<iobj*>::iterator eidx = indecies.end();
+  list<iobj*>::iterator idx;
+
+  for( idx=sidx; idx!=eidx; ++idx ) {
+      iobj *ip = *idx;
+      ip->is_dir = ip->is_direct();
+  }
+
   int i=0;
   for( it=sit ; it!=eit; ++i, ++it ) {
     tobj *tp = *it;
@@ -1171,21 +1230,21 @@ int main(int ac, char **av)
     fprintf(sp,"};\n");
     fprintf(sp,"\n");
 
-    list<iobj*>::iterator sidx=indecies.begin();
-    list<iobj*>::iterator eidx=indecies.end();
-    list<iobj*>::iterator idx;
-
     int j = 0, n = 0;
     for( idx=sidx; idx!=eidx; ++idx ) {
-      if( *(*idx)->tbl != *(*it)->name ) continue;
+      iobj *ip = *idx;
+      if( ip->tbl != tp ) continue;
       ++n;
-      printf("   %2d.%d. %s on %s(",i,j++,
-        (*idx)->name->c_str(),(*idx)->tbl->c_str());
-      list<string*>::iterator skey=(*idx)->keys.begin();
-      list<string*>::iterator ekey=(*idx)->keys.end();
-      list<string*>::iterator key;
-      for( key=skey; key!=ekey; ++key )
-        printf(" %s", (*key)->c_str());
+      printf("   %2d.%d%c %s on %s(",i,j++,
+        ip->is_dir>0 ? '=' : '.',
+        ip->name->c_str(),tp->name->c_str());
+      dobjs::iterator ekey=ip->keys.end();
+      dobjs::iterator key=ip->keys.begin();
+
+      while( key != ekey ) {
+        dobj *dp = *key++;
+        printf(" %s", dp->name->c_str());
+      }
       printf(" )\n");
     }
     if( n > 0 ) printf("\n");
@@ -1203,25 +1262,32 @@ int main(int ac, char **av)
     }
 
     for( idx=sidx; idx!=eidx; ++idx ) {
-      if( *(*idx)->tbl != *(*it)->name ) continue;
-      const char *knm = (*idx)->name->c_str();
+      iobj *ip = *idx;
+      if( ip->tbl != tp ) continue;
+      const char *knm = ip->name->c_str();
+      fprintf(sp,"\n");
+      fprintf(sp,"  class key_%s { public:\n", knm);
+      fprintf(sp,"    static const int size() { return 0");
+      put_keysz(sp, *it, ip);
+      fprintf(sp,"; }\n");
+      fprintf(sp,"  };\n");
       fprintf(sp,"\n");
       fprintf(sp,"  class ikey_%s : public Db::iKey { public:\n", knm);
-      put_keys(sp, *it, *idx);
-      fprintf(sp,"    static int cmpr(char *a, char *b);\n");
+      put_keys(sp, *it, ip);
+      fprintf(sp,"    static int icmpr(char *a, char *b);\n");
       // key constructors
       fprintf(sp,"    ikey_%s(ObjectLoc &loc,\n", knm);
-      put_targs(sp, *it, *idx);
-      if( (*idx)->unique <= 0 ) fprintf(sp,", int id=-1");
-      fprintf(sp,")\n    : iKey(\"%s\",loc,cmpr)", knm);
-      put_init(sp, *it, *idx);
-      if( (*idx)->unique <= 0 ) fprintf(sp,",\n      v_id(id)");
+      put_targs(sp, *it, ip);
+      if( ip->unique <= 0 ) fprintf(sp,", int id=-1");
+      fprintf(sp,")\n    : iKey(\"%s\",loc,icmpr)", knm);
+      put_init(sp, *it, ip);
+      if( ip->unique <= 0 ) fprintf(sp,",\n      v_id(id)");
       fprintf(sp," {}\n");
       fprintf(sp,"  };\n");
       fprintf(sp,"  class rkey_%s : public Db::rKey { public:\n", knm);
-      fprintf(sp,"    static int cmpr(char *a, char *b);\n");
-      fprintf(sp,"    rkey_%s(ObjectLoc &loc) : rKey(\"%s\",loc,cmpr)", knm, knm);
-      fprintf(sp," {}\n");
+      fprintf(sp,"    static int rcmpr(char *a, char *b);\n");
+      fprintf(sp,"    rkey_%s(ObjectLoc &loc) : rKey(\"%s\",loc,rcmpr) {}\n", knm, knm);
+      fprintf(sp,"    int wr_key(char *cp=0);\n");
       fprintf(sp,"  };\n");
     }
     fprintf(sp,"\n");
@@ -1272,40 +1338,35 @@ int main(int ac, char **av)
   for( it=sit ; it!=eit; ++it ) {
     tobj *tp = *it;
     const char * tnm = tp->name->c_str();
-    list<iobj*>::iterator sidx=indecies.begin();
-    list<iobj*>::iterator eidx=indecies.end();
-    list<iobj*>::iterator idx;
 
     for( idx=sidx; idx!=eidx; ++idx ) {
-      if( *(*idx)->tbl != *(*it)->name ) continue;
-      const char *knm = (*idx)->name->c_str();
+      iobj *ip = *idx;
+      if( ip->tbl != tp ) continue;
+      const char *knm = ip->name->c_str();
       fprintf(sp,"\n");
       fprintf(sp,"int %sLoc::ikey_%s::\n", tnm, knm);
-      fprintf(sp,"cmpr(char *a, char *b)\n");
+      fprintf(sp,"icmpr(char *a, char *b)\n");
       fprintf(sp,"{\n");
       fprintf(sp,"  ikey_%s *kp = (ikey_%s *)a;\n", knm, knm);
-      fprintf(sp,"  int v = *(int*)b;\n");
-      if( (*idx)->unique <= 0 ) fprintf(sp,"  if( kp->v_id == v ) return 0;\n");
-      fprintf(sp,"  %sLoc vloc(kp->loc.entity);\n", tnm);
-      fprintf(sp,"  if( vloc.FindId(v) )\n");
-      fprintf(sp,"    vloc.err_(Db::errCorrupt);\n");
-      put_icmpr(sp, tp, *idx);
+      (ip->is_dir>0 ? dir_icmpr : ind_icmpr)(sp, tp, ip);
       fprintf(sp,"  return 0;\n");
       fprintf(sp,"}\n");
-      fprintf(sp,"\n");
       fprintf(sp,"int %sLoc::rkey_%s::\n", tnm, knm);
-      fprintf(sp,"cmpr(char *a, char *b)\n");
+      fprintf(sp,"rcmpr(char *a, char *b)\n");
       fprintf(sp,"{\n");
       fprintf(sp,"  rkey_%s *kp = (rkey_%s *)a;\n", knm, knm);
       fprintf(sp,"  %sLoc &kloc = (%sLoc&)kp->loc;\n", tnm, tnm);
-      fprintf(sp,"  int v = kloc->id, b_id = *(int*)b;\n");
-      fprintf(sp,"  if( v == b_id ) return 0;\n");
-      fprintf(sp,"  %sLoc vloc(kloc.entity);\n", tnm);
-      fprintf(sp,"  if( vloc.FindId(b_id) )\n");
-      fprintf(sp,"    kloc.err_(Db::errCorrupt);\n");
-      put_rcmpr(sp, tp, *idx);
+      (ip->is_dir>0 ? dir_rcmpr : ind_rcmpr)(sp, tp, ip);
       fprintf(sp,"  return 0;\n");
       fprintf(sp,"}\n");
+      fprintf(sp,"int %sLoc::rkey_%s::\n", tnm, knm);
+      fprintf(sp,"wr_key(char *bp)\n");
+      fprintf(sp,"{\n");
+      fprintf(sp,"  char *cp = bp;\n");
+      fprintf(sp,"  %sLoc &kloc = (%sLoc&)loc;\n", tnm, tnm);
+      put_rkey(sp, tp, ip);
+      fprintf(sp,"  return cp-bp;\n");
+      fprintf(sp,"}\n");
     }
     fprintf(sp,"\n");
     fprintf(sp,"int %sLoc::Allocate()\n", tnm);
@@ -1344,10 +1405,10 @@ int main(int ac, char **av)
       const char *dnm = dp->name->c_str();
       if( dp->is_autoincr > 0 && dp->idx ) {
         const char *inm = dp->idx->name->c_str();
-        fprintf(sp,"  { ");  typ_dobj(sp, dp);
+        fprintf(sp,"  { %s", typ_dobj(dp));
         fprintf(sp," (%sLoc::*fn)() = &%sLoc::%s;\n", tnm, tnm, dnm);
-        fprintf(sp,"    "); typ_dobj(sp, dp);
-        fprintf(sp," v = last(\"%s\",(", inm); typ_dobj(sp, dp);
+        fprintf(sp,"    %s", typ_dobj(dp));
+        fprintf(sp," v = last(\"%s\",(%s", inm, typ_dobj(dp));
         fprintf(sp," (Db::ObjectLoc::*)())fn);  %s(v+1); }\n", dnm);
       }
       if( dp->has_def > 0 ) {
@@ -1400,7 +1461,7 @@ int main(int ac, char **av)
           case dobj::ty_mediumblob:
           case dobj::ty_longblob:
           case dobj::ty_media: {
-            fprintf(sp,"  %s((", dnm); typ_dobj(sp,dp);
+            fprintf(sp,"  %s((%s", dnm, typ_dobj(dp));
             fprintf(sp," *)\"%s\",%d);\n", dp->def.s->c_str(), (int)dp->def.s->size());
             break; }
           default:
@@ -1421,11 +1482,11 @@ int main(int ac, char **av)
     fprintf(sp,"  if_err( construct() );\n");
     n = 0;
     for( idx=sidx; idx!=eidx; ++idx ) {
-      if( *(*idx)->tbl != *(*it)->name ) continue;
-      if( !n++ ) fprintf(sp,"  int id = this->id();\n");
-      const char *knm = (*idx)->name->c_str();
+      iobj *ip = *idx;
+      if( ip->tbl != tp ) continue;
+      const char *knm = ip->name->c_str();
       fprintf(sp,"  { rkey_%s rkey(*this);\n",knm);
-        fprintf(sp,"    if_err( entity->index(\"%s\")->Insert(rkey,&id) ); }\n",knm);
+      fprintf(sp,"    if_err( entity->index(\"%s\")->Insert(rkey,(void*)_id()) ); }\n", knm);
     }
     fprintf(sp,"  if_err( insertCascade() );\n");
     fprintf(sp,"  return 0;\n");
@@ -1435,8 +1496,9 @@ int main(int ac, char **av)
     fprintf(sp,"{\n");
     fprintf(sp,"  if_err( deleteProhibit() );\n");
     for( idx=sidx; idx!=eidx; ++idx ) {
-      if( *(*idx)->tbl != *(*it)->name ) continue;
-      const char *knm = (*idx)->name->c_str();
+      iobj *ip = *idx;
+      if( ip->tbl != tp ) continue;
+      const char *knm = ip->name->c_str();
       fprintf(sp,"  { rkey_%s rkey(*this);\n",knm);
       fprintf(sp,"    if_err( entity->index(\"%s\")->Delete(rkey) ); }\n",knm);
     }
@@ -1492,13 +1554,15 @@ int main(int ac, char **av)
     tobj *tp = *it;
     const char *tnm = tp->name->c_str();
     fprintf(sp,"  if_ret( %s.new_entity(\"%s\", sizeof(%sObj)) );\n", tnm, tnm, tnm);
-    list<iobj*>::iterator sidx=indecies.begin();
-    list<iobj*>::iterator eidx=indecies.end();
-    list<iobj*>::iterator idx;
     for( idx=sidx; idx!=eidx; ++idx ) {
-      if( *(*idx)->tbl != *(*it)->name ) continue;
-      const char *nm = (*idx)->name->c_str();
-      fprintf(sp,"  if_ret( %s.add_kindex(\"%s\") );\n", tnm, nm);
+      iobj *ip = *idx;
+      if( ip->tbl != tp ) continue;
+      const char *nm = ip->name->c_str();
+      if( ip->is_dir > 0 )
+        fprintf(sp,"  if_ret( %s.add_dir_index(\"%s\", %sLoc::key_%s::size()) );\n",
+          tnm, nm, tnm, nm);
+      else
+        fprintf(sp,"  if_ret( %s.add_ind_index(\"%s\") );\n", tnm, nm);
     }
     fprintf(sp,"\n");
   }
@@ -1576,13 +1640,11 @@ int main(int ac, char **av)
     tobj *tp = *it;
     const char *tnm = tp->name->c_str();
     fprintf(sp,"  if_ret( %s.get_entity(\"%s\") );\n", tnm, tnm);
-    list<iobj*>::iterator sidx=indecies.begin();
-    list<iobj*>::iterator eidx=indecies.end();
-    list<iobj*>::iterator idx;
     for( idx=sidx; idx!=eidx; ++idx ) {
-      if( *(*idx)->tbl != *(*it)->name ) continue;
-      const char *nm = (*idx)->name->c_str();
-      fprintf(sp,"  if_ret( %s.key_index(\"%s\") );\n", tnm, nm);
+      iobj *ip = *idx;
+      if( ip->tbl != tp ) continue;
+      const char *nm = ip->name->c_str();
+      fprintf(sp,"  if_ret( %s.get_index(\"%s\") );\n", tnm, nm);
     }
     fprintf(sp,"\n");
   }
index e66c0d7d295f287b2a2c12c3483aea4808826ef0..5a9e919b3b205a36d1ad687b4788fcb7c6b9a0fe 100644 (file)
@@ -7,11 +7,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: cinelerra 5.1\n"
 "Report-Msgid-Bugs-To: cinelerra@lists.cinelerra-cv.org\n"
-"POT-Creation-Date: 2016-02-22 11:56+0100\n"
-"PO-Revision-Date: 2016-02-22 12:00+0100\n"
-"Last-Translator: good guy <goodguy@translate.google.com>\n"
-"Language-Team: it <it@li.org>\n"
-"Language: it\n"
+"POT-Creation-Date: 2016-07-25 17:48-0400\n"
+"PO-Revision-Date: 2016-07-26 00:35+0200\n"
+"Last-Translator: Nicola Ferralis <feranick@hotmail.com>\n"
+"Language-Team: feranick@hotmail.com\n"
+"Language: it_IT\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -20,7 +20,6 @@ msgstr ""
 #: cinelerra//preferencesthread.C:621
 msgid "OK"
 msgstr "OK"
-#msgstr ""
 
 #: guicast//bcbutton.C:324 guicast//bcbutton.C:332 guicast//bcbutton.C:340
 #: guicast//bcbutton.C:519 guicast//bcbutton.C:521 guicast//bcbutton.C:528
@@ -48,7 +47,6 @@ msgstr "Davvero eliminare i seguenti file?"
 #, c-format
 msgid "BC_DisplayInfo::init_window: cannot open display \"%s\".\n"
 msgstr "BC_DisplayInfo::init_window: cannot open display \"%s\".\n"
-#msgstr ""
 
 #: guicast//bcdisplayinfo.C:244
 #, c-format
@@ -121,7 +119,6 @@ msgstr ": Cancellato"
 #: plugins/reverb/reverbwindow.C:239
 msgid "File"
 msgstr "File"
-#msgstr ""
 
 #: guicast//bcfilebox.inc:43
 msgid "Size"
@@ -134,7 +131,6 @@ msgstr "Data"
 #: guicast//bcfilebox.inc:45
 msgid "Ext."
 msgstr "Ext."
-#msgstr ""
 
 #: guicast//bcnewfolder.C:60 cinelerra//newfolder.C:60
 msgid "Enter the name of the folder:"
@@ -217,7 +213,6 @@ msgstr "Campioni Hex"
 #: guicast//units.h:48 cinelerra//patchbay.C:84
 msgid "Frames"
 msgstr "Frames"
-#msgstr ""
 
 #: guicast//units.h:60
 msgid "Feet-frames"
@@ -260,7 +255,6 @@ msgstr "This program is free software; you can redistribute it and/or modify it
 "This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n"
 "without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n"
 "PURPOSE.  See the GNU General Public License for more details.\n"
-#msgstr ""
 
 #: cinelerra//adcuts.C:30
 #, c-format
@@ -272,7 +266,7 @@ msgstr "Tagli per %s completa\n"
 #: cinelerra//vdeviceprefs.C:418 cinelerra//vdeviceprefs.C:429
 #: cinelerra//vdeviceprefs.C:446
 msgid "Device path:"
-msgstr "Percorso perif.:"
+msgstr "Percorso Disp:"
 
 #: cinelerra//adeviceprefs.C:318 cinelerra//adeviceprefs.C:384
 #: cinelerra//adeviceprefs.C:569 cinelerra//adeviceprefs.C:586
@@ -280,11 +274,10 @@ msgstr "Percorso perif.:"
 #: cinelerra//fileformat.C:89 cinelerra//formatwindow.C:48
 msgid "Bits:"
 msgstr "Bits:"
-#msgstr ""
 
 #: cinelerra//adeviceprefs.C:365
 msgid "Device:"
-msgstr "Periferica:"
+msgstr "Dispositivo:"
 
 #: cinelerra//adeviceprefs.C:396
 msgid "Stop playback locks up."
@@ -293,7 +286,6 @@ msgstr "Ferma ricerca riproduzione."
 #: cinelerra//adeviceprefs.C:423
 msgid "Server:"
 msgstr "Server:"
-#msgstr ""
 
 #: cinelerra//adeviceprefs.C:441 cinelerra//adeviceprefs.C:492
 #: cinelerra//interfaceprefs.C:194 cinelerra//performanceprefs.C:202
@@ -303,7 +295,7 @@ msgstr "Porta:"
 
 #: cinelerra//adeviceprefs.C:472 cinelerra//vdeviceprefs.C:329
 msgid "Device Path:"
-msgstr "Percorso Periferica:"
+msgstr "Percorso Dispositivo:"
 
 #: cinelerra//adeviceprefs.C:512 cinelerra//channeledit.C:1037
 #: cinelerra//vdeviceprefs.C:365
@@ -340,11 +332,10 @@ msgstr "Automazione"
 #, c-format
 msgid "Plugin %d"
 msgstr "Plugin %d"
-#msgstr ""
 
 #: cinelerra//apanel.C:89 cinelerra//gwindowgui.C:57 cinelerra//mainmenu.C:233
 msgid "Mute"
-msgstr "Muto"
+msgstr "Muta"
 
 #: cinelerra//apanel.C:101
 msgid "Play"
@@ -368,7 +359,6 @@ msgstr "filtro"
 #: cinelerra//assetedit.C:225
 msgid ": Asset Info"
 msgstr ": Asset Info"
-#msgstr ""
 
 #: cinelerra//assetedit.C:295
 msgid ": Asset path"
@@ -384,16 +374,15 @@ msgstr "Formato file:"
 
 #: cinelerra//assetedit.C:310
 msgid "Bytes:"
-msgstr "Byte:"
+msgstr "Bytes:"
 
 #: cinelerra//assetedit.C:339
 msgid "Bitrate (bits/sec):"
-msgstr "Bitrate (bit / sec):"
+msgstr "Bitrate (bits/sec):"
 
 #: cinelerra//assetedit.C:354 cinelerra//formattools.C:223
 msgid "Audio:"
 msgstr "Audio:"
-#msgstr ""
 
 #: cinelerra//assetedit.C:362 cinelerra//assetedit.C:507
 #: cinelerra//fileexr.C:598 cinelerra//fileffmpeg.C:481
@@ -422,12 +411,10 @@ msgstr "Ordine Byte:"
 #: cinelerra//assetedit.C:469 cinelerra//assetedit.C:882
 msgid "Lo-Hi"
 msgstr "Lo-Hi"
-#msgstr ""
 
 #: cinelerra//assetedit.C:471 cinelerra//assetedit.C:900
 msgid "Hi-Lo"
 msgstr "Hi-Lo"
-#msgstr ""
 
 #: cinelerra//assetedit.C:485
 msgid "Values are unsigned"
@@ -441,7 +428,6 @@ msgstr "Valori selezionati"
 #: cinelerra//assetedit.C:500 cinelerra//formattools.C:260
 msgid "Video:"
 msgstr "Video:"
-#msgstr ""
 
 #: cinelerra//assetedit.C:518 cinelerra//setformat.C:394
 msgid "Frame rate:"
@@ -473,7 +459,7 @@ msgstr "Aggiusta Interlaccio:"
 
 #: cinelerra//assetedit.C:579
 msgid "Asset's interlacing:"
-msgstr "Migliora interlaccio"
+msgstr "Interlaccio Elemento"
 
 #: cinelerra//assetedit.C:593
 msgid "Interlace correction:"
@@ -517,7 +503,7 @@ msgstr "Seleziona un file"
 
 #: cinelerra//assetpopup.C:136
 msgid "Info..."
-msgstr "Info ..."
+msgstr "Info..."
 
 #: cinelerra//assetpopup.C:177
 msgid "Rebuild index"
@@ -645,7 +631,7 @@ msgstr "Cancella elemento dal progetto"
 
 #: cinelerra//awindowgui.C:1946
 msgid "Edit information on asset"
-msgstr "Edita le informazioni sull'elemento"
+msgstr "Modifica le informazioni sull'elemento"
 
 #: cinelerra//awindowgui.C:1960
 msgid "Redraw index"
@@ -682,7 +668,6 @@ msgstr "Fatto"
 #: cinelerra//batch.C:94
 msgid "Ok"
 msgstr "Ok"
-#msgstr ""
 
 #: cinelerra//batch.C:98 cinelerra//batch.C:102
 msgid "New file"
@@ -737,7 +722,6 @@ msgstr "Elaborazione Batch..."
 #: cinelerra//batchrender.C:75
 msgid "Shift-B"
 msgstr "Shift-B"
-#msgstr ""
 
 #: cinelerra//batchrender.C:437 cinelerra//bdcreate.C:190
 #: cinelerra//dvdcreate.C:229
@@ -765,7 +749,6 @@ msgstr ": Errore"
 #: cinelerra//batchrender.C:713
 msgid ": Batch Render"
 msgstr ": Batch Render"
-#msgstr ""
 
 #: cinelerra//batchrender.C:748
 msgid "Output path:"
@@ -860,7 +843,6 @@ msgstr "BD Render ..."
 #: cinelerra//bdcreate.C:46
 msgid "Ctrl-d"
 msgstr "Ctrl-d"
-#msgstr ""
 
 #: cinelerra//bdcreate.C:85 cinelerra//dvdcreate.C:85
 #, c-format
@@ -933,7 +915,6 @@ msgstr "Capitoli le etichette"
 #: cinelerra//bdcreate.C:513 cinelerra//dvdcreate.C:588
 msgid "Audio 5.1"
 msgstr "Audio 5.1"
-#msgstr ""
 
 #: cinelerra//bdcreate.C:523 cinelerra//dvdcreate.C:598
 msgid "Aspect 16x9"
@@ -942,7 +923,6 @@ msgstr "Aspetto 16x9"
 #: cinelerra//bdcreate.C:535
 msgid ": Create BD"
 msgstr ": Create BD"
-#msgstr ""
 
 #: cinelerra//bdcreate.C:567 cinelerra//channeledit.C:1030
 #: cinelerra//clipedit.C:188 cinelerra//dvdcreate.C:653
@@ -970,7 +950,7 @@ msgstr "BRender::set_video_map chiamata impostata su NOT_SCANNED\n"
 #: cinelerra//brender.C:280
 #, c-format
 msgid "BRender::set_video_map %jd: attempt to set beyond end of map %jd.\n"
-msgstr "BRender::set_video_map %jd: tentativo di impostazione oltre la mappa %jd.\n"
+msgstr "BRender::set_video_map %jd: tentativo di impostazione oltre fine della mappa %jd.\n"
 
 #: cinelerra//browsebutton.C:50
 msgid "Look for file"
@@ -983,47 +963,47 @@ msgstr "Finestra"
 #: cinelerra//canvas.C:1096
 msgid "Zoom 25%"
 msgstr "Zoom 25%"
-#msgstr ""
+#msgstr "Zoom 25% "
 
 #: cinelerra//canvas.C:1097
 msgid "Zoom 33%"
 msgstr "Zoom 33%"
-#msgstr ""
+#msgstr "Zoom 33% "
 
 #: cinelerra//canvas.C:1098
 msgid "Zoom 50%"
 msgstr "Zoom 50%"
-#msgstr ""
+#msgstr "Zoom 50% "
 
 #: cinelerra//canvas.C:1099
 msgid "Zoom 75%"
 msgstr "Zoom 75%"
-#msgstr ""
+#msgstr "Zoom 75% "
 
 #: cinelerra//canvas.C:1100 cinelerra//recordmonitor.C:858
 msgid "Zoom 100%"
 msgstr "Zoom 100%"
-#msgstr ""
+#msgstr "Zoom 100% "
 
 #: cinelerra//canvas.C:1101
 msgid "Zoom 150%"
 msgstr "Zoom 150%"
-#msgstr ""
+#msgstr "Zoom 150% "
 
 #: cinelerra//canvas.C:1102
 msgid "Zoom 200%"
 msgstr "Zoom 200%"
-#msgstr ""
+#msgstr "Zoom 200% "
 
 #: cinelerra//canvas.C:1103
 msgid "Zoom 300%"
 msgstr "Zoom 300%"
-#msgstr ""
+#msgstr "Zoom 300% "
 
 #: cinelerra//canvas.C:1104
 msgid "Zoom 400%"
 msgstr "Zoom 400%"
-#msgstr ""
+#msgstr "Zoom 400% "
 
 #: cinelerra//canvas.C:1127
 msgid "Zoom Auto"
@@ -1056,12 +1036,10 @@ msgstr "Chiudi sorgente"
 #: cinelerra//channeledit.C:120
 msgid "NTSC_DVB"
 msgstr "NTSC_DVB"
-#msgstr ""
 
 #: cinelerra//channeledit.C:121
 msgid "CATV_DVB"
 msgstr "CATV_DVB"
-#msgstr ""
 
 #: cinelerra//channeledit.C:122
 msgid "NTSC_BCAST"
@@ -1102,12 +1080,10 @@ msgstr "PAL_ITALIA"
 #: cinelerra//channeledit.C:131
 msgid "PAL_IRELAND"
 msgstr "PAL_IRELAND"
-#msgstr ""
 
 #: cinelerra//channeledit.C:132
 msgid "PAL_NEWZEALAND"
 msgstr "PAL_NEWZEALAND"
-#msgstr ""
 
 #: cinelerra//channeledit.C:134 cinelerra//channeledit.C:145
 msgid "ERROR"
@@ -1116,16 +1092,14 @@ msgstr "ERRORE"
 #: cinelerra//channeledit.C:141
 msgid "NTSC"
 msgstr "NTSC"
-#msgstr ""
 
 #: cinelerra//channeledit.C:142
 msgid "PAL"
-msgstr "AMICO"
+msgstr "PAL"
 
 #: cinelerra//channeledit.C:143
 msgid "SECAM"
 msgstr "SECAM"
-#msgstr ""
 
 #: cinelerra//channeledit.C:151 cinelerra//fileexr.C:198
 #: cinelerra//plugindialog.C:257 cinelerra//recordbatches.C:308
@@ -1177,7 +1151,7 @@ msgstr "Tabella frequenze:"
 
 #: cinelerra//channeledit.C:668 cinelerra//channeledit.C:1062
 msgid "Norm:"
-msgstr "Norma:"
+msgstr "Norm:"
 
 #: cinelerra//channeledit.C:671 cinelerra//channeledit.C:1075
 msgid "Input:"
@@ -1185,7 +1159,7 @@ msgstr "Inserire:"
 
 #: cinelerra//channeledit.C:1055
 msgid "Fine:"
-msgstr "Bene:"
+msgstr "Fine:"
 
 #: cinelerra//channeledit.C:1523 plugins/brightness/brightnesswindow.C:54
 msgid "Brightness:"
@@ -1236,7 +1210,6 @@ msgstr "DBL fila CLK per trovare il titolo"
 #: cinelerra//channelinfo.C:307
 msgid ": ChanSearch"
 msgstr ": ChanSearch"
-#msgstr ""
 
 #: cinelerra//channelinfo.C:339 cinelerra//dbwindow.C:590
 #: cinelerra//recordbatches.C:23
@@ -1320,7 +1293,6 @@ msgstr "END INFO canale, avviare record"
 #: cinelerra//channelinfo.C:1333
 msgid "Directory:"
 msgstr "Directory:"
-#msgstr ""
 
 #: cinelerra//channelinfo.C:1335 cinelerra//recordgui.C:156
 #: cinelerra//swindow.C:145
@@ -1346,7 +1318,6 @@ msgstr ": Informazioni sul canale"
 #: cinelerra//channelinfo.C:1415
 msgid "Start Cron"
 msgstr "Start Cron"
-#msgstr ""
 
 #: cinelerra//channelinfo.C:1416
 msgid "Poweroff"
@@ -1370,7 +1341,6 @@ msgstr "Non può aprire il video DVB dispositivo\n"
 #: cinelerra//channelinfo.C:1791
 msgid "Scan..."
 msgstr "Scan..."
-#msgstr ""
 
 #: cinelerra//channelinfo.C:1791
 msgid "Shift-S"
@@ -1409,7 +1379,6 @@ msgstr "Uno spezzone con questo nome esiste"
 #: cinelerra//clipedit.C:158
 msgid ": Clip Info"
 msgstr ": Clip Info"
-#msgstr ""
 
 #: cinelerra//clipedit.C:196
 msgid "Comments:"
@@ -1473,7 +1442,7 @@ msgstr "Blu"
 #: plugins/radialblur/radialblur.C:298 plugins/swapchannels/swapchannels.C:434
 #: plugins/swapchannels/swapchannels.C:453 plugins/zoomblur/zoomblur.C:310
 msgid "Alpha"
-msgstr "Alfa"
+msgstr "Alpha"
 
 #: cinelerra//commercials.C:168 cinelerra//commercials.C:578
 #: cinelerra//commercials.C:797
@@ -1499,19 +1468,16 @@ msgstr "Tagliare la clip %d nel modificare @%f %f-%f, clip di @%f-%f\n"
 #, c-format
 msgid "ad: trk %d@%s  "
 msgstr "ad: trk %d@%s  "
-#msgstr ""
 
 #: cinelerra//commercials.C:682
 #, c-format
 msgid "trk%d edt%d asset %s"
 msgstr "trk%d edt%d asset %s"
-#msgstr ""
 
 #: cinelerra//commercials.C:692
 #, c-format
 msgid "scan: clip%d %f-%f"
 msgstr "scan: clip%d %f-%f"
-#msgstr ""
 
 #: cinelerra//commercials.C:700
 msgid "Scanning"
@@ -1529,47 +1495,38 @@ msgstr "Tagliare %f/%f = %d\n"
 #: cinelerra//compresspopup.C:38
 msgid "DV"
 msgstr "DV"
-#msgstr ""
 
 #: cinelerra//compresspopup.C:39 cinelerra//file.inc:83
 msgid "JPEG"
 msgstr "JPEG"
-#msgstr ""
 
 #: cinelerra//compresspopup.C:40
 msgid "MJPA"
 msgstr "MJPA"
-#msgstr ""
 
 #: cinelerra//compresspopup.C:41 cinelerra//file.inc:91
 msgid "PNG"
 msgstr "PNG"
-#msgstr ""
 
 #: cinelerra//compresspopup.C:42
 msgid "PNG-Alpha"
 msgstr "PNG-Alpha"
-#msgstr ""
 
 #: cinelerra//compresspopup.C:43
 msgid "RGB"
 msgstr "RGB"
-#msgstr ""
 
 #: cinelerra//compresspopup.C:44
 msgid "RGB-Alpha"
 msgstr "RGB-Alpha"
-#msgstr ""
 
 #: cinelerra//compresspopup.C:45
 msgid "YUV420"
 msgstr "YUV420"
-#msgstr ""
 
 #: cinelerra//compresspopup.C:46
 msgid "YUV422"
 msgstr "YUV422"
-#msgstr ""
 
 #: cinelerra//confirmquit.C:33
 msgid ": Confirm Quit"
@@ -1578,7 +1535,6 @@ msgstr "Confermare Quit"
 #: cinelerra//confirmquit.C:54
 msgid "( Answering \"No\" will destroy changes )"
 msgstr "( Answering \"No\" will destroy changes )"
-#msgstr ""
 
 #: cinelerra//confirmquit.C:67 cinelerra//question.C:61 cinelerra//reindex.C:92
 msgid "Yes"
@@ -1654,7 +1610,6 @@ msgstr "Crop Video ..."
 #: cinelerra//cropvideo.C:97 cinelerra//cwindowtool.C:362
 msgid ": Crop"
 msgstr ": Crop"
-#msgstr ""
 
 #: cinelerra//cropvideo.C:110
 msgid "Select a region to crop in the video output window"
@@ -1663,7 +1618,6 @@ msgstr "Selezionare una regione da ritagliare nella finestra di output video"
 #: cinelerra//cwindowgui.C:79
 msgid ": Compositor"
 msgstr ": Compositor"
-#msgstr ""
 
 #: cinelerra//cwindowgui.C:616 cinelerra//cwindowgui.C:655
 msgid "insert assets"
@@ -1719,12 +1673,10 @@ msgstr "Fallo"
 #: cinelerra//cwindowtool.C:385
 msgid "W:"
 msgstr "W:"
-#msgstr ""
 
 #: cinelerra//cwindowtool.C:407
 msgid "H:"
 msgstr "H:"
-#msgstr ""
 
 #: cinelerra//cwindowtool.C:466
 msgid ": Color"
@@ -1832,7 +1784,6 @@ msgstr "Applica maschera sotto i plugin"
 #: cinelerra//cwindowtool.C:1986
 msgid "Disable OpenGL masking"
 msgstr "Disable OpenGL masking"
-#msgstr ""
 
 #: cinelerra//cwindowtool.C:2018
 msgid ": Mask"
@@ -1866,12 +1817,10 @@ msgstr "Nervatura:"
 #: cinelerra//cwindowtool.C:2084
 msgid "Press Shift to move an end point"
 msgstr "Press Shift to move an end point"
-#msgstr ""
 
 #: cinelerra//cwindowtool.C:2086
 msgid "Press Ctrl to move a control point"
 msgstr "Press Ctrl to move a control point"
-#msgstr ""
 
 #: cinelerra//cwindowtool.C:2088
 msgid "Press Alt to translate the mask"
@@ -1920,22 +1869,18 @@ msgstr "Premi Alt per tradurre il righello"
 #, c-format
 msgid "%0.01f pixels"
 msgstr "%0.01f pixels"
-#msgstr ""
 
 #: cinelerra//dbwindow.C:202
 msgid "Media DB..."
 msgstr "Media DB..."
-#msgstr ""
 
 #: cinelerra//dbwindow.C:202
 msgid "Shift-M"
 msgstr "Shift-M"
-#msgstr ""
 
 #: cinelerra//dbwindow.C:558
 msgid ": DbWindow"
 msgstr ": DbWindow"
-#msgstr ""
 
 #: cinelerra//dbwindow.C:587
 msgid "vicon"
@@ -1944,7 +1889,6 @@ msgstr "Vicon"
 #: cinelerra//dbwindow.C:588
 msgid "Id"
 msgstr "Id"
-#msgstr ""
 
 #: cinelerra//dbwindow.C:589
 msgid "length"
@@ -1965,7 +1909,7 @@ msgstr "Fallito Elimina clip ID %d\n"
 
 #: cinelerra//dcoffset.C:57 plugins/dcoffset/dcoffset.C:59
 msgid "DC Offset"
-msgstr "Regola DC"
+msgstr "Offset DC"
 
 #: cinelerra//deleteallindexes.C:38
 msgid "Delete existing indexes"
@@ -1984,12 +1928,10 @@ msgstr ": Cancella tutti gli indici"
 #, c-format
 msgid "** %scarrier, dvb_locked %s\n"
 msgstr "** %scarrier, dvb_locked %s\n"
-#msgstr ""
 
 #: cinelerra//devicedvbinput.C:404
 msgid "no "
 msgstr "no "
-#msgstr ""
 
 #: cinelerra//devicedvbinput.C:404
 msgid "lock"
@@ -2041,7 +1983,6 @@ msgstr "DVD Render ..."
 #: cinelerra//dvdcreate.C:45
 msgid "Shift-D"
 msgstr "Shift-D"
-#msgstr ""
 
 #: cinelerra//dvdcreate.C:359
 msgid "create dvd"
@@ -2153,15 +2094,15 @@ msgstr "Ripeti ( shift Z )"
 
 #: cinelerra//editpanel.C:1191
 msgid "Toggle label at current position ( l )"
-msgstr "Inserire etichetta nella posizione attuale ( 1 )"
+msgstr "Inserire etichetta nella posizione attuale ( | )"
 
 #: cinelerra//editpanel.C:1220
 msgid "Fit selection to display ( f )"
-msgstr "Selezione sul display( f )"
+msgstr "Adatta selezione da visualizzare ( f )"
 
 #: cinelerra//editpanel.C:1253
 msgid "Fit all autos to display ( Alt + f )"
-msgstr "auto aggiusta display (Alt + f)"
+msgstr "Aggiusta tutti gli auto da visualizzare (Alt + f)"
 
 #: cinelerra//editpanel.C:1302
 msgid "Drag and drop editing mode"
@@ -2193,7 +2134,7 @@ msgstr "Ridim. traccia..."
 
 #: cinelerra//editpopup.C:175
 msgid "Match output size"
-msgstr "Aggiusta dim uscita"
+msgstr "Uguaglia dimensione in uscita"
 
 #: cinelerra//editpopup.C:197 cinelerra//mainmenu.C:1005
 #: cinelerra//mainmenu.C:1073
@@ -2229,7 +2170,6 @@ msgstr "Esporta EDL..."
 #: cinelerra//exportedl.C:356
 msgid "No."
 msgstr "No."
-#msgstr ""
 
 #: cinelerra//exportedl.C:357
 msgid "Track name"
@@ -2308,13 +2248,11 @@ msgstr "Questo formato non supporta video."
 #: cinelerra//filesndfile.C:457
 msgid "Lo Hi"
 msgstr "Lo Hi"
-#msgstr ""
 
 #: cinelerra//file.C:1398 cinelerra//fileformat.C:180
 #: cinelerra//filesndfile.C:442
 msgid "Hi Lo"
 msgstr "Hi Lo"
-#msgstr ""
 
 #: cinelerra//file.C:1605
 msgid "UNKNOWN"
@@ -2343,7 +2281,6 @@ msgid ""
 "%m\n"
 msgstr "Error while opening \"%s\" for writing. \n"
 "%m\n"
-#msgstr ""
 
 #: cinelerra//filedv.C:249 cinelerra//filelist.C:309 cinelerra//filelist.C:383
 #: cinelerra//filetga.C:219
@@ -2353,7 +2290,6 @@ msgid ""
 "%m\n"
 msgstr "Error while opening \"%s\" for reading. \n"
 "%m\n"
-#msgstr ""
 
 #: cinelerra//filedv.C:389
 #, c-format
@@ -2421,7 +2357,6 @@ msgstr "Impossibile cercare file %ji"
 #: cinelerra//filevorbis.C:362
 msgid ": Audio Compression"
 msgstr ": Audio Compression"
-#msgstr ""
 
 #: cinelerra//filedv.C:1006
 msgid "There are no audio options for this format"
@@ -2469,18 +2404,15 @@ msgstr "== Aprire fallito\n"
 #: cinelerra//fileffmpeg.C:321
 msgid ": Audio Preset"
 msgstr ": Audio Preset"
-#msgstr ""
 
 #: cinelerra//fileffmpeg.C:371
 msgid "Preset:"
 msgstr "Preset:"
-#msgstr ""
 
 #: cinelerra//fileffmpeg.C:377 cinelerra//fileffmpeg.C:517
 #: cinelerra//filempeg.C:2055 cinelerra//fileogg.C:2186
 msgid "Bitrate:"
 msgstr "Bitrate:"
-#msgstr ""
 
 #: cinelerra//fileffmpeg.C:382
 msgid "Audio Options:"
@@ -2489,7 +2421,6 @@ msgstr "Opzioni Audio:"
 #: cinelerra//fileffmpeg.C:454
 msgid ": Video Preset"
 msgstr ": Video Preset"
-#msgstr ""
 
 #: cinelerra//fileffmpeg.C:521 cinelerra//filejpeg.C:325
 #: cinelerra//filejpeglist.C:170 cinelerra//fileogg.C:2191
@@ -2517,36 +2448,30 @@ msgstr "Assumo raw PCM:"
 #: cinelerra//file.inc:73
 msgid "AC3"
 msgstr "AC3"
-#msgstr ""
 
 #: cinelerra//file.inc:74
 msgid "Apple/SGI AIFF"
-msgstr "Apple / SGI AIFF"
+msgstr "Apple/SGI AIFF"
 
 #: cinelerra//file.inc:75
 msgid "AVI Arne Type 1"
 msgstr "AVI Arne Type 1"
-#msgstr ""
 
 #: cinelerra//file.inc:76
 msgid "AVI Avifile"
 msgstr "AVI Avifile"
-#msgstr ""
 
 #: cinelerra//file.inc:77
 msgid "AVI DV Type 2"
 msgstr "AVI DV Type 2"
-#msgstr ""
 
 #: cinelerra//file.inc:78
 msgid "AVI Lavtools"
 msgstr "AVI Lavtools"
-#msgstr ""
 
 #: cinelerra//file.inc:79
 msgid "EXR"
 msgstr "EXR"
-#msgstr ""
 
 #: cinelerra//file.inc:80
 msgid "EXR Sequence"
@@ -2555,70 +2480,58 @@ msgstr "Sequenza EXR"
 #: cinelerra//file.inc:81
 msgid "FFMPEG"
 msgstr "FFMPEG"
-#msgstr ""
 
 #: cinelerra//file.inc:82
 msgid "FLAC"
 msgstr "FLAC"
-#msgstr ""
 
 #: cinelerra//file.inc:84
 msgid "JPEG Sequence"
-msgstr "JPEG Sequence"
-#msgstr ""
+msgstr "Sequenza JPEG"
 
 #: cinelerra//file.inc:85
 msgid "Microsoft WAV"
 msgstr "Microsoft WAV"
-#msgstr ""
 
 #: cinelerra//file.inc:86
 msgid "MPEG Audio"
-msgstr "MPEG Audio"
-#msgstr ""
+msgstr "Audio MPEG"
 
 #: cinelerra//file.inc:87
 msgid "MPEG"
 msgstr "MPEG"
-#msgstr ""
 
 #: cinelerra//file.inc:88
 msgid "MPEG Video"
-msgstr "MPEG Video"
-#msgstr ""
+msgstr "Video MPEG"
 
 #: cinelerra//file.inc:89
 msgid "OGG Theora/Vorbis"
-msgstr "Ogg Theora / Vorbis"
+msgstr "OGG Theora/Vorbis"
 
 #: cinelerra//file.inc:90
 msgid "OGG Vorbis"
 msgstr "OGG Vorbis"
-#msgstr ""
 
 #: cinelerra//file.inc:92
 msgid "PNG Sequence"
-msgstr "PNG Sequence"
-#msgstr ""
+msgstr "Sequenza PNG"
 
 #: cinelerra//file.inc:93
 msgid "Raw DV"
-msgstr "Raw DV"
-#msgstr ""
+msgstr "DV Raw"
 
 #: cinelerra//file.inc:94
 msgid "Raw PCM"
-msgstr "Raw PCM"
-#msgstr ""
+msgstr "PCM raw"
 
 #: cinelerra//file.inc:95
 msgid "Sun/NeXT AU"
-msgstr "Sun / NeXT AU"
+msgstr "Sun/NeXT AU"
 
 #: cinelerra//file.inc:96
 msgid "TGA"
 msgstr "TGA"
-#msgstr ""
 
 #: cinelerra//file.inc:97
 msgid "TGA Sequence"
@@ -2627,7 +2540,6 @@ msgstr "Sequenza TGA"
 #: cinelerra//file.inc:98
 msgid "TIFF"
 msgstr "TIFF"
-#msgstr ""
 
 #: cinelerra//file.inc:99
 msgid "TIFF Sequence"
@@ -2655,17 +2567,15 @@ msgstr "32 Bit Lineari"
 
 #: cinelerra//file.inc:149
 msgid "u Law"
-msgstr "U Legge"
+msgstr "u Law"
 
 #: cinelerra//file.inc:150
 msgid "IMA 4"
 msgstr "IMA 4"
-#msgstr ""
 
 #: cinelerra//file.inc:151
 msgid "ADPCM"
 msgstr "ADPCM"
-#msgstr ""
 
 #: cinelerra//file.inc:152
 msgid "Float"
@@ -2674,17 +2584,14 @@ msgstr "Fluttante"
 #: cinelerra//file.inc:154
 msgid "RGB ALPHA"
 msgstr "RGB ALPHA"
-#msgstr ""
 
 #: cinelerra//file.inc:155
 msgid "PNG ALPHA"
 msgstr "PNG ALPHA"
-#msgstr ""
 
 #: cinelerra//filejpeglist.C:49
 msgid "JPEGLIST"
 msgstr "JPEGLIST"
-#msgstr ""
 
 #: cinelerra//filempeg.C:150
 #, c-format
@@ -2740,7 +2647,6 @@ msgstr "%d tracce video\n"
 #, c-format
 msgid "  v%d %s %dx%d"
 msgstr "  v%d %s %dx%d"
-#msgstr ""
 
 #: cinelerra//filempeg.C:195
 #, c-format
@@ -2761,7 +2667,6 @@ msgstr "%d tracce audio\n"
 #, c-format
 msgid " a%d %s"
 msgstr " a%d %s"
-#msgstr ""
 
 #: cinelerra//filempeg.C:209
 #, c-format
@@ -2787,7 +2692,6 @@ msgstr "%d Insiemi"
 #, c-format
 msgid "%d interleaves\n"
 msgstr "%d interleaves\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:235
 #, c-format
@@ -2805,7 +2709,6 @@ msgstr "Tempi di cella:"
 #, c-format
 msgid "  %3d.  %8.3f"
 msgstr "  %3d.  %8.3f"
-#msgstr ""
 
 #: cinelerra//filempeg.C:256
 #, c-format
@@ -2829,36 +2732,30 @@ msgstr "No info"
 #, c-format
 msgid "Couldn't open %s: invalid table of contents version.\n"
 msgstr "Couldn't open %s: invalid table of contents version.\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:403
 #, c-format
 msgid "Couldn't open %s: table of contents out of date.\n"
 msgstr "Couldn't open %s: table of contents out of date.\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:407
 #, c-format
 msgid "Couldn't open %s: table of contents corrupt.\n"
 msgstr "Couldn't open %s: table of contents corrupt.\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:412
 msgid "Rebuilding the table of contents\n"
 msgstr "Rebuilding the table of contents\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:422
 #, c-format
 msgid "Couldn't open %s: no audio or video.\n"
 msgstr "Couldn't open %s: no audio or video.\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:473
 #, c-format
 msgid "Couldn't open %s: failed.\n"
 msgstr "Couldn't open %s: failed.\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:597
 #, c-format
@@ -2878,7 +2775,6 @@ msgid ""
 "%m\n"
 msgstr "Error while opening \"%s\" for writing\n"
 "%m\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:707
 #, c-format
@@ -2894,7 +2790,6 @@ msgstr "Ampeg_derivative =%d\n"
 #, c-format
 msgid "cant start toc/idx for file: %s\n"
 msgstr "cant start toc/idx for file: %s\n"
-#msgstr ""
 
 #: cinelerra//filempeg.C:817
 msgid "cant access commercials database"
@@ -2908,7 +2803,6 @@ msgstr "Scan toc fermato prima EOF"
 #, c-format
 msgid "mpeg3_open failed: %s"
 msgstr "mpeg3_open failed: %s"
-#msgstr ""
 
 #: cinelerra//filempeg.C:959 cinelerra//filempeg.C:1187
 #, c-format
@@ -2940,16 +2834,14 @@ msgstr "Kbits per secondo"
 #: cinelerra//filempeg.C:1843 cinelerra//filempeg.C:1851
 msgid "II"
 msgstr "II"
-#msgstr ""
 
 #: cinelerra//filempeg.C:1847
 msgid "III"
 msgstr "III"
-#msgstr ""
 
 #: cinelerra//filempeg.C:1977 cinelerra//new.C:391 cinelerra//setformat.C:457
 msgid "Color model:"
-msgstr "Formato colore:"
+msgstr "Modello colore:"
 
 #: cinelerra//filempeg.C:2042
 msgid "Format Preset:"
@@ -2992,12 +2884,10 @@ msgstr "La sequenza avvia i codici in ogni GOP"
 #: cinelerra//filempeg.C:2139 cinelerra//filempeg.C:2147
 msgid "MPEG-1"
 msgstr "MPEG-1"
-#msgstr ""
 
 #: cinelerra//filempeg.C:2143
 msgid "MPEG-2"
 msgstr "MPEG-2"
-#msgstr ""
 
 #: cinelerra//filempeg.C:2196 cinelerra//filempeg.C:2206
 msgid "Generic MPEG-1"
@@ -3034,29 +2924,27 @@ msgstr "Sequenza in pausa SVCD"
 #: cinelerra//filempeg.C:2204
 msgid "DVD NAV"
 msgstr "DVD NAV"
-#msgstr ""
 
 #: cinelerra//filempeg.C:2205
 msgid "DVD"
 msgstr "DVD"
-#msgstr ""
 
 #: cinelerra//filempeg.C:2256 cinelerra//fileogg.C:2259
 #: cinelerra//filevorbis.C:424
 msgid "Fixed bitrate"
-msgstr "Bitrate ottimizzato"
+msgstr "Bitrate fissato"
 
 #: cinelerra//filempeg.C:2270
 msgid "Fixed quantization"
-msgstr "Ottimizza quantizzazione"
+msgstr " Quantizzazione fissata"
 
 #: cinelerra//filempeg.C:2373 cinelerra//filempeg.C:2375
 msgid "YUV 4:2:0"
-msgstr "YUV 4: 2: 0"
+msgstr "YUV 4:2:0"
 
 #: cinelerra//filempeg.C:2374
 msgid "YUV 4:2:2"
-msgstr "YUV 4: 2: 2"
+msgstr "YUV 4:2:2"
 
 #: cinelerra//fileogg.C:187
 #, c-format
@@ -3136,13 +3024,11 @@ msgstr "FileOGG: Cercando di keyframe fallito\n"
 #, c-format
 msgid "FileOGG:: Error while seeking to frame's keyframe (frame: %jd, keyframe: %jd)\n"
 msgstr "FileOGG:: Error while seeking to frame's keyframe (frame: %jd, keyframe: %jd)\n"
-#msgstr ""
 
 #: cinelerra//fileogg.C:1474
 #, c-format
 msgid "FileOGG:: Error while seeking to keyframe, wrong keyframe number (frame: %jd, keyframe: %jd)\n"
 msgstr "FileOGG:: Error while seeking to keyframe, wrong keyframe number (frame: %jd, keyframe: %jd)\n"
-#msgstr ""
 
 #: cinelerra//fileogg.C:1502
 msgid "FileOGG: Expecting keyframe, but didn't get it\n"
@@ -3170,13 +3056,11 @@ msgstr "FileOGG::La storia non allineato correttamente\n"
 #, c-format
 msgid "\tnext_sample_position: %jd, length: %jd\n"
 msgstr "\tnext_sample_position: %jd, length: %jd\n"
-#msgstr ""
 
 #: cinelerra//fileogg.C:1755
 #, c-format
 msgid "\thistory_start: %jd, length: %jd\n"
 msgstr "\thistory_start: %jd, length: %jd\n"
-#msgstr ""
 
 #: cinelerra//fileogg.C:1962
 #, c-format
@@ -3185,7 +3069,7 @@ msgstr "FileOGG: theora_encode_YUVin riuscito con codice %i\n"
 
 #: cinelerra//fileogg.C:2065 cinelerra//filevorbis.C:393
 msgid "Min bitrate:"
-msgstr "Bitrate Min:"
+msgstr "Min bitrate:"
 
 #: cinelerra//fileogg.C:2069 cinelerra//filevorbis.C:397
 msgid "Avg bitrate:"
@@ -3193,7 +3077,7 @@ msgstr "Bitrate medio:"
 
 #: cinelerra//fileogg.C:2074 cinelerra//filevorbis.C:402
 msgid "Max bitrate:"
-msgstr "Bitrate Max:"
+msgstr "Max bitrate:"
 
 #: cinelerra//fileogg.C:2091
 msgid "Average bitrate"
@@ -3205,11 +3089,11 @@ msgstr "Bitrate variabile"
 
 #: cinelerra//fileogg.C:2208
 msgid "Keyframe frequency:"
-msgstr "Frequenza Base:"
+msgstr "Frequenza Fotogramma Chiave:"
 
 #: cinelerra//fileogg.C:2214
 msgid "Keyframe force frequency:"
-msgstr "Frequenza Base:"
+msgstr "Forza Frequenza Fotogramma Chiave:"
 
 #: cinelerra//fileogg.C:2220 plugins/denoisemjpeg/denoisemjpeg.C:377
 #: plugins/greycstoration/greycstorationwindow.C:48
@@ -3218,7 +3102,7 @@ msgstr "Chiarezza:"
 
 #: cinelerra//fileogg.C:2273
 msgid "Fixed quality"
-msgstr "Fissa qualità:"
+msgstr "Qualità fissata:"
 
 #: cinelerra//filesndfile.C:268
 #, c-format
@@ -3234,7 +3118,6 @@ msgstr "Buffer =%p\n"
 #, c-format
 msgid "FileSndFile::read_samples fd=%p temp_double=%p len=%jd asset=%p asset->channels=%d\n"
 msgstr "FileSndFile::read_samples fd=%p temp_double=%p len=%jd asset=%p asset->channels=%d\n"
-#msgstr ""
 
 #: cinelerra//filesndfile.C:418 cinelerra//formatwindow.C:169
 msgid "Dither"
@@ -3272,7 +3155,6 @@ msgstr "Libro pieghevole..."
 #: cinelerra//floatauto.C:422
 msgid "Smooth"
 msgstr "Smooth"
-#msgstr ""
 
 #: cinelerra//floatauto.C:423 plugins/gradient/gradient.C:347
 #: plugins/gradient/gradient.C:437
@@ -3284,12 +3166,10 @@ msgstr "Lineare"
 #: cinelerra//floatauto.C:424
 msgid "Tangent"
 msgstr "Tangent"
-#msgstr ""
 
 #: cinelerra//floatauto.C:425
 msgid "Disjoint"
 msgstr "Disjoint"
-#msgstr ""
 
 #: cinelerra//floatauto.C:427
 msgid "Error"
@@ -3320,7 +3200,7 @@ msgstr "Tipo di file ffmpeg Set"
 
 #: cinelerra//formatpresets.C:58
 msgid "User Defined"
-msgstr "Personalizzazione"
+msgstr "Personalizzato dall’utente"
 
 #: cinelerra//formatpresets.C:68
 msgid "Presets:"
@@ -3373,7 +3253,6 @@ msgstr "Impostare i parametri per questo formato audio:"
 #: cinelerra//formatwindow.C:66
 msgid "HiLo:"
 msgstr "HiLo:"
-#msgstr ""
 
 #: cinelerra//formatwindow.C:69
 msgid "LoHi:"
@@ -3393,7 +3272,7 @@ msgstr "Sovrapposizioni"
 
 #: cinelerra//gwindowgui.C:49
 msgid "Assets"
-msgstr "Scarica Elementi"
+msgstr "Elementi"
 
 #: cinelerra//gwindowgui.C:50
 msgid "Titles"
@@ -3401,11 +3280,11 @@ msgstr "Titoli"
 
 #: cinelerra//gwindowgui.C:51
 msgid "Transitions"
-msgstr "transizioni"
+msgstr "Transizioni"
 
 #: cinelerra//gwindowgui.C:52 cinelerra//viewmenu.C:141
 msgid "Plugin Autos"
-msgstr "plugin Autos"
+msgstr "Plugin Autos"
 
 #: cinelerra//gwindowgui.C:58 cinelerra//mainmenu.C:239
 msgid "Camera X"
@@ -3487,7 +3366,7 @@ msgstr "Sposta modifiche seguenti"
 
 #: cinelerra//interfaceprefs.C:35
 msgid "Drag only one edit"
-msgstr "Sposta questa modifica"
+msgstr "Sposta solo questa modifica"
 
 #: cinelerra//interfaceprefs.C:36
 msgid "Drag source only"
@@ -3499,7 +3378,7 @@ msgstr "Nessun effetto"
 
 #: cinelerra//interfaceprefs.C:89
 msgid "Time Format"
-msgstr "Formato file:"
+msgstr "Formato Orario"
 
 #: cinelerra//interfaceprefs.C:122
 msgid "Frames per foot:"
@@ -3536,12 +3415,10 @@ msgstr "Modifica"
 #: cinelerra//interfaceprefs.C:183
 msgid "Keyframe reticle:"
 msgstr "Keyframe reticle:"
-#msgstr ""
 
 #: cinelerra//interfaceprefs.C:199
 msgid "PIN:"
 msgstr "PIN:"
-#msgstr ""
 
 #: cinelerra//interfaceprefs.C:222
 msgid "Clicking on edit boundaries does what:"
@@ -3566,7 +3443,6 @@ msgstr "Min DB per meter:"
 #: cinelerra//interfaceprefs.C:257
 msgid "Max DB:"
 msgstr "Max DB:"
-#msgstr ""
 
 #: cinelerra//interfaceprefs.C:265
 msgid "Theme:"
@@ -3583,7 +3459,6 @@ msgstr "Mostra suggerimento del giorno"
 #: cinelerra//interfaceprefs.C:683
 msgid "ffmpeg probe warns rebuild indexes"
 msgstr "ffmpeg probe warns rebuild indexes"
-#msgstr ""
 
 #: cinelerra//interfaceprefs.C:701
 msgid "Scan for commercials during toc build"
@@ -3592,7 +3467,6 @@ msgstr "Scansione per spot durante toc costruire"
 #: cinelerra//interfaceprefs.C:715
 msgid "Android Remote Control"
 msgstr "Android Remote Control"
-#msgstr ""
 
 #: cinelerra//interfaceprefs.C:766
 msgid "Shell Commands"
@@ -3609,17 +3483,14 @@ msgstr "Importa immagini con durata di"
 #: cinelerra//interfaceprefs.C:835
 msgid "Never"
 msgstr "Never"
-#msgstr ""
 
 #: cinelerra//interfaceprefs.C:836
 msgid "Dragging"
 msgstr "Dragging"
-#msgstr ""
 
 #: cinelerra//interfaceprefs.C:837
 msgid "Always"
 msgstr "Always"
-#msgstr ""
 
 #: cinelerra//keyframegui.C:50
 msgid "Parameter"
@@ -3685,17 +3556,14 @@ msgstr "modifica disjoint"
 #: cinelerra//keyframepopup.C:455 cinelerra//keyframepopup.C:461
 msgid "change keyframe curve mode"
 msgstr "change keyframe curve mode"
-#msgstr ""
 
 #: cinelerra//keyframepopup.C:475
 msgid "Edit Params..."
 msgstr "Edit Params..."
-#msgstr ""
 
 #: cinelerra//keyframepopup.C:512
 msgid "Hide keyframe type"
 msgstr "Hide keyframe type"
-#msgstr ""
 
 #: cinelerra//labeledit.C:108
 msgid "Label Text:"
@@ -3720,7 +3588,6 @@ msgstr "Carica file..."
 #: cinelerra//loadfile.C:174
 msgid ": Load"
 msgstr ": Load"
-#msgstr ""
 
 #: cinelerra//loadfile.C:175
 msgid "Select files to load:"
@@ -3851,7 +3718,7 @@ msgstr "Si sono verificati i seguenti errori:"
 
 #: cinelerra//mainindexes.C:192 cinelerra//threadindexer.C:137
 msgid "Building Indexes..."
-msgstr "Creazione Indici..."
+msgstr "Creazione Indici in corso…"
 
 #: cinelerra//mainmenu.C:136 cinelerra//shbtnprefs.C:152
 #: plugins/svg/svgwin.C:244
@@ -3865,12 +3732,10 @@ msgstr "Fotogrammi chiave"
 #: cinelerra//mainmenu.C:179 cinelerra//new.C:282 cinelerra//setformat.C:336
 msgid "Audio"
 msgstr "Audio"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:188 cinelerra//new.C:310 cinelerra//setformat.C:388
 msgid "Video"
 msgstr "Video"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:195
 msgid "Tracks"
@@ -3895,7 +3760,6 @@ msgstr "Posizioni Predefinite"
 #: cinelerra//mainmenu.C:256
 msgid "Ctrl-P"
 msgstr "Ctrl-P"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:257
 msgid "Tile left"
@@ -3907,19 +3771,19 @@ msgstr "Tile destra"
 
 #: cinelerra//mainmenu.C:564
 msgid "Dump CICache"
-msgstr "Scarica CICache"
+msgstr "Scarta CICache"
 
 #: cinelerra//mainmenu.C:574
 msgid "Dump EDL"
-msgstr "Scarica EDL"
+msgstr "Scarta EDL"
 
 #: cinelerra//mainmenu.C:588
 msgid "Dump Plugins"
-msgstr "Scarica Plugins"
+msgstr "Scarta Plugins"
 
 #: cinelerra//mainmenu.C:603
 msgid "Dump Assets"
-msgstr "Scarica Elementi"
+msgstr "Scarta Elementi"
 
 #: cinelerra//mainmenu.C:614
 msgid "Undo"
@@ -3937,7 +3801,6 @@ msgstr "Rifai"
 #: cinelerra//mainmenu.C:632
 msgid "Shift-Z"
 msgstr "Shift-Z"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:647
 #, c-format
@@ -3951,7 +3814,6 @@ msgstr "Taglia fotogrammi chiave"
 #: cinelerra//mainmenu.C:653
 msgid "Shift-X"
 msgstr "Shift-X"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:666
 msgid "Copy keyframes"
@@ -3960,7 +3822,6 @@ msgstr "Copia fotogrammi chiave"
 #: cinelerra//mainmenu.C:666
 msgid "Shift-C"
 msgstr "Shift-C"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:679
 msgid "Paste keyframes"
@@ -3969,7 +3830,6 @@ msgstr "Incolla fotogrammi chiave"
 #: cinelerra//mainmenu.C:679
 msgid "Shift-V"
 msgstr "Shift-V"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:692
 msgid "Clear keyframes"
@@ -3978,7 +3838,6 @@ msgstr "Cancella fotogrammi chiave"
 #: cinelerra//mainmenu.C:692
 msgid "Shift-Del"
 msgstr "Shift-Del"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:707
 msgid "Change to linear"
@@ -3987,12 +3846,10 @@ msgstr "Cambiare per lineare"
 #: cinelerra//mainmenu.C:722
 msgid "Change to smooth"
 msgstr "Change to smooth"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:736
 msgid "Create curve type..."
 msgstr "Create curve type..."
-#msgstr ""
 
 #: cinelerra//mainmenu.C:794
 msgid "Cut default keyframe"
@@ -4001,7 +3858,6 @@ msgstr "Taglia fotogramma chiave predefinito"
 #: cinelerra//mainmenu.C:794
 msgid "Alt-X"
 msgstr "Alt-X"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:807
 msgid "Copy default keyframe"
@@ -4010,7 +3866,6 @@ msgstr "Copia fotogramma chiave predefinito"
 #: cinelerra//mainmenu.C:807
 msgid "Alt-c"
 msgstr "Alt-c"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:820
 msgid "Paste default keyframe"
@@ -4019,7 +3874,6 @@ msgstr "Incolla fotogramma chiave predefinito"
 #: cinelerra//mainmenu.C:820
 msgid "Alt-v"
 msgstr "Alt-v"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:833
 msgid "Clear default keyframe"
@@ -4028,7 +3882,6 @@ msgstr "Cancella fotogramma chiave predefinito"
 #: cinelerra//mainmenu.C:833
 msgid "Alt-Del"
 msgstr "Alt-Del"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:846
 msgid "Cut"
@@ -4047,7 +3900,6 @@ msgstr "Cancella"
 #: cinelerra//mainmenu.C:882 cinelerra//shbtnprefs.C:132
 msgid "Del"
 msgstr "Del"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:896
 msgid "Paste silence"
@@ -4056,7 +3908,6 @@ msgstr "Incolla silenzio"
 #: cinelerra//mainmenu.C:896
 msgid "Shift-Space"
 msgstr "Shift-Space"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:909
 msgid "Select All"
@@ -4097,7 +3948,6 @@ msgstr "Mappa 5.1:2"
 #: cinelerra//mainmenu.C:1059
 msgid "Shift-T"
 msgstr "Shift-T"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:1086
 msgid "Reset Translation"
@@ -4106,7 +3956,6 @@ msgstr "Resetta Traslazione"
 #: cinelerra//mainmenu.C:1099
 msgid "Shift-U"
 msgstr "Shift-U"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:1127
 msgid "Delete tracks"
@@ -4123,7 +3972,6 @@ msgstr "Muovi la traccia in alto"
 #: cinelerra//mainmenu.C:1151
 msgid "Shift-Up"
 msgstr "Shift-Up"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:1163
 msgid "Move tracks down"
@@ -4132,7 +3980,6 @@ msgstr "Muovi la traccia in basso"
 #: cinelerra//mainmenu.C:1163
 msgid "Shift-Down"
 msgstr "Shift-Down"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:1178
 msgid "Concatenate tracks"
@@ -4145,7 +3992,6 @@ msgstr "Riproduzione Loop"
 #: cinelerra//mainmenu.C:1195
 msgid "Shift-L"
 msgstr "Shift-L"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:1215
 msgid "Add subttl"
@@ -4154,7 +4000,6 @@ msgstr "Aggiungere subttl"
 #: cinelerra//mainmenu.C:1215
 msgid "Shift-Y"
 msgstr "Shift-Y"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:1228 cinelerra//swindow.C:450
 msgid "paste subttl"
@@ -4227,7 +4072,6 @@ msgstr "Riquadro Split X"
 #: cinelerra//mainmenu.C:1464
 msgid "Ctrl-1"
 msgstr "Ctrl-1"
-#msgstr ""
 
 #: cinelerra//mainmenu.C:1477
 msgid "Split Y pane"
@@ -4236,12 +4080,11 @@ msgstr "Riquadro Split Y"
 #: cinelerra//mainmenu.C:1477
 msgid "Ctrl-2"
 msgstr "Ctrl-2"
-#msgstr ""
 
 #: cinelerra//mainprogress.C:169
 #, c-format
 msgid "%s ETA: %s"
-msgstr "%s STIMA: %s"
+msgstr "%s Stima fine del processo: %s"
 
 #: cinelerra//manualgoto.C:120
 msgid "hour  min     sec     msec"
@@ -4319,13 +4162,12 @@ msgstr "Nessuna gamma di processi selezionata."
 #, c-format
 msgid ": %s"
 msgstr ": %s"
-#msgstr ""
 
 #: cinelerra//menueffects.C:469 cinelerra//packagerenderer.C:174
 #: cinelerra//savefile.C:101
 #, c-format
 msgid "Couldn't open %s"
-msgstr "Non posso aprire %s"
+msgstr "Impossibile aprire %s"
 
 #: cinelerra//menueffects.C:592
 msgid ": Render effect"
@@ -4429,7 +4271,6 @@ msgstr "Db non riuscita"
 #, c-format
 msgid "put_commercial: %s"
 msgstr "put_commercial: %s"
-#msgstr ""
 
 #: cinelerra//mwindow.C:1327
 #, c-format
@@ -4443,7 +4284,6 @@ msgid ""
 "Images with odd dimensions may not decode properly."
 msgstr "%s's resolution is %dx%d.\n"
 "Images with odd dimensions may not decode properly."
-#msgstr ""
 
 #: cinelerra//mwindow.C:1356
 #, c-format
@@ -4454,12 +4294,11 @@ msgid ""
 msgstr "%s's index was built for program number %d\n"
 "Playback preference is %d.\n"
 "  Using program %d."
-#msgstr ""
 
 #: cinelerra//mwindow.C:1402
 #, c-format
 msgid "Failed to open %s"
-msgstr "Fallita apertura %s"
+msgstr "Apertura %s non rieuscita"
 
 #: cinelerra//mwindow.C:1435
 msgid "'s format couldn't be determined."
@@ -4489,7 +4328,6 @@ msgstr "MWindow::init_shm: /proc/sys/kernel/shmmax is %p.\n"
 "as root, run: echo 0x7fffffff > /proc/sys/kernel/shmmax\n"
 "before trying to start cinelerra.\n"
 "It should be at least 0x7fffffff for Cinelerra.\n"
-#msgstr ""
 
 #: cinelerra//mwindow.C:1859
 msgid "Initializing Plugins"
@@ -4497,7 +4335,7 @@ msgstr "Inizializzazione Plugins"
 
 #: cinelerra//mwindow.C:1865
 msgid "Initializing GUI"
-msgstr "Avvio GUI"
+msgstr "Inizializzazione GUI"
 
 #: cinelerra//mwindow.C:1873
 msgid "Initializing Fonts"
@@ -4540,11 +4378,11 @@ msgstr "Risorsa per tutti"
 
 #: cinelerra//mwindowedit.C:316
 msgid "asset to size"
-msgstr "elemento dimensione"
+msgstr "elemento dimensione"
 
 #: cinelerra//mwindowedit.C:337
 msgid "asset to rate"
-msgstr "elemento percentuali"
+msgstr "elemento a tasso percentuale"
 
 #: cinelerra//mwindowedit.C:359
 msgid "clear"
@@ -4609,7 +4447,6 @@ msgstr "muovi modifica"
 #: cinelerra//mwindowedit.C:1049
 msgid "paste effect"
 msgstr "paste effect"
-#msgstr ""
 
 #: cinelerra//mwindowedit.C:1065
 msgid "move effect"
@@ -4641,7 +4478,7 @@ msgstr "muovi tracce su"
 
 #: cinelerra//mwindowedit.C:1182
 msgid "mute"
-msgstr "muto"
+msgstr "muta"
 
 #: cinelerra//mwindowedit.C:1244
 msgid "overwrite"
@@ -4770,18 +4607,15 @@ msgstr ": Programma"
 #: cinelerra//preferencesthread.C:218
 msgid "Try FFMpeg first"
 msgstr "Try FFMpeg first"
-#msgstr ""
 
 #: cinelerra//mwindowgui.C:2402 cinelerra//mwindowgui.C:2413
 #: cinelerra//preferencesthread.C:218
 msgid "Try FFMpeg last"
 msgstr "Try FFMpeg last"
-#msgstr ""
 
 #: cinelerra//mwindowgui.C:2415
 msgid "Changing the base codecs may require rebuilding indexes."
 msgstr "Changing the base codecs may require rebuilding indexes."
-#msgstr ""
 
 #: cinelerra//mwindow.inc:56
 msgid "Cinelerra: Attach Effect"
@@ -4794,12 +4628,10 @@ msgstr "Cinelerra: compressione audio"
 #: cinelerra//mwindow.inc:58
 msgid "Cinelerra: Audio Compression"
 msgstr "Cinelerra: Audio Compression"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:59
 msgid "Cinelerra: Camera"
 msgstr "Cinelerra: Camera"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:60
 msgid "Cinelerra: Change Effect"
@@ -4812,7 +4644,6 @@ msgstr "Cinelerra: Informazioni sul canale"
 #: cinelerra//mwindow.inc:62
 msgid "Cinelerra: ChanSearch"
 msgstr "Cinelerra: ChanSearch"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:63
 msgid "Cinelerra: Clip Info"
@@ -4825,7 +4656,6 @@ msgstr "Cinelerra: Colore"
 #: cinelerra//mwindow.inc:65
 msgid "Cinelerra: Compositor"
 msgstr "Cinelerra: Compositor"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:66
 msgid "Cinelerra: Confirm"
@@ -4838,12 +4668,10 @@ msgstr "Cinelerra: Conferma Quit"
 #: cinelerra//mwindow.inc:68
 msgid "Cinelerra: Crop"
 msgstr "Cinelerra: Crop"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:69
 msgid "Cinelerra: DbWindow"
 msgstr "Cinelerra: DbWindow"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:70
 msgid "Cinelerra: Delete All Indexes"
@@ -4868,7 +4696,6 @@ msgstr "Cinelerra: file esiste"
 #: cinelerra//mwindow.inc:75
 msgid "Cinelerra: File Format"
 msgstr "Cinelerra: File Format"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:76
 msgid "Cinelerra: Levels"
@@ -4877,7 +4704,6 @@ msgstr "Cinelerra: Livelli"
 #: cinelerra//mwindow.inc:77
 msgid "Cinelerra: Load"
 msgstr "Cinelerra: Load"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:78
 msgid "Cinelerra: Loading"
@@ -4890,7 +4716,6 @@ msgstr "Cinelerra: trovare il file"
 #: cinelerra//mwindow.inc:80
 msgid "Cinelerra: Mask"
 msgstr "Cinelerra: Mask"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:81
 msgid "Cinelerra: New folder"
@@ -4903,7 +4728,6 @@ msgstr "Cinelerra: Sovrapposizioni"
 #: cinelerra//mwindow.inc:83
 msgid "Cinelerra: Path"
 msgstr "Cinelerra: Path"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:84
 msgid "Cinelerra: Preferences"
@@ -4920,12 +4744,10 @@ msgstr "Cinelerra: proiettore"
 #: cinelerra//mwindow.inc:87
 msgid "Cinelerra: Question"
 msgstr "Cinelerra: Question"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:88
 msgid "Cinelerra: RemoteWindow"
 msgstr "Cinelerra: RemoteWindow"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:89
 msgid "Cinelerra: Remove assets"
@@ -4943,12 +4765,10 @@ msgstr "Cinelerra: Righello"
 #, c-format
 msgid "Cinelerra: %s"
 msgstr "Cinelerra: %s"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:93
 msgid "Cinelerra: Save"
 msgstr "Cinelerra: Save"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:94
 msgid "Cinelerra: Set edit title"
@@ -4982,12 +4802,10 @@ msgstr "Cinelerra: compressione video"
 #: cinelerra//mwindow.inc:101
 msgid "Cinelerra: Viewer"
 msgstr "Cinelerra: Viewer"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:102
 msgid "Cinelerra: Warning"
 msgstr "Cinelerra: Warning"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:103 cinelerra//mwindow.inc:104 cinelerra//new.C:231
 msgid "Cinelerra: New Project"
@@ -4996,7 +4814,6 @@ msgstr "Cinelerra: nuovo Progetto"
 #: cinelerra//mwindow.inc:106
 msgid "Cinelerra: CD Ripper"
 msgstr "Cinelerra: CD Ripper"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:107
 msgid "Cinelerra: Normalize"
@@ -5005,7 +4822,6 @@ msgstr "Cinelerra: Normalizzare"
 #: cinelerra//mwindow.inc:108
 msgid "Cinelerra: Resample"
 msgstr "Cinelerra: Resample"
-#msgstr ""
 
 #: cinelerra//mwindow.inc:109
 msgid "Cinelerra: Time stretch"
@@ -5029,11 +4845,11 @@ msgstr "Campiona:"
 
 #: cinelerra//new.C:328 cinelerra//recordgui.C:245
 msgid "Framerate:"
-msgstr "Freq.fotogrammi:"
+msgstr "Freq. fotogrammi:"
 
 #: cinelerra//new.C:354 cinelerra//setformat.C:406
 msgid "Canvas size:"
-msgstr "Formato:"
+msgstr "Dimensione Tela:"
 
 #: cinelerra//new.C:373 cinelerra//scale.C:270 cinelerra//setformat.C:474
 msgid "Aspect ratio:"
@@ -5041,7 +4857,7 @@ msgstr "Dimensione:"
 
 #: cinelerra//new.C:401 cinelerra//setformat.C:501
 msgid "Interlace mode:"
-msgstr "Interlaccio:"
+msgstr "Modo interlaccio:"
 
 #: cinelerra//new.C:914
 msgid "Auto aspect ratio"
@@ -5050,7 +4866,7 @@ msgstr "Proporzione aspetto automatica"
 #: cinelerra//new.C:940 cinelerra//resizetrackthread.C:212
 #: cinelerra//setformat.C:924 plugins/photoscale/photoscale.C:198
 msgid "Swap dimensions"
-msgstr "dimensioni Swap"
+msgstr "Scambia dimensioni"
 
 #: cinelerra//patchgui.C:382
 msgid "Play track"
@@ -5102,7 +4918,7 @@ msgstr "titolo traccia"
 
 #: cinelerra//patchgui.C:750
 msgid "Nudge"
-msgstr "Pacca"
+msgstr "Colpetto"
 
 #: cinelerra//patchgui.C:761 cinelerra//patchgui.C:767
 msgid "nudge"
@@ -5146,7 +4962,7 @@ msgstr "Nodi:"
 
 #: cinelerra//performanceprefs.C:201
 msgid "Hostname:"
-msgstr "Nome host:"
+msgstr "Hostname:"
 
 #: cinelerra//performanceprefs.C:243
 msgid "Total jobs to create:"
@@ -5164,7 +4980,7 @@ msgstr "Acceso"
 
 #: cinelerra//performanceprefs.C:301
 msgid "Hostname"
-msgstr "Nome host"
+msgstr "Hostname"
 
 #: cinelerra//performanceprefs.C:302
 msgid "Port"
@@ -5201,7 +5017,6 @@ msgstr "Il file aperto, sonde ffmpeg presto"
 #: cinelerra//performanceprefs.C:576
 msgid "build ffmpeg marker indexes"
 msgstr "build ffmpeg marker indexes"
-#msgstr ""
 
 #: cinelerra//performanceprefs.C:599
 msgid "Consolidate output files on completion"
@@ -5251,7 +5066,7 @@ msgstr "Guadagno:"
 
 #: cinelerra//playbackprefs.C:134
 msgid "Audio Driver:"
-msgstr "Usa Driver:"
+msgstr "Driver Audio:"
 
 #: cinelerra//playbackprefs.C:151
 msgid "Video Out"
@@ -5259,7 +5074,7 @@ msgstr "Uscita Video"
 
 #: cinelerra//playbackprefs.C:157
 msgid "Framerate achieved:"
-msgstr "Campioni in archivio:"
+msgstr "Frequenza fotogrammi archiviata: "
 
 #: cinelerra//playbackprefs.C:166
 msgid "Scaling equation: Enlarge / Reduce "
@@ -5275,11 +5090,11 @@ msgstr "TOC Programma No:"
 
 #: cinelerra//playbackprefs.C:215
 msgid "Timecode offset:"
-msgstr "Taratura tempo:"
+msgstr "Offset tempo:"
 
 #: cinelerra//playbackprefs.C:228
 msgid "Video Driver:"
-msgstr "Driver Video:"
+msgstr "Video Driver:"
 
 #: cinelerra//playbackprefs.C:284
 msgid "View follows playback"
@@ -5359,12 +5174,11 @@ msgstr "Licenza: %s"
 #, c-format
 msgid "%s..."
 msgstr "%s..."
-#msgstr ""
 
 #: cinelerra//pluginarray.C:222
 #, c-format
 msgid "%s took %s"
-msgstr "%s preso %s"
+msgstr "%s ci ha messo %s"
 
 #: cinelerra//pluginclient.C:825 cinelerra//pluginclient.C:837
 msgid "tweek"
@@ -5376,7 +5190,7 @@ msgstr "aggiungi effetto"
 
 #: cinelerra//plugindialog.C:311
 msgid "Plugins:"
-msgstr "Plugin:"
+msgstr "Plugins:"
 
 #: cinelerra//plugindialog.C:339
 msgid "Shared effects:"
@@ -5459,7 +5273,6 @@ msgstr "Presets ..."
 #: cinelerra//pluginprefs.C:57
 msgid "Plugin Set"
 msgstr "Plugin Set"
-#msgstr ""
 
 #: cinelerra//pluginprefs.C:59
 msgid "Look for global plugins here"
@@ -5488,7 +5301,6 @@ msgstr "Preferenze..."
 #: cinelerra//preferencesthread.C:69
 msgid "Shift-P"
 msgstr "Shift-P"
-#msgstr ""
 
 #: cinelerra//preferencesthread.C:318
 msgid "*Playback A"
@@ -5530,7 +5342,6 @@ msgstr "Preferenze"
 #, c-format
 msgid ": %s Presets"
 msgstr ": %s Presets"
-#msgstr ""
 
 #: cinelerra//presetsgui.C:219
 msgid "apply preset"
@@ -5609,7 +5420,7 @@ msgstr "Attiva"
 msgid ""
 "Make the highlighted\n"
 "clip active."
-msgstr "Creare spezzone attivo\n"
+msgstr "Attivare spezzone\n"
 "evidenziato."
 
 #: cinelerra//record.C:85
@@ -5697,7 +5508,6 @@ msgstr "Etich. prec:"
 #: cinelerra//recordgui.C:294
 msgid "File Capture"
 msgstr "File Capture"
-#msgstr ""
 
 #: cinelerra//recordgui.C:332
 msgid "Batches:"
@@ -5706,7 +5516,6 @@ msgstr "In batch:"
 #: cinelerra//recordgui.C:348
 msgid "Cron:"
 msgstr "Cron:"
-#msgstr ""
 
 #: cinelerra//recordgui.C:351 cinelerra//recordgui.C:983
 msgid "Idle"
@@ -5746,7 +5555,7 @@ msgstr "Riempire cornici underrun"
 
 #: cinelerra//recordgui.C:672
 msgid "Write extra frames when behind."
-msgstr "Scrivi fotogrammi supplementari in dietro."
+msgstr "Scrivi fotogrammi supplementari se in ritardo."
 
 #: cinelerra//recordgui.C:692
 msgid "poweroff when done"
@@ -5766,12 +5575,11 @@ msgstr "Verificare la presenza di spot pubblicitari."
 
 #: cinelerra//recordgui.C:744
 msgid "Monitor video"
-msgstr "Video Monitor"
+msgstr "Monitor video"
 
 #: cinelerra//recordgui.C:784
 msgid "Monitor audio"
 msgstr "Monitor audio"
-#msgstr ""
 
 #: cinelerra//recordgui.C:821
 msgid "Audio meters"
@@ -5788,7 +5596,6 @@ msgstr "Etichetta"
 #: cinelerra//recordgui.C:1017
 msgid "ClrLbls"
 msgstr "ClrLbls"
-#msgstr ""
 
 #: cinelerra//recordgui.C:1066
 msgid "Interrupt recording in progress?"
@@ -5804,13 +5611,12 @@ msgstr ": Video"
 
 #: cinelerra//recordmonitor.C:350
 msgid "00:00:00:00"
-msgstr "00: 00: 00: 00"
+msgstr "00:00:00:00"
 
 #: cinelerra//recordmonitor.C:645
 #, c-format
 msgid ": Video in %d%%"
 msgstr ": Video in %d%%"
-#msgstr ""
 
 #: cinelerra//recordmonitor.C:715 cinelerra//vdeviceprefs.C:285
 msgid "Swap fields"
@@ -5846,7 +5652,7 @@ msgstr "Ingresso video"
 
 #: cinelerra//recordprefs.C:192
 msgid "Frames to record to disk at a time:"
-msgstr "Frame da scrivere sul disco alla volta:"
+msgstr "Frame da registrare sul disco alla volta:"
 
 #: cinelerra//recordprefs.C:197
 msgid "Frames to buffer in device:"
@@ -5858,11 +5664,11 @@ msgstr "Posizionamento:"
 
 #: cinelerra//recordprefs.C:215
 msgid "Size of captured frame:"
-msgstr "Dim.ne frame catturato:"
+msgstr "Dimensione frame catturato:"
 
 #: cinelerra//recordprefs.C:228
 msgid "Frame rate for recording:"
-msgstr "Freq.fotogr. registrazione:"
+msgstr "Freq. fotogr. registrazione:"
 
 #: cinelerra//recordprefs.C:294
 msgid "Record in realtime priority (root only)"
@@ -5871,7 +5677,6 @@ msgstr "Record di priorità in tempo reale (solo root)"
 #: cinelerra//recordprefs.C:334
 msgid "Realtime TOC"
 msgstr "Realtime TOC"
-#msgstr ""
 
 #: cinelerra//recordprefs.C:494
 msgid "Presentation Timestamps"
@@ -5934,7 +5739,7 @@ msgstr "Anteprima registrazione"
 
 #: cinelerra//recordtransport.C:251
 msgid "Stop operation"
-msgstr "ferma operazione"
+msgstr "Ferma operazione"
 
 #: cinelerra//recordtransport.C:300
 msgid "Start over"
@@ -5971,7 +5776,6 @@ msgstr "Ridisegna tutti gli indici per il progetto corrente?"
 #: cinelerra//remotecontrol.C:11
 msgid ": RemoteWindow"
 msgstr ": RemoteWindow"
-#msgstr ""
 
 #: cinelerra//render.C:85
 msgid "Render..."
@@ -5980,13 +5784,11 @@ msgstr "Elabora..."
 #: cinelerra//render.C:85
 msgid "Shift-R"
 msgstr "Shift-R"
-#msgstr ""
 
 #: cinelerra//render.C:212
 #, c-format
 msgid "\r%d%% ETA: %s      "
 msgstr "\r%d%% ETA: %s      "
-#msgstr ""
 
 #: cinelerra//render.C:277
 msgid "Already rendering"
@@ -6025,7 +5827,6 @@ msgstr "elabora"
 #: cinelerra//render.C:1112
 msgid ": Render"
 msgstr ": Render"
-#msgstr ""
 
 #: cinelerra//render.C:1160
 msgid "Render range:"
@@ -6045,7 +5846,7 @@ msgstr "Punti Ing/Usc"
 
 #: cinelerra//renderfarm.C:160
 msgid "RenderFarmServerThread::start_loop: socket\n"
-msgstr "RenderFarmServerThread::start_loop: presa\n"
+msgstr "RenderFarmServerThread::start_loop: socket\n"
 
 #: cinelerra//renderfarm.C:184 cinelerra//renderfarm.C:225
 #, c-format
@@ -6054,7 +5855,7 @@ msgstr "RenderFarmServerThread::start_loop: %s: %s\n"
 
 #: cinelerra//renderfarm.C:202
 msgid "RenderFarmServerThread::start_loop: socket"
-msgstr "RenderFarmServerThread::start_loop: presa"
+msgstr "RenderFarmServerThread::start_loop: socket"
 
 #: cinelerra//renderfarm.C:215
 #, c-format
@@ -6068,7 +5869,7 @@ msgstr "RenderFarmServerThread::run: richiesta sconosciuta %02x\n"
 
 #: cinelerra//renderfarmclient.C:115 cinelerra//renderfarmclient.C:140
 msgid "RenderFarmClient::main_loop: socket"
-msgstr "RenderFarmClient::main_loop: presa"
+msgstr "RenderFarmClient::main_loop: socket"
 
 #: cinelerra//renderfarmclient.C:124
 #, c-format
@@ -6128,7 +5929,7 @@ msgstr "Dimensione:"
 #: cinelerra//resizetrackthread.C:136 cinelerra//resizetrackthread.C:162
 #: plugins/compressor/compressor.C:886 plugins/scale/scalewin.C:68
 msgid "x"
-msgstr "X"
+msgstr "x"
 
 #: cinelerra//resizetrackthread.C:155 plugins/pitch/pitch.C:418
 #: plugins/scale/scalewin.C:50
@@ -6138,12 +5939,11 @@ msgstr "Scala:"
 #: cinelerra//resizetrackthread.C:359 cinelerra//scale.C:90
 msgid "Resize"
 msgstr "Resize"
-#msgstr ""
 
 #: cinelerra//resourcepixmap.C:641
 #, c-format
 msgid "ResourcePixmap::draw_audio_source: failed to check out %s for drawing.\n"
-msgstr "ResourcePixmap::draw_audio_source: non è riuscito a controllare %s per il disegno.\n"
+msgstr "ResourcePixmap::draw_audio_source: checkout disegno di %s non riuscito.\n"
 
 #: cinelerra//savefile.C:49
 msgid "Save backup"
@@ -6194,16 +5994,15 @@ msgstr "Dimensione proiettore Nuovo:"
 
 #: cinelerra//scale.C:230 cinelerra//scale.C:234 cinelerra//setformat.C:439
 msgid "W Ratio:"
-msgstr "Dim. W:"
+msgstr "Rapporto L:"
 
 #: cinelerra//scale.C:240 cinelerra//scale.C:244 cinelerra//setformat.C:448
 msgid "H Ratio:"
-msgstr "Dim. H:"
+msgstr "Rapporto A:"
 
 #: cinelerra//scale.C:276 cinelerra//setformat.C:482
 msgid ":"
 msgstr ":"
-#msgstr ""
 
 #: cinelerra//scale.C:363 plugins/scale/scalewin.C:232
 msgid "Constrain ratio"
@@ -6216,7 +6015,6 @@ msgstr "Dati Scale"
 #: cinelerra//scale.C:383 cinelerra//setformat.C:853
 msgid "Auto"
 msgstr "Auto"
-#msgstr ""
 
 #: cinelerra//setformat.C:50
 msgid "Format..."
@@ -6225,7 +6023,6 @@ msgstr "Formato..."
 #: cinelerra//setformat.C:50
 msgid "Shift-F"
 msgstr "Shift-F"
-#msgstr ""
 
 #: cinelerra//setformat.C:166
 msgid "set format"
@@ -6293,7 +6090,6 @@ msgstr "Annulla operazione"
 #, c-format
 msgid "Subttl %d"
 msgstr "Subttl %d"
-#msgstr ""
 
 #: cinelerra//swindow.C:106
 msgid "Load"
@@ -6345,7 +6141,6 @@ msgstr "Adding Subtitles: quick \"How To\" (= or * indicates comment)\n"
 "== A new entry is here for illustration purposes.\n"
 "*  Entry 2\n"
 "This is the second entry.\n"
-#msgstr ""
 
 #: cinelerra//swindow.C:234
 msgid ": Subtitle"
@@ -6366,17 +6161,14 @@ msgid ""
 "%s"
 msgstr "cannot open: \"%s\"\n"
 "%s"
-#msgstr ""
 
 #: cinelerra//swindow.C:977
 msgid "SubTitle..."
 msgstr "SubTitle..."
-#msgstr ""
 
 #: cinelerra//swindow.C:977
 msgid "Alt-y"
 msgstr "Alt-y"
-#msgstr ""
 
 #: cinelerra//threadindexer.C:91
 #, c-format
@@ -6521,13 +6313,11 @@ msgstr "Durata"
 
 #: cinelerra//vdevicebuz.C:331
 msgid "Composite"
-msgstr "Composite"
-#msgstr ""
+msgstr "Composito"
 
 #: cinelerra//vdevicebuz.C:332
 msgid "S-Video"
 msgstr "S-Video"
-#msgstr ""
 
 #: cinelerra//vdevicelml.C:269
 #, c-format
@@ -6558,7 +6348,6 @@ msgstr "Schermo:"
 #: cinelerra//vdeviceprefs.C:478
 msgid "Default A Display:"
 msgstr "Default A Display:"
-#msgstr ""
 
 #: cinelerra//vdeviceprefs.C:481
 msgid "Default B Display:"
@@ -6583,7 +6372,6 @@ msgstr "Bilineare / bilineare"
 #: cinelerra//vdeviceprefs.C:750
 msgid "Lanczos / Lanczos"
 msgstr "Lanczos / Lanczos"
-#msgstr ""
 
 #: cinelerra//videowindowgui.C:35
 msgid ": Video out"
@@ -6635,13 +6423,11 @@ msgstr "Rimpiazza"
 #: cinelerra//vpatchgui.C:351 plugins/overlay/overlay.C:159
 msgid "Max"
 msgstr "Max"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:352 plugins/cdripper/cdripwindow.C:44
 #: plugins/cdripper/cdripwindow.C:48 plugins/overlay/overlay.C:160
 msgid "Min"
 msgstr "Min"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:353 plugins/denoiseseltempavg/seltempavgwindow.C:87
 #: plugins/overlay/overlay.C:161 plugins/timeavg/timeavgwindow.C:208
@@ -6659,52 +6445,42 @@ msgstr "Alleggerire"
 #: cinelerra//vpatchgui.C:356 plugins/overlay/overlay.C:164
 msgid "Dst"
 msgstr "Dst"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:357 plugins/overlay/overlay.C:165
 msgid "DstAtop"
 msgstr "DstAtop"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:358 plugins/overlay/overlay.C:166
 msgid "DstIn"
 msgstr "DstIn"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:359 plugins/overlay/overlay.C:167
 msgid "DstOut"
 msgstr "DstOut"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:360 plugins/overlay/overlay.C:168
 msgid "DstOver"
 msgstr "DstOver"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:361 plugins/overlay/overlay.C:169
 msgid "Src"
 msgstr "Src"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:362 plugins/overlay/overlay.C:170
 msgid "SrcAtop"
 msgstr "SrcAtop"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:363 plugins/overlay/overlay.C:171
 msgid "SrcIn"
 msgstr "SrcIn"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:364 plugins/overlay/overlay.C:172
 msgid "SrcOut"
 msgstr "SrcOut"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:365 plugins/overlay/overlay.C:173
 msgid "SrcOver"
 msgstr "SrcOver"
-#msgstr ""
 
 #: cinelerra//vpatchgui.C:366 plugins/overlay/overlay.C:174
 msgid "Or"
@@ -6713,13 +6489,11 @@ msgstr "O"
 #: cinelerra//vpatchgui.C:367 plugins/overlay/overlay.C:175
 msgid "Xor"
 msgstr "Xor"
-#msgstr ""
 
 #: cinelerra//vtrack.C:116
 #, c-format
 msgid "Video %d"
 msgstr "Video %d"
-#msgstr ""
 
 #: cinelerra//vwindow.C:98 cinelerra//vwindow.C:284
 msgid "Viewer"
@@ -6729,7 +6503,6 @@ msgstr "Visualizzatore"
 #, c-format
 msgid ": Viewer"
 msgstr ": Viewer"
-#msgstr ""
 
 #: cinelerra//vwindowgui.C:711
 #, c-format
@@ -6784,7 +6557,6 @@ msgstr "Dissolv. Video:"
 #: cinelerra//zoombar.C:474
 msgid "Zoom:"
 msgstr "Zoom:"
-#msgstr ""
 
 #: cinelerra//zoombar.C:475 plugins/titler/titlewindow.C:309
 msgid "Speed:"
@@ -6792,7 +6564,7 @@ msgstr "Velocità:"
 
 #: cinelerra//zoombar.C:506
 msgid "Automation range"
-msgstr "Scalatura automatica"
+msgstr "Intervallo automazione"
 
 #: cinelerra//zoombar.C:566
 msgid "Selection start time"
@@ -6864,7 +6636,6 @@ msgstr "L'aumento Trigger"
 #: plugins/audioscope/audioscope.C:319
 msgid "Falling Trigger"
 msgstr "Falling Trigger"
-#msgstr ""
 
 #: plugins/audioscope/audioscope.C:373
 msgid "History Size:"
@@ -6908,7 +6679,6 @@ msgstr "Livello 1: %.2f"
 #: plugins/audioscope/audioscope.C:664
 msgid "AudioScope"
 msgstr "AudioScope"
-#msgstr ""
 
 #: plugins/bandslide/bandslide.C:77 plugins/bandwipe/bandwipe.C:77
 #: plugins/irissquare/irissquare.C:49 plugins/slide/slide.C:94
@@ -6942,7 +6712,6 @@ msgstr "SchiaraBande"
 #: plugins/bluebanana/bluebanana.C:87
 msgid "Blue Banana"
 msgstr "Blue Banana"
-#msgstr ""
 
 #: plugins/bluebanana/bluebananalookups.C:64
 #: plugins/bluebanana/bluebananalookups.C:72
@@ -6966,7 +6735,7 @@ msgstr "Seleziona"
 
 #: plugins/bluebanana/bluebananawindow.C:1757
 msgid " End Mask"
-msgstr "Fine Mask"
+msgstr "Maschera Finale"
 
 #: plugins/bluebanana/bluebananawindow.C:1840
 msgid " Mask Selection"
@@ -7066,7 +6835,6 @@ msgstr "Sfocatura blu"
 #: plugins/blurzoom/blurzoom.C:63
 msgid "RadioacTV"
 msgstr "RadioacTV"
-#msgstr ""
 
 #: plugins/brightness/brightness.C:96 plugins/brightness/brightnesswindow.C:52
 msgid "Brightness/Contrast"
@@ -7078,13 +6846,13 @@ msgstr "Incrementa solo la luminosità"
 
 #: plugins/burn/burn.C:79
 msgid "BurningTV"
-msgstr "BruciatoTV"
+msgstr "BurningTV"
 
 #: plugins/burn/burnwindow.C:54
 msgid ""
 "BurningTV from EffectTV\n"
 "Copyright (C) 2001 FUKUCHI Kentarou"
-msgstr "BruciatoTV da EffectTV\n"
+msgstr "BurningTV da EffectTV\n"
 "Copyright (C) 2001 FUKUCHI Kentarou"
 
 #: plugins/C41/c41.C:240 plugins/colorbalance/colorbalancewindow.C:150
@@ -7109,17 +6877,15 @@ msgstr "Valori negfix calcolati:"
 
 #: plugins/C41/c41.C:283 plugins/C41/c41.C:314
 msgid "Min R:"
-msgstr "R Min:"
+msgstr "Min R:"
 
 #: plugins/C41/c41.C:287 plugins/C41/c41.C:318
 msgid "Min G:"
 msgstr "Min G:"
-#msgstr ""
 
 #: plugins/C41/c41.C:291 plugins/C41/c41.C:322
 msgid "Min B:"
 msgstr "Min B:"
-#msgstr ""
 
 #: plugins/C41/c41.C:295 plugins/C41/c41.C:326
 msgid "Light:"
@@ -7128,12 +6894,10 @@ msgstr "Luce:"
 #: plugins/C41/c41.C:299 plugins/C41/c41.C:330
 msgid "Gamma G:"
 msgstr "Gamma G:"
-#msgstr ""
 
 #: plugins/C41/c41.C:303 plugins/C41/c41.C:334
 msgid "Gamma B:"
 msgstr "Gamma B:"
-#msgstr ""
 
 #: plugins/C41/c41.C:311
 msgid "negfix values to apply:"
@@ -7142,11 +6906,10 @@ msgstr "valori negfix da applicare"
 #: plugins/C41/c41.C:379
 msgid "C41"
 msgstr "C41"
-#msgstr ""
 
 #: plugins/cdripper/cdripper.C:53
 msgid "CD Ripper"
-msgstr "Estrai CD"
+msgstr "Estrattore CD"
 
 #: plugins/cdripper/cdripper.C:127 plugins/cdripper/cdripper.C:159
 #: plugins/cdripper/cdripper.C:175 plugins/cdripper/cdripper.C:191
@@ -7154,7 +6917,6 @@ msgstr "Estrai CD"
 #: plugins/cdripper/cdripper.C:236 plugins/cdripper/cdripwindow.C:29
 msgid ": CD Ripper"
 msgstr ": CD Ripper"
-#msgstr ""
 
 #: plugins/cdripper/cdripper.C:130
 msgid "Can't open cdrom drive."
@@ -7196,7 +6958,7 @@ msgstr "Traccia"
 
 #: plugins/cdripper/cdripwindow.C:45 plugins/cdripper/cdripwindow.C:49
 msgid "Sec"
-msgstr "Seg"
+msgstr "Sec"
 
 #: plugins/cdripper/cdripwindow.C:66
 msgid "From"
@@ -7204,15 +6966,15 @@ msgstr "Da"
 
 #: plugins/cdripper/cdripwindow.C:68
 msgid "To"
-msgstr "per"
+msgstr "A"
 
 #: plugins/cdripper/cdripwindow.C:71
 msgid "CD Device:"
-msgstr "Dispositivo del CD:"
+msgstr "Dispositivo CD:"
 
 #: plugins/chromakey/chromakey.C:136 plugins/diffkey/diffkey.C:298
 msgid "Slope:"
-msgstr "Inclina:"
+msgstr "pendenza:"
 
 #: plugins/chromakey/chromakey.C:140 plugins/denoisevideo/denoisevideo.C:256
 #: plugins/diffkey/diffkey.C:293 plugins/histogram/histogramwindow.C:260
@@ -7245,7 +7007,7 @@ msgstr "Chiave cromatica"
 
 #: plugins/chromakeyhsv/chromakey.C:196
 msgid "Key parameters:"
-msgstr "Chiave Parametri:"
+msgstr "Parametri Chiave:"
 
 #: plugins/chromakeyhsv/chromakey.C:198
 msgid "Hue Tolerance:"
@@ -7273,11 +7035,11 @@ msgstr "Maschera distorsione:"
 
 #: plugins/chromakeyhsv/chromakey.C:218
 msgid "In Slope:"
-msgstr "Salita:"
+msgstr "Pendenza in entrata:"
 
 #: plugins/chromakeyhsv/chromakey.C:221
 msgid "Out Slope:"
-msgstr "Discesa:"
+msgstr "Pendensa in uscita:"
 
 #: plugins/chromakeyhsv/chromakey.C:224
 msgid "Alpha Offset:"
@@ -7285,15 +7047,15 @@ msgstr "Compensa Alpha:"
 
 #: plugins/chromakeyhsv/chromakey.C:232
 msgid "Spill light control:"
-msgstr "Controllo puntini luminosi"
+msgstr "Riverso controlli luminosi"
 
 #: plugins/chromakeyhsv/chromakey.C:234
 msgid "Spill Threshold:"
-msgstr "Soglia Puntini:"
+msgstr "Soglia Riverso:"
 
 #: plugins/chromakeyhsv/chromakey.C:237
 msgid "Spill Compensation:"
-msgstr "Compensazione Puntini"
+msgstr "Compensazione Riverso"
 
 #: plugins/chromakeyhsv/chromakey.C:450
 msgid "Show Mask"
@@ -7305,7 +7067,7 @@ msgstr "Chiave Cromatica (HSV)"
 
 #: plugins/color3way/color3way.C:385
 msgid "Color 3 Way"
-msgstr "Colore 3 Way"
+msgstr "Color 3 Way"
 
 #: plugins/color3way/color3way.C:607 plugins/color3way/color3way.C:614
 #: plugins/colorbalance/colorbalance.C:582
@@ -7324,7 +7086,6 @@ msgstr "Interpolare Punti"
 #: plugins/interpolate/interpolate.C:255
 msgid "Gamma"
 msgstr "Gamma"
-#msgstr ""
 
 #: plugins/color3way/color3waywindow.C:136
 msgid "Shadows"
@@ -7367,7 +7128,6 @@ msgstr "Ciano"
 #: plugins/colorbalance/colorbalancewindow.C:60
 msgid "Magenta"
 msgstr "Magenta"
-#msgstr ""
 
 #: plugins/colorbalance/colorbalancewindow.C:64
 msgid "Yellow"
@@ -7403,8 +7163,7 @@ msgstr "Ingresso"
 
 #: plugins/compressor/compressor.C:1370 plugins/compressor/compressor.C:1375
 msgid "Trigger"
-msgstr "Trigger"
-#msgstr ""
+msgstr "Scatto"
 
 #: plugins/compressor/compressor.C:1371 plugins/piano/piano.C:1113
 #: plugins/synthesizer/synthesizer.C:1673
@@ -7430,7 +7189,7 @@ msgstr "Fotogramma in ingresso al secondo:"
 
 #: plugins/decimate/decimate.C:257
 msgid "Last frame dropped: "
-msgstr "Ultimo fotogramma aggiunto:"
+msgstr "Ultimo fotogramma rimosso:"
 
 #: plugins/decimate/decimate.C:747
 msgid "Decimate"
@@ -7496,11 +7255,11 @@ msgstr "Tieni aree inferiori"
 
 #: plugins/deinterlace-cv/deinterwindow-cv.C:93
 msgid "Average top fields"
-msgstr "Media campi superiori"
+msgstr "Media aree superiori"
 
 #: plugins/deinterlace-cv/deinterwindow-cv.C:95
 msgid "Average bottom fields"
-msgstr "Media campi in basso"
+msgstr "Media aree in basso"
 
 #: plugins/deinterlace-cv/deinterwindow-cv.C:99
 #: plugins/deinterlace-cv/deinterwindow-cv.C:105
@@ -7523,15 +7282,15 @@ msgstr "Adattativo"
 
 #: plugins/deinterlace-cv/deinterwindow-cv.C:261
 msgid "Duplicate one field"
-msgstr "Duplica un area"
+msgstr "Duplica unarea"
 
 #: plugins/deinterlace-cv/deinterwindow-cv.C:263
 msgid "Average one field"
-msgstr "Media un area"
+msgstr "Media una sola area"
 
 #: plugins/deinterlace-cv/deinterwindow-cv.C:265
 msgid "Average both fields"
-msgstr "Media due aree"
+msgstr "Media entrambe aree"
 
 #: plugins/deinterlace-cv/deinterwindow-cv.C:267
 msgid "Bob & Weave"
@@ -7633,7 +7392,7 @@ msgstr "Media Temporale Selettiva"
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:50
 msgid "Frames to average"
-msgstr "Media Fotogrammi"
+msgstr "Fotogrammi da calc. media"
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:55
 msgid "Use Method:"
@@ -7658,25 +7417,22 @@ msgstr "Soglia S.D."
 #: plugins/denoiseseltempavg/seltempavgwindow.C:69
 msgid "R / Y"
 msgstr "R / Y"
-#msgstr ""
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:75
 msgid "G / U"
 msgstr "G / U"
-#msgstr ""
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:81
 msgid "B / V"
 msgstr "B / V"
-#msgstr ""
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:89
 msgid "Standard Deviation"
-msgstr "Scarto quadratico medio"
+msgstr "Deviazione Standard"
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:92
 msgid "First frame in average:"
-msgstr "Primo frame nella media"
+msgstr "Primo fotogramma in media"
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:94
 msgid "Fixed offset: "
@@ -7688,11 +7444,11 @@ msgstr "Riavvia sistema marcatori:"
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:106
 msgid "Other Options:"
-msgstr "Altre Opzioni"
+msgstr "Altre Opzioni:"
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:273
 msgid "Reprocess frame again"
-msgstr "Riprocessa il frame nuovamente"
+msgstr "Riprocessa il fotogramma nuovamente"
 
 #: plugins/denoiseseltempavg/seltempavgwindow.C:287
 msgid "Disable subtraction"
@@ -7745,7 +7501,6 @@ msgstr "Dissolvenza"
 #: plugins/dot/dot.C:82
 msgid "DotTV"
 msgstr "DotTV"
-#msgstr ""
 
 #: plugins/dot/dotwindow.C:50
 msgid ""
@@ -7764,7 +7519,7 @@ msgstr "Compensazione verticale"
 
 #: plugins/downsample/downsample.C:376 plugins/reframert/reframert.C:294
 msgid "Downsample"
-msgstr "Ricampiona"
+msgstr "Riduci campionamento"
 
 #: plugins/echo/echo.C:145
 msgid "Level: "
@@ -7793,7 +7548,6 @@ msgstr "UOMO"
 #: plugins/echocancel/echocancel.C:164
 msgid "OFF"
 msgstr "OFF"
-#msgstr ""
 
 #: plugins/echocancel/echocancel.C:212
 msgid "default"
@@ -7821,11 +7575,10 @@ msgstr "Storia:"
 #: plugins/echocancel/echocancel.C:483 plugins/spectrogram/spectrogram.C:471
 msgid "X Zoom:"
 msgstr "X Zoom:"
-#msgstr ""
 
 #: plugins/echocancel/echocancel.C:488 plugins/freeverb/freeverb.C:318
 msgid "Damp:"
-msgstr "Nebbia:"
+msgstr "Umido:"
 
 #: plugins/echocancel/echocancel.C:492
 msgid "Cutoff Hz:"
@@ -7838,12 +7591,10 @@ msgstr "picchi"
 #: plugins/echocancel/echocancel.C:501
 msgid "0 Hz"
 msgstr "0 Hz"
-#msgstr ""
 
 #: plugins/echocancel/echocancel.C:723
 msgid "EchoCancel"
 msgstr "EchoCancel"
-#msgstr ""
 
 #: plugins/edge/edge.C:80
 msgid "Edge"
@@ -7855,7 +7606,7 @@ msgstr "Ammontare:"
 
 #: plugins/fieldframe/fieldframe.C:335
 msgid "Fields to frames"
-msgstr "Campi per Fotogramma"
+msgstr "Campi a Fotogrammi"
 
 #: plugins/findobject/findobject.C:199
 msgid "Find Object"
@@ -7893,11 +7644,11 @@ msgstr "Blocco Y:"
 
 #: plugins/findobject/findobjectwindow.C:145
 msgid "Object layer:"
-msgstr "Uscita livello:"
+msgstr "Livello oggetto:"
 
 #: plugins/findobject/findobjectwindow.C:154
 msgid "Replacement object layer:"
-msgstr "Sostituisci il progetto corrente"
+msgstr "Sostituisci livello oggetto:"
 
 #: plugins/findobject/findobjectwindow.C:163
 msgid "Output/scene layer:"
@@ -7905,26 +7656,23 @@ msgstr "Uscita livello:"
 
 #: plugins/findobject/findobjectwindow.C:173
 msgid "Object blend amount:"
-msgstr "Scala in percentuale:"
+msgstr "Quantità miscela oggetti:"
 
 #: plugins/findobject/findobjectwindow.C:181
 msgid "Camshift VMIN:"
 msgstr "Camshift VMIN:"
-#msgstr ""
 
 #: plugins/findobject/findobjectwindow.C:188
 msgid "Camshift VMAX:"
 msgstr "Camshift VMAX:"
-#msgstr ""
 
 #: plugins/findobject/findobjectwindow.C:195
 msgid "Camshift SMIN:"
 msgstr "Camshift SMIN:"
-#msgstr ""
 
 #: plugins/findobject/findobjectwindow.C:337
 msgid "Draw border"
-msgstr "Disegna vettori"
+msgstr "Disegna bordi"
 
 #: plugins/findobject/findobjectwindow.C:362
 msgid "Draw keypoints"
@@ -7932,11 +7680,11 @@ msgstr "Disegna cardine"
 
 #: plugins/findobject/findobjectwindow.C:385
 msgid "Replace object"
-msgstr "Sostituisci il progetto corrente"
+msgstr "Sostituisci oggetto"
 
 #: plugins/findobject/findobjectwindow.C:410
 msgid "Draw object border"
-msgstr "Disegna vettori"
+msgstr "Disegna bordo oggetti"
 
 #: plugins/findobject/findobjectwindow.C:496
 #: plugins/findobject/findobjectwindow.C:510 plugins/motion/motionwindow.C:1052
@@ -7951,23 +7699,20 @@ msgstr "Non Calcolare"
 #: plugins/findobject/findobjectwindow.C:513
 msgid "SURF"
 msgstr "SURF"
-#msgstr ""
 
 #: plugins/findobject/findobjectwindow.C:500
 #: plugins/findobject/findobjectwindow.C:520
 msgid "CAMSHIFT"
 msgstr "CAMSHIFT"
-#msgstr ""
 
 #: plugins/findobject/findobjectwindow.C:501
 #: plugins/findobject/findobjectwindow.C:516
 msgid "Blob"
 msgstr "Blob"
-#msgstr ""
 
 #: plugins/flash/flash.C:45
 msgid "Flash"
-msgstr "Veloce"
+msgstr "Flash"
 
 #: plugins/flip/flip.C:88
 msgid "Flip"
@@ -7982,7 +7727,6 @@ msgstr "Fotogrammi > Settori"
 #: plugins/rgb601/rgb601.C:54
 msgid "RGB - 601"
 msgstr "RGB - 601"
-#msgstr ""
 
 #: plugins/freeverb/freeverb.C:273
 msgid "Freeze"
@@ -8003,7 +7747,6 @@ msgstr "Asciutto:"
 #: plugins/freeverb/freeverb.C:459
 msgid "Freeverb"
 msgstr "Freeverb"
-#msgstr ""
 
 #: plugins/freezeframe/freezeframe.C:157
 msgid "Freeze Frame"
@@ -8072,7 +7815,6 @@ msgstr "Radiale"
 #: plugins/gradient/gradient.C:439 plugins/timefront/timefront.C:511
 msgid "Log"
 msgstr "Log"
-#msgstr ""
 
 #: plugins/gradient/gradient.C:441 plugins/piano/piano.C:694
 #: plugins/piano/piano.C:947 plugins/synthesizer/synthesizer.C:1019
@@ -8107,7 +7849,7 @@ msgstr "EQ grafica"
 
 #: plugins/greycstoration/greycstorationplugin.C:96
 msgid "GreyCStoration"
-msgstr "GREYCstoration"
+msgstr "GreyCStoration"
 
 #: plugins/greycstoration/greycstorationwindow.C:44 plugins/wave/wave.C:399
 msgid "Amplitude:"
@@ -8115,7 +7857,7 @@ msgstr "Ampiezza:"
 
 #: plugins/greycstoration/greycstorationwindow.C:52
 msgid "Anisotropy:"
-msgstr "Anisotropia:"
+msgstr "Anisotropia"
 
 #: plugins/greycstoration/greycstorationwindow.C:56
 msgid "Noise scale:"
@@ -8128,7 +7870,6 @@ msgstr "RGB Parade"
 #: plugins/histogram/histogramwindow.C:593
 msgid "RGB Parade off"
 msgstr "RGB Parade off"
-#msgstr ""
 
 #: plugins/histogram/histogramwindow.C:973
 msgid "Split output"
@@ -8137,7 +7878,6 @@ msgstr "Uscita Separata"
 #: plugins/histogram_bezier/bistogram.C:81
 msgid "Histogram Bezier"
 msgstr "Histogram Bezier"
-#msgstr ""
 
 #: plugins/histogram_bezier/bistogramwindow.C:91
 msgid "Input X:"
@@ -8170,12 +7910,10 @@ msgstr "Polinomio"
 #: plugins/histogram_bezier/bistogramwindow.C:1020
 msgid "Bezier"
 msgstr "Bezier"
-#msgstr ""
 
 #: plugins/holo/holo.C:83
 msgid "HolographicTV"
 msgstr "HolographicTV"
-#msgstr ""
 
 #: plugins/huesaturation/huesaturation.C:571
 msgid "Hue saturation"
@@ -8251,19 +7989,19 @@ msgstr "IrisQuadrato"
 
 #: plugins/ivtc/ivtc.C:36 plugins/ivtc/ivtcwindow.C:32
 msgid "A  B  BC  CD  D"
-msgstr "A B BC CD D"
+msgstr "A  B  BC  CD  D"
 
 #: plugins/ivtc/ivtc.C:37 plugins/ivtc/ivtcwindow.C:33
 msgid "AB  BC  CD  DE  EF"
-msgstr "AB BC CD DE EF"
+msgstr "AB  BC  CD  DE  EF"
 
 #: plugins/ivtc/ivtcwindow.C:62
 msgid "Pattern offset:"
-msgstr "Regola modello:"
+msgstr "Offset Motivo:"
 
 #: plugins/ivtc/ivtcwindow.C:70
 msgid "Pattern:"
-msgstr "Modello:"
+msgstr "Motivo:"
 
 #: plugins/ivtc/ivtcwindow.C:137
 msgid "Automatic IVTC"
@@ -8292,19 +8030,19 @@ msgstr "Stira"
 
 #: plugins/lens/lens.C:493
 msgid "R Field of View:"
-msgstr "Compensa aggiustato:"
+msgstr "Campo visivo R:"
 
 #: plugins/lens/lens.C:494
 msgid "G Field of View:"
-msgstr "Compensa aggiustato:"
+msgstr "Campo visivo G:"
 
 #: plugins/lens/lens.C:495
 msgid "B Field of View:"
-msgstr "Compensa aggiustato:"
+msgstr "Campo visivo B:"
 
 #: plugins/lens/lens.C:496
 msgid "A Field of View:"
-msgstr "Compensa aggiustato:"
+msgstr "Campo visivo A:"
 
 #: plugins/lens/lens.C:523
 msgid "Lock"
@@ -8312,11 +8050,11 @@ msgstr "Bloccato"
 
 #: plugins/lens/lens.C:530
 msgid "Aspect Ratio:"
-msgstr "Dimensione:"
+msgstr "Rapporto Lung/Altezza"
 
 #: plugins/lens/lens.C:630
 msgid "Draw center"
-msgstr "Disegna vettori"
+msgstr "Disegna centro"
 
 #: plugins/lens/lens.C:696
 msgid "Lens"
@@ -8340,7 +8078,7 @@ msgstr "Livello sonoro"
 
 #: plugins/linearblur/linearblur.C:282 plugins/motionblur/motionblur.C:251
 msgid "Length:"
-msgstr "Compressione:"
+msgstr "Lunghezza:"
 
 #: plugins/linearblur/linearblur.C:290 plugins/motionblur/motionblur.C:255
 #: plugins/radialblur/radialblur.C:288 plugins/zoomblur/zoomblur.C:300
@@ -8353,7 +8091,7 @@ msgstr "Sfocatura Lineare"
 
 #: plugins/liveaudio/liveaudio.C:148
 msgid "Live audio"
-msgstr "Audio dal vivo"
+msgstr "Audio Live"
 
 #: plugins/liveaudio/liveaudio.C:377
 msgid "Live Audio"
@@ -8573,7 +8311,6 @@ msgstr "Entrambi"
 #: plugins/motion2point/motion.C:245
 msgid "Motion 2 Point"
 msgstr "Motion 2 Point"
-#msgstr ""
 
 #: plugins/motion2point/motionwindow.C:66
 msgid "Track Point 1"
@@ -8674,7 +8411,7 @@ msgstr "Sovarpposizione"
 
 #: plugins/overlayaudio/overlayaudio.C:202
 msgid "Output track:"
-msgstr "Pista di uscita:"
+msgstr "Traccia di Uscita:"
 
 #: plugins/parametric/parametric.C:275
 msgid "Lowpass"
@@ -8691,12 +8428,10 @@ msgstr "Passa banda"
 #: plugins/parametric/parametric.C:424
 msgid "Freq"
 msgstr "Freq"
-#msgstr ""
 
 #: plugins/parametric/parametric.C:425
 msgid "Qual"
 msgstr "Qual"
-#msgstr ""
 
 #: plugins/parametric/parametric.C:426 plugins/piano/piano.C:511
 #: plugins/piano/piano.C:569 plugins/synthesizer/synthesizer.C:573
@@ -8726,7 +8461,6 @@ msgstr "X attuale:"
 #: plugins/yuv/yuvwindow.C:43 plugins/zoomblur/zoomblur.C:292
 msgid "Y:"
 msgstr "Y:"
-#msgstr ""
 
 #: plugins/perspective/perspective.C:172 plugins/perspective/perspective.C:620
 msgid "Perspective"
@@ -8734,7 +8468,7 @@ msgstr "Prospettiva"
 
 #: plugins/perspective/perspective.C:178
 msgid "Sheer"
-msgstr "Sottile"
+msgstr "Puro"
 
 #: plugins/perspective/perspective.C:189
 msgid "Perspective direction:"
@@ -8763,7 +8497,6 @@ msgstr "/ Livello del nero Usa alpha"
 #: plugins/piano/piano.C:54
 msgid "Pianoesizer"
 msgstr "Pianoesizer"
-#msgstr ""
 
 #: plugins/piano/piano.C:512 plugins/piano/piano.C:571
 #: plugins/synthesizer/synthesizer.C:574 plugins/synthesizer/synthesizer.C:636
@@ -8787,7 +8520,6 @@ msgstr "Frequenza Base:"
 #, c-format
 msgid "DC"
 msgstr "DC"
-#msgstr ""
 
 #: plugins/piano/piano.C:692 plugins/piano/piano.C:945
 #: plugins/piano/piano.C:1234 plugins/piano/piano.C:1301
@@ -8804,7 +8536,7 @@ msgstr "Seno"
 #: plugins/synthesizer/synthesizer.C:1500
 #, c-format
 msgid "Sawtooth"
-msgstr "Dente di sega"
+msgstr "Sawtooth"
 
 #: plugins/piano/piano.C:695 plugins/piano/piano.C:948
 #: plugins/synthesizer/synthesizer.C:1020
@@ -8832,11 +8564,10 @@ msgstr "Disturbo"
 #: plugins/synthesizer/synthesizer.C:1848
 msgid "Zero"
 msgstr "Zero"
-#msgstr ""
 
 #: plugins/piano/piano.C:1169 plugins/synthesizer/synthesizer.C:1731
 msgid "Slope"
-msgstr "Discesa"
+msgstr "Pendenza"
 
 #: plugins/piano/piano.C:1192 plugins/piano/piano.C:1324
 #: plugins/piano/piano.C:1349 plugins/synthesizer/synthesizer.C:1755
@@ -8860,7 +8591,6 @@ msgstr "Dispari"
 #: plugins/piano/piano.C:1431 plugins/synthesizer/synthesizer.C:2005
 msgid "Fibonnacci"
 msgstr "Fibonnacci"
-#msgstr ""
 
 #: plugins/piano/piano.C:1455 plugins/synthesizer/synthesizer.C:2030
 msgid "Prime"
@@ -8876,7 +8606,7 @@ msgstr "Profondità:"
 
 #: plugins/polar/polar.C:285
 msgid "Polar"
-msgstr "Polarità"
+msgstr "Polare"
 
 #: plugins/polar/polarwindow.C:59
 msgid "Depth"
@@ -8896,7 +8626,6 @@ msgstr "Automatizzare"
 #: plugins/zoomblur/zoomblur.C:288
 msgid "X:"
 msgstr "X:"
-#msgstr ""
 
 #: plugins/radialblur/radialblur.C:383
 msgid "Radial Blur"
@@ -8944,7 +8673,7 @@ msgstr "rimpiazza Alpha"
 
 #: plugins/reroute/reroute.C:193
 msgid "Target track:"
-msgstr "Tracce condivise:"
+msgstr "Traccia Obiettivo:"
 
 #: plugins/reroute/reroute.C:202
 msgid "Operation:"
@@ -8957,7 +8686,6 @@ msgstr "Ridireziona"
 #: plugins/resample/resample.C:63
 msgid ": Resample"
 msgstr ": Resample"
-#msgstr ""
 
 #: plugins/resample/resample.C:128
 msgid "Resample"
@@ -8966,12 +8694,10 @@ msgstr "Ricampiona"
 #: plugins/resamplert/resamplert.C:186
 msgid "ResampleRT"
 msgstr "ResampleRT"
-#msgstr ""
 
 #: plugins/reverb/reverb.C:101
 msgid "Reverb"
 msgstr "Reverb"
-#msgstr ""
 
 #: plugins/reverb/reverb.C:425
 #, c-format
@@ -9040,11 +8766,11 @@ msgstr "Selezionare file del riverbero da caricare"
 
 #: plugins/reverseaudio/reverseaudio.C:170
 msgid "Reverse audio"
-msgstr "Audio Inverso"
+msgstr "Inverti Audio"
 
 #: plugins/reversevideo/reversevideo.C:178
 msgid "Reverse video"
-msgstr "Video Inverso"
+msgstr "Inverti Video"
 
 #: plugins/rgb601/rgb601window.C:55
 msgid "RGB -> 601 compression"
@@ -9057,37 +8783,30 @@ msgstr "601 -> RGB espanso"
 #: plugins/rgbshift/rgbshift.C:171
 msgid "R_dx:"
 msgstr "R_dx:"
-#msgstr ""
 
 #: plugins/rgbshift/rgbshift.C:174
 msgid "R_dy:"
 msgstr "R_dy:"
-#msgstr ""
 
 #: plugins/rgbshift/rgbshift.C:177
 msgid "G_dx:"
 msgstr "G_dx:"
-#msgstr ""
 
 #: plugins/rgbshift/rgbshift.C:180
 msgid "G_dy:"
 msgstr "G_dy:"
-#msgstr ""
 
 #: plugins/rgbshift/rgbshift.C:183
 msgid "B_dx:"
 msgstr "B_dx:"
-#msgstr ""
 
 #: plugins/rgbshift/rgbshift.C:186
 msgid "B_dy:"
 msgstr "B_dy:"
-#msgstr ""
 
 #: plugins/rgbshift/rgbshift.C:211
 msgid "RGBShift"
 msgstr "RGBShift"
-#msgstr ""
 
 #: plugins/rotate/rotate.C:310
 msgid "Draw pivot"
@@ -9103,7 +8822,7 @@ msgstr "Gradi"
 
 #: plugins/rotate/rotate.C:510
 msgid "Pivot (x,y):"
-msgstr "Centro (x,y):"
+msgstr "Cardine(x,y):"
 
 #: plugins/scale/scalewin.C:202
 msgid "Use fixed scale"
@@ -9119,11 +8838,11 @@ msgstr "Bianco > Nero"
 
 #: plugins/shapewipe/shapewipe.C:73
 msgid "Black to White"
-msgstr "Nero > bianco"
+msgstr "Nero > Bianco"
 
 #: plugins/shapewipe/shapewipe.C:92
 msgid "Anti-aliasing"
-msgstr "Anti aliasing"
+msgstr "Anti-aliasing"
 
 #: plugins/shapewipe/shapewipe.C:109
 msgid "Preserve shape aspect ratio"
@@ -9183,7 +8902,6 @@ msgstr "Diapositiva"
 #: plugins/spectrogram/spectrogram.C:478
 msgid "Freq: 0 Hz"
 msgstr "Freq: 0 Hz"
-#msgstr ""
 
 #: plugins/spectrogram/spectrogram.C:484
 msgid "Amplitude: 0 dB"
@@ -9193,7 +8911,6 @@ msgstr "Ampiezza: 0 dB"
 #, c-format
 msgid "Freq: %d Hz"
 msgstr "Freq: %d Hz"
-#msgstr ""
 
 #: plugins/spectrogram/spectrogram.C:611
 #, c-format
@@ -9275,7 +8992,7 @@ msgstr "Aprire un file SVG esistente o crearne uno nuovo"
 #: plugins/swapchannels/swapchannels.C:102
 #: plugins/swapchannels/swapchannels.C:211
 msgid "Swap channels"
-msgstr "Rimpiazza canali"
+msgstr "Scambia canali"
 
 #: plugins/swapchannels/swapchannels.C:104
 msgid "-> Red"
@@ -9292,7 +9009,6 @@ msgstr "-> Blu"
 #: plugins/swapchannels/swapchannels.C:116
 msgid "-> Alpha"
 msgstr "-> Alpha"
-#msgstr ""
 
 #: plugins/swapframes/swapframes.C:113
 msgid "Swap 0-1, 2-3, 4-5..."
@@ -9325,12 +9041,10 @@ msgstr "Biondo"
 #: plugins/theme_blond_cv/blondcvtheme.C:72
 msgid "Blond-cv"
 msgstr "Blond-cv"
-#msgstr ""
 
 #: plugins/theme_blue_dot/bluedottheme.C:75
 msgid "Blue Dot"
 msgstr "Blue Dot"
-#msgstr ""
 
 #: plugins/theme_bright/brighttheme.C:71
 msgid "Bright"
@@ -9339,7 +9053,6 @@ msgstr "Luminosa"
 #: plugins/theme_hulk/hulktheme.C:74
 msgid "Hulk"
 msgstr "Hulk"
-#msgstr ""
 
 #: plugins/theme_pinklady/pinkladytheme.C:65
 msgid "PinkLady"
@@ -9348,7 +9061,6 @@ msgstr "Signora in rosa"
 #: plugins/theme_suv/suv.C:71
 msgid "S.U.V."
 msgstr "S.U.V."
-#msgstr ""
 
 #: plugins/theme_unflat/unflattheme.C:68
 msgid "UnFlat"
@@ -9381,12 +9093,10 @@ msgstr "Alto colore"
 #: plugins/threshold/thresholdwindow.C:485
 msgid "Min:"
 msgstr "Min:"
-#msgstr ""
 
 #: plugins/threshold/thresholdwindow.C:498
 msgid "Max:"
 msgstr "Max:"
-#msgstr ""
 
 #: plugins/timeavg/timeavg.C:118
 msgid "Time Average"
@@ -9426,7 +9136,7 @@ msgstr "Testo:"
 
 #: plugins/timefront/timefront.C:166
 msgid "Time range:"
-msgstr "Intervallo tempo :"
+msgstr "Intervallo tempo:"
 
 #: plugins/timefront/timefront.C:292
 msgid "As timefront use:"
@@ -9463,27 +9173,27 @@ msgstr "CronoFronte"
 #: plugins/timefront/timefront.C:784
 #, c-format
 msgid "ERROR: TimeFront plugin - If you are using another track for timefront, you have to have it under shared effects\n"
-msgstr "ERRORE: TimeFront plugin - Se si sta utilizzando un'altra traccia per timefront, devi avere sotto effetti condivisa\n"
+msgstr "ERRORE: TImeFront plugin - Se stai usando un altra traccia per timefront, devi averla sotto effetti condivisi\n"
 
 #: plugins/timefront/timefront.C:789
 #, c-format
 msgid "Sizes of master track and timefront track do not match\n"
-msgstr "Misure di master track e pista timefront non corrispondono\n"
+msgstr "Dimensione delle traccie master e timefront non coincidono\n"
 
 #: plugins/timefront/timefront.C:836
 #, c-format
 msgid "TimeFront plugin error: ALPHA used, but project color model does not have alpha\n"
-msgstr "TimeFront errore plugin: ALPHA usato, ma modello di colore progetto non ha alpha\n"
+msgstr "Errore plugin TimeFront: ALPHA e’ stato usato, ma il modello colore nel progetto non ha alpha\n"
 
 #: plugins/timefront/timefront.C:897
 #, c-format
 msgid "TimeFront plugin error: ALPHA track used, but project color model does not have alpha\n"
-msgstr "TimeFront errore plugin: ALPHA pista utilizzata, ma modello di colore progetto non ha alpha\n"
+msgstr "Errore plugin TimeFront: traccia ALPHA e’ stata usato, ma il modello colore nel progetto non ha alpha\n"
 
 #: plugins/timefront/timefront.C:904
 #, c-format
 msgid "TimeFront plugin error: unsupported track_usage parameter\n"
-msgstr "Errore plug TimeFront: non supportato track_usage parametro\n"
+msgstr "Errore plugin TimeFront: parametro track_usage non supportato\n"
 
 #: plugins/timestretch/timestretch.C:70
 msgid "Use fast fourier transform"
@@ -9513,23 +9223,21 @@ msgstr "dimensione della finestra (ms):"
 #: plugins/timestretchrt/timestretchrt.C:199
 msgid "Time Stretch RT"
 msgstr "Time Stretch RT"
-#msgstr ""
 
 #: plugins/titler/title.C:293
 #, c-format
 msgid "GlyphUnit::process_package FT_New_Face failed.\n"
-msgstr "GlyphUnit::process_package FT_New_Face non riuscita.\n"
+msgstr "GlyphUnit::process_package FT_New_Face failed.\n"
 
 #: plugins/titler/title.C:317
 #, c-format
 msgid "GlyphUnit::process_package FT_Load_Char failed - char: %li.\n"
-msgstr "GlyphUnit::process_package FT_Load_Char failed - char: %li.\n"
-#msgstr ""
+msgstr "GlyphUnit::process_package FT_Load_Char non riuscito - char: %li.\n"
 
 #: plugins/titler/title.C:1376
 #, c-format
 msgid "TitleMain::load_freetype_face %s failed.\n"
-msgstr "TitleMain::load_freetype_face %s non riuscita.\n"
+msgstr "TitleMain::load_freetype_face %s failed.\n"
 
 #: plugins/titler/title.C:1929
 msgid "No motion"
@@ -9658,7 +9366,6 @@ msgstr "Carrier Traccia:"
 #: plugins/vocoder/vocoder.C:363
 msgid "Vocoder"
 msgstr "Vocoder"
-#msgstr ""
 
 #: plugins/wave/wave.C:263
 msgid "Smear"
@@ -9694,57 +9401,47 @@ msgstr "Vortice"
 
 #: plugins/wipe/wipe.C:146
 msgid "Wipe"
-msgstr "Cancella"
+msgstr "Pulisci"
 
 #: plugins/yuv/yuv.C:181 plugins/yuv/yuvwindow.C:48
 msgid "U:"
 msgstr "U:"
-#msgstr ""
 
 #: plugins/yuv/yuv.C:184 plugins/yuv/yuvwindow.C:53
 msgid "V:"
 msgstr "V:"
-#msgstr ""
 
 #: plugins/yuv/yuv.C:209
 msgid "YUV"
 msgstr "YUV"
-#msgstr ""
 
 #: plugins/yuvshift/yuvshift.C:171
 msgid "Y_dx:"
 msgstr "Y_dx:"
-#msgstr ""
 
 #: plugins/yuvshift/yuvshift.C:174
 msgid "Y_dy:"
 msgstr "Y_dy:"
-#msgstr ""
 
 #: plugins/yuvshift/yuvshift.C:177
 msgid "U_dx:"
 msgstr "U_dx:"
-#msgstr ""
 
 #: plugins/yuvshift/yuvshift.C:180
 msgid "U_dy:"
 msgstr "U_dy:"
-#msgstr ""
 
 #: plugins/yuvshift/yuvshift.C:183
 msgid "V_dx:"
 msgstr "V_dx:"
-#msgstr ""
 
 #: plugins/yuvshift/yuvshift.C:186
 msgid "V_dy:"
 msgstr "V_dy:"
-#msgstr ""
 
 #: plugins/yuvshift/yuvshift.C:211
 msgid "YUVShift"
 msgstr "YUVShift"
-#msgstr ""
 
 #: plugins/zoom/zoom.C:100
 msgid "X Magnification:"
similarity index 50%
rename from cinelerra-5.1/thirdparty/src/ffmpeg-3.1.1.tar.xz
rename to cinelerra-5.1/thirdparty/src/ffmpeg-3.1.2.tar.xz
index c72fe5e7ac616073500055d17c1cd389715ec67f..31c5b34c931191515060533a73b4ff4c4dab2e57 100644 (file)
Binary files a/cinelerra-5.1/thirdparty/src/ffmpeg-3.1.1.tar.xz and b/cinelerra-5.1/thirdparty/src/ffmpeg-3.1.2.tar.xz differ
diff --git a/cinelerra-5.1/thirdparty/src/x265.patch1 b/cinelerra-5.1/thirdparty/src/x265.patch1
deleted file mode 100644 (file)
index 538df80..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-diff -ru a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp
---- a/source/encoder/encoder.cpp       2016-01-24 22:16:50.000000000 -0700
-+++ b/source/encoder/encoder.cpp       2016-02-21 09:02:20.443636332 -0700
-@@ -361,7 +361,10 @@
-     }
-     if (m_threadPool)
--        m_threadPool->stopWorkers();
-+    {
-+        for (int i = 0; i < m_numPools; i++)
-+            m_threadPool[i].stopWorkers();
-+    }
- }
- void Encoder::destroy()
diff --git a/cinelerra-5.1/thirdparty/src/x265_1.9.tar.xz b/cinelerra-5.1/thirdparty/src/x265_1.9.tar.xz
deleted file mode 100644 (file)
index 7f1cbfd..0000000
Binary files a/cinelerra-5.1/thirdparty/src/x265_1.9.tar.xz and /dev/null differ
diff --git a/cinelerra-5.1/thirdparty/src/x265_2.0.tar.xz b/cinelerra-5.1/thirdparty/src/x265_2.0.tar.xz
new file mode 100644 (file)
index 0000000..c541d5b
Binary files /dev/null and b/cinelerra-5.1/thirdparty/src/x265_2.0.tar.xz differ