#include "defaultformats.h"
#include "ntsczones.h"
-#include <sys/types.h>
-#include <sys/stat.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
#include <fcntl.h>
#include <string.h>
+#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <limits.h>
+#include <errno.h>
extern "C"
// set the .bcast path
FileSystem fs;
- sprintf(string, "%s", BCASTDIR);
+ sprintf(string, "%s/", File::get_config_path());
fs.complete_path(string);
if(!fs.is_dir(string))
fs.create_dir(string);
}
const char *MWindow::default_std()
{
- int fd, i, l = 0;
- char buf[BCTEXTLEN];
- char *p;
+ char buf[BCTEXTLEN], *p = 0;
- if((fd = open(TIMEZONE_NAME, O_RDONLY)) >= 0)
- {
- l = read(fd, buf, BCTEXTLEN);
+ int fd = open(TIMEZONE_NAME, O_RDONLY);
+ if( fd >= 0 ) {
+ int l = read(fd, buf, sizeof(buf)-1);
close(fd);
- if(l > 0)
- {
+ if( l > 0 ) {
+ if( buf[l-1] == '\n' ) --l;
buf[l] = 0;
- if(buf[l - 1] == '\n')
- buf[--l] = 0;
+ p = buf;
}
- p = buf;
}
- if(l < 1)
- {
- if((l = readlink(LOCALTIME_LINK, buf, BCTEXTLEN)) > 0)
- {
+ if( !p ) {
+ int l = readlink(LOCALTIME_LINK, buf, sizeof(buf)-1);
+ if( l > 0 ) {
buf[l] = 0;
- if( (p=strstr(buf, ZONEINFO_STR)) != 0 )
- {
- p += strlen(ZONEINFO_STR);
- l = strlen(p);
- }
- else
- l = 0;
+ if( !(p=strstr(buf, ZONEINFO_STR)) != 0 ) return "PAL";
+ p += strlen(ZONEINFO_STR);
}
}
- if(l)
- {
- for(i = 0; ntsc_zones[i]; i++)
- if(strcmp(ntsc_zones[i], p) == 0)
- return "NTSC";
+
+ if( p ) {
+ for( int i=0; ntsc_zones[i]; ++i ) {
+ if( !strcmp(ntsc_zones[i], p) )
+ return "NTSC";
+ }
}
- return "PAL";
+
+ p = getenv("TZ");
+ if( p ) {
+ for( int i=0; ntsc_zones[i]; ++i ) {
+ if( !strcmp(ntsc_zones[i], p) )
+ return "NTSC";
+ }
+ }
+
+//__timezone: Seconds west of UTC. 240sec/deg
+ double tz_deg = -__timezone / 240.;
+// from Honolulu = -10, to New York = -5, 15deg/hr lat -150..-75
+ return tz_deg >= -10*15 && tz_deg <= -5*15 ? "NTSC" : "PAL";
}
void MWindow::fill_preset_defaults(const char *preset, EDLSession *session)
for(fpr = &format_presets[0]; fpr->name; fpr++)
{
- if(strcmp(fpr->name, preset) == 0)
+ if(strcmp(_(fpr->name), preset) == 0)
{
session->audio_channels = fpr->audio_channels;
session->audio_tracks = fpr->audio_tracks;
{
if(index < 0 || index >= (int)MAX_NUM_PRESETS)
return "Error";
- return format_presets[index].name;
+ return _(format_presets[index].name);
}
char *path = getenv("LADSPA_PATH");
char ladspa_path[BCTEXTLEN];
if( !path ) {
- get_exe_path(ladspa_path);
- strcat(ladspa_path, "/ladspa");
+ strncpy(ladspa_path, File::get_ladspa_path(), sizeof(ladspa_path));
path = ladspa_path;
}
for( int len=0; *path; path+=len ) {
wwindow->show_warning(do_warning, text);
}
+int MWindow::wait_warning()
+{
+ return wwindow->wait_result();
+}
+
void MWindow::init_theme()
{
Timer timer;
ptr->hide_gui();
delete_plugin(ptr);
//sleep(1);
-// return;
+ return;
}
}
if(lock) plugin_gui_lock->unlock();
void MWindow::save_backup()
{
FileXML file;
+ edl->optimize();
edl->set_path(session->filename);
- edl->save_xml(&file,
- BACKUP_PATH,
- 0,
- 0);
+ char backup_path[BCTEXTLEN];
+ snprintf(backup_path, sizeof(backup_path), "%s/%s",
+ File::get_config_path(), BACKUP_FILE);
+ edl->save_xml(&file, backup_path, 0, 0);
file.terminate_string();
- char path[BCTEXTLEN];
FileSystem fs;
- strcpy(path, BACKUP_PATH);
- fs.complete_path(path);
+ fs.complete_path(backup_path);
- if(file.write_to_file(path))
+ if(file.write_to_file(backup_path))
{
char string2[256];
- sprintf(string2, _("Couldn't open %s for writing."), BACKUP_PATH);
+ sprintf(string2, _("Couldn't open %s for writing."), backup_path);
gui->show_message(string2);
}
}
ArrayList<char*> path_list;
path_list.set_array_delete();
char *out_path;
- char string[BCTEXTLEN];
- strcpy(string, BACKUP_PATH);
+ char backup_path[BCTEXTLEN];
+ snprintf(backup_path, sizeof(backup_path), "%s/%s",
+ File::get_config_path(), BACKUP_FILE);
FileSystem fs;
- fs.complete_path(string);
+ fs.complete_path(backup_path);
- path_list.append(out_path = new char[strlen(string) + 1]);
- strcpy(out_path, string);
+ path_list.append(out_path = new char[strlen(backup_path) + 1]);
+ strcpy(out_path, backup_path);
load_filenames(&path_list, LOADMODE_REPLACE, 0);
edl->local_session->clip_title[0] = 0;
{
w = 1; h = 1;
if(!width || !height) return 1;
+ if( width == 720 && (height == 480 || height == 576) ) {
+ w = 4; h = 3; return 0; // for NTSC and PAL
+ }
double ar = (double)width / height;
// square-ish pixels
if( EQUIV(ar, 1.0000) ) return 0;
{
char proc_path[BCTEXTLEN], exe_path[BCTEXTLEN];
sprintf(proc_path, "/proc/%d/exe", (int)getpid());
- int len = readlink(proc_path, exe_path, sizeof(exe_path));
- if( len < 0 ) { fprintf(fp,"readlink: %m\n"); return; }
- exe_path[len] = 0;
+ int ret = readlink(proc_path, exe_path, sizeof(exe_path));
+ if( ret < 0 ) { fprintf(fp,"readlink: %m\n"); return; }
+ exe_path[ret] = 0;
struct stat st;
if( stat(exe_path,&st) ) { fprintf(fp,"stat: %m\n"); return; }
fprintf(fp, "path: %s = %9jd bytes\n",exe_path,st.st_size);
- int fd = open(exe_path,O_RDONLY);
+ int fd = open(exe_path,O_RDONLY+O_NONBLOCK);
if( fd < 0 ) { fprintf(fp,"open: %m\n"); return; }
- uint8_t buf[65536]; SHA1 sha1;
- while( (len=read(fd,buf,sizeof(buf))) > 0 ) {
- sha1.addBytes(buf, len);
+ uint8_t *bfr = 0;
+ int64_t bfrsz = 0;
+ int64_t pagsz = sysconf(_SC_PAGE_SIZE);
+ int64_t maxsz = 1024*pagsz;
+ int64_t size = st.st_size, pos = 0;
+ SHA1 sha1;
+ while( (bfrsz = size-pos) > 0 ) {
+ if( bfrsz > maxsz ) bfrsz = maxsz;
+ bfr = (uint8_t *)mmap(NULL, bfrsz, PROT_READ,
+ MAP_PRIVATE+MAP_NORESERVE+MAP_POPULATE, fd, pos);
+ if( bfr == MAP_FAILED ) break;
+ sha1.addBytes(bfr, bfrsz);
+ munmap(bfr, bfrsz);
+ pos += bfrsz;
}
close(fd);
+ ret = pos < size ? EIO : 0;
fprintf(fp, "SHA1: ");
uint8_t digest[20]; sha1.computeHash(digest);
for( int i=0; i<20; ++i ) fprintf(fp, "%02x", digest[i]);
+ if( ret < 0 ) fprintf(fp, " (ret %d)", ret);
+ if( pos < st.st_size ) fprintf(fp, " (pos %jd)", pos);
fprintf(fp, "\n");
}
-
void MWindow::trap_hook(FILE *fp, void *vp)
{
MWindow *mwindow = (MWindow *)vp;
- fprintf(fp, "\nEXE:\n");
- mwindow->dump_exe(fp);
- fprintf(fp, "\nPLUGINS:\n");
- mwindow->dump_plugins(fp);
+// fprintf(fp, "\nPLUGINS:\n");
+// mwindow->dump_plugins(fp);
fprintf(fp, "\nEDL:\n");
mwindow->dump_edl(fp);
fprintf(fp, "\nUNDO:\n");
mwindow->dump_undo(fp);
+ fprintf(fp, "\nEXE:\n");
+ mwindow->dump_exe(fp);
}
int result = file->open_file(preferences, asset, 1, 0);
if( !result && delete_tracks > 0 )
undo->update_undo_before();
- if( !result && asset->get_video_layers() > 0 ) {
+ if( !result && asset->video_data && asset->get_video_layers() > 0 ) {
// try to get asset up to date, may fail
file->select_video_stream(asset, vstream);
// either way use what was/is there.
}
edl->resample(old_framerate, session->frame_rate, TRACK_VIDEO);
}
- if( !result && asset->channels > 0 ) {
+ if( !result && asset->audio_data && asset->channels > 0 ) {
session->sample_rate = asset->get_sample_rate();
int64_t channel_mask = 0;
- int astrm = file->get_audio_for_video(vstream, astream, channel_mask);
+ int astrm = !asset->video_data ? -1 :
+ file->get_audio_for_video(vstream, astream, channel_mask);
if( astrm >= 0 ) file->select_audio_stream(asset, astrm);
if( astrm < 0 || !channel_mask ) channel_mask = (1<<asset->channels)-1;
int channels = 0;
for( uint64_t mask=channel_mask; mask!=0; mask>>=1 ) channels += mask & 1;
+ if( channels < 1 ) channels = 1;
if( channels > 6 ) channels = 6;
session->audio_tracks = session->audio_channels = channels;
switch( channels ) {
session->achannel_positions[0] = 180;
session->achannel_positions[1] = 0;
break;
+ case 1:
+ session->achannel_positions[1] = 90;
+ break;
+ default: {
+ if( !channels ) break;
+ double t = 0, dt = 360./channels;
+ for( int i=channels; --i>=0; t+=dt )
+ session->achannel_positions[i] = int(t+0.5);
+ break; }
}
remap_audio(MWindow::AUDIO_1_TO_1);
int MWindow::select_asset(int vtrack, int delete_tracks)
{
Track *track = edl->tracks->get(vtrack, TRACK_VIDEO);
+ if( !track )
+ track = edl->tracks->get(vtrack, TRACK_AUDIO);
if( !track ) return 1;
Edit *edit = track->edits->first;
if( !edit ) return 1;