X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Findexfile.C;h=0337d0c2062d9e932051f86721b2939c7f61d1a9;hp=c063b44c46b8653d5da6b1c81906d26c926f38ad;hb=54b918a8b84f666bf32548ebd12b93908061d2a6;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1 diff --git a/cinelerra-5.1/cinelerra/indexfile.C b/cinelerra-5.1/cinelerra/indexfile.C index c063b44c..0337d0c2 100644 --- a/cinelerra-5.1/cinelerra/indexfile.C +++ b/cinelerra-5.1/cinelerra/indexfile.C @@ -70,19 +70,22 @@ #include #include +#ifdef HAVE_ISOFS #include +#endif // check for isofs volume_id for dvd/cdrom static int udf_volume_id(const char *path, char *fname) { + int result = 1; +#ifdef HAVE_ISOFS struct stat st; if( stat(path,&st) ) return 1; // search mounted devices FILE *fp = fopen("/proc/mounts","r"); if( !fp ) return 1; - int result = 1; while( result && !feof(fp) && !ferror(fp) ) { char devpath[BCTEXTLEN], mpath[BCTEXTLEN]; char options[BCTEXTLEN], line[BCTEXTLEN]; @@ -122,6 +125,7 @@ static int udf_volume_id(const char *path, char *fname) } fclose(fp); +#endif return result; } @@ -224,7 +228,7 @@ void IndexFile::delete_index(Preferences *preferences, char index_filename[BCTEXTLEN]; char source_filename[BCTEXTLEN]; const char *path = indexable->path; - + if( !*path ) return; get_index_filename(source_filename, preferences->index_directory, index_filename, path, suffix); @@ -232,6 +236,15 @@ void IndexFile::delete_index(Preferences *preferences, remove_file(index_filename); } +void IndexFile::delete_index_files(Preferences *preferences, + Indexable *indexable) +{ + delete_index(preferences, indexable, ".toc"); + delete_index(preferences, indexable, ".idx"); + delete_index(preferences, indexable, ".mkr"); +} + + int IndexFile::open_file() { int result = 0; @@ -328,6 +341,11 @@ int IndexFile::open_source() FileSystem fs; asset->index_state->index_bytes = fs.get_size(asset->path); source_length = source->get_audio_length(); + int proxy_scale = asset->proxy_scale; + if( proxy_scale > 0 ) { + asset->width = asset->actual_width * proxy_scale; + asset->height = asset->actual_height * proxy_scale; + } } } else @@ -356,9 +374,10 @@ void IndexFile::close_source() delete render_engine; render_engine = 0; - - delete cache; - cache = 0; + if( cache ) { + cache->remove_user(); + cache = 0; + } } int64_t IndexFile::get_required_scale() @@ -689,7 +708,9 @@ SET_TRACE // Start and length of fragment to read from file in bytes. float *buffer = 0; int buffer_shared = 0; - int center_pixel = mwindow->edl->local_session->zoom_track / 2; + int rect_audio = mwindow->preferences->rectify_audio; + int data_h = edit->track->data_h; + int center_pixel = !rect_audio ? data_h/2 : data_h; if( edit->track->show_titles() ) center_pixel += mwindow->theme->get_image("title_bg_data")->get_h(); @@ -726,8 +747,10 @@ SET_TRACE int prev_y1 = center_pixel; int prev_y2 = center_pixel; int first_frame = 1; - int zoom_y = mwindow->edl->local_session->zoom_y, zoom_y2 = zoom_y / 2; - int max_y = center_pixel + zoom_y2 - 1; + int zoom_y = mwindow->edl->local_session->zoom_y * data_h / + mwindow->edl->local_session->zoom_atrack; + if( !rect_audio ) zoom_y /= 2; + int max_y = center_pixel + zoom_y - 1; edit_position = (x + pixmap->pixmap_x - virtual_edit_x) * project_zoom; int64_t speed_position = edit->startsource; speed_position += !speed_autos ? edit_position : @@ -739,8 +762,8 @@ SET_TRACE SET_TRACE for( int64_t x1=0; x1pixmap_x - virtual_edit_x) * project_zoom; int64_t speed_position = edit->startsource; @@ -751,12 +774,14 @@ SET_TRACE int64_t k = 2 * index_position - start_index; CLAMP(k, 0, length_index); while( i < k ) { - highsample = MAX(highsample, buffer[i]); ++i; - lowsample = MIN(lowsample, buffer[i]); ++i; + float high = !rect_audio ? buffer[i] : fabsf(buffer[i]); + highsample = MAX(highsample, high); ++i; + float low = !rect_audio ? buffer[i] : fabsf(buffer[i]); + lowsample = MIN(lowsample, low); ++i; } - int y1 = (int)(center_pixel - highsample * zoom_y2); - int y2 = (int)(center_pixel - lowsample * zoom_y2); + int y1 = (int)(center_pixel - highsample * zoom_y); + int y2 = (int)(center_pixel - lowsample * zoom_y); CLAMP(y1, 0, max_y); int next_y1 = y1; CLAMP(y2, 0, max_y); int next_y2 = y2; //printf("draw_line (%f,%f) = %d,%d, %d,%d\n", lowsample, highsample, x2, y1, x2, y2); @@ -765,7 +790,7 @@ SET_TRACE // A different algorithm has to be used if it's 1 sample per pixel and the // index is used. Now the min and max values are equal so we join the max samples. if(mwindow->edl->local_session->zoom_sample == 1) { - canvas->draw_line(x2 - 1, prev_y1, x2, y1, pixmap); + canvas->draw_bline(x2 - 1, !rect_audio ? prev_y1 : center_pixel, x2, y1, pixmap); } else { // Extend line height if it doesn't connect to previous line @@ -776,7 +801,7 @@ SET_TRACE else { first_frame = 0; } - canvas->draw_line(x2, y1, x2, y2, pixmap); + canvas->draw_bline(x2, y1, x2, !rect_audio ? y2 : center_pixel, pixmap); } prev_y1 = next_y1; prev_y2 = next_y2;