X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ffile.C;h=f19ce0184137e6eb0aaf01f0a97a59f4c17d8435;hb=3b4d085f4235e6313c25871877180a1a989e5b9f;hp=57b09f0eac0aad61c38787bb2877dc4b55b9c733;hpb=235c9cc4df8306babbbfda46189108fe262d44ef;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/file.C b/cinelerra-5.1/cinelerra/file.C index 57b09f0e..f19ce018 100644 --- a/cinelerra-5.1/cinelerra/file.C +++ b/cinelerra-5.1/cinelerra/file.C @@ -623,9 +623,12 @@ int File::open_file(Preferences *preferences, if( rd ) { // one frame image file, no specific length - if( !this->asset->audio_data && this->asset->video_data && - this->asset->video_length <= 1 ) + if( !this->asset->audio_data && + this->asset->video_data && !this->asset->single_frame && + this->asset->video_length >= 0 && this->asset->video_length <= 1 ) { + this->asset->single_frame = 1; this->asset->video_length = -1; + } } // Synchronize header parameters @@ -1124,7 +1127,7 @@ VFrame*** File::get_video_buffer() int File::read_samples(Samples *samples, int64_t len) { // Never try to read more samples than exist in the file - if (current_sample + len > asset->audio_length) { + if (asset->audio_length >= 0 && current_sample + len > asset->audio_length) { len = asset->audio_length - current_sample; } if(len <= 0) return 0; @@ -1173,8 +1176,8 @@ int File::read_frame(VFrame *frame, int is_thread) if(debug) PRINT_TRACE int supported_colormodel = colormodel_supported(frame->get_color_model()); int advance_position = 1; - int cache_active = use_cache || asset->video_length < 0 ? 1 : 0; - int64_t cache_position = asset->video_length >= 0 ? current_frame : -1; + int cache_active = use_cache || asset->single_frame ? 1 : 0; + int64_t cache_position = !asset->single_frame ? current_frame : -1; // Test cache if( cache_active && frame_cache->get_frame(frame, cache_position, current_layer, asset->frame_rate) ) @@ -1629,16 +1632,88 @@ int File::record_fd() } -void get_exe_path(char *result) +void File::get_exe_path(char *result, char *bnp) { -// Get executable path +// Get executable path, basename int len = readlink("/proc/self/exe", result, BCTEXTLEN-1); if( len >= 0 ) { result[len] = 0; char *ptr = strrchr(result, '/'); - if( ptr ) *ptr = 0; + if( ptr ) *ptr++ = 0; else ptr = result; + if( bnp ) strncpy(bnp, ptr, BCTEXTLEN); } - else - result[0] = 0; + else { + *result = 0; + if( bnp ) *bnp = 0; + } +} + +void File::getenv_path(char *result, const char *path) +{ + char *rp = result, *ep = rp + BCTEXTLEN-1; + const char *cp = path; +// any env var can be used here to expand a path as: +// "path...$id...": and id is a word as alpha,alnum... +// expands as "path...getenv(id)..." +// CIN_PATH, CIN_LIB are set in main.C, + for( int ch=*cp++; ch && rp < ep; ch=*cp++ ) { + if( ch == '$' && isalpha(*cp) ) { // scan alpha,alnum... + const char *bp = cp; char *p = rp; + while( p < ep && *bp && (isalnum(*bp) || *bp == '_') ) *p++ = *bp++; + *p = 0; + const char *envp = getenv(rp); // read env value + if( !envp ) continue; + while( *envp && rp < ep ) *rp++ = *envp++; + cp = bp; // subst id=value + continue; + } + *rp++ = ch; + } + *rp = 0; +} + +char File::cinexe_path[BCTEXTLEN]; +char File::cinpkg_path[BCTEXTLEN]; +char File::cindat_path[BCTEXTLEN]; +char File::cinlib_path[BCTEXTLEN]; +char File::cincfg_path[BCTEXTLEN]; +char File::cinplg_path[BCTEXTLEN]; +char File::cinlad_path[BCTEXTLEN]; +char File::cinlcl_path[BCTEXTLEN]; + +void File::init_cin_path() +{ + char env_path[BCTEXTLEN], env_pkg[BCTEXTLEN]; +// these values are advertised for forks/shell scripts + get_exe_path(env_path, env_pkg); + snprintf(cinexe_path, sizeof(cinexe_path), "CIN_PATH=%s", env_path); + putenv(cinexe_path); + snprintf(cinpkg_path, sizeof(cinpkg_path), "CIN_PKG=%s", env_pkg); + putenv(cinpkg_path); + + getenv_path(env_path, CINDAT_DIR); + snprintf(cindat_path, sizeof(cindat_path), "CIN_DAT=%s", env_path); + putenv(cindat_path); + + getenv_path(env_path, CINLIB_DIR); + snprintf(cinlib_path, sizeof(cinlib_path), "CIN_LIB=%s", env_path); + putenv(cinlib_path); + + getenv_path(env_path, CONFIG_DIR); + snprintf(cincfg_path, sizeof(cincfg_path), "CIN_CONFIG=%s", env_path); + putenv(cincfg_path); + + getenv_path(env_path, PLUGIN_DIR); + snprintf(cinplg_path, sizeof(cinplg_path), "CIN_PLUGIN=%s", env_path); + putenv(cinplg_path); + + getenv_path(env_path, LADSPA_DIR); + snprintf(cinlad_path, sizeof(cinlad_path), "CIN_LADSPA=%s", env_path); + putenv(cinlad_path); + + getenv_path(env_path, LOCALE_DIR); + snprintf(cinlcl_path, sizeof(cinlcl_path), "CIN_LOCALE=%s", env_path); + putenv(cinlcl_path); } +