X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ffile.C;h=9828d6ec327527251fc5ef79bac7285bf3f34ddb;hp=1fec188eacb98570229d46acda6e27cc19322cfd;hb=2441cb0cb7f655fad2f76c982f2ac93897d09dbe;hpb=4c207ab325a8e8e6b79a9a18d4647273b5f59f93 diff --git a/cinelerra-5.1/cinelerra/file.C b/cinelerra-5.1/cinelerra/file.C index 1fec188e..9828d6ec 100644 --- a/cinelerra-5.1/cinelerra/file.C +++ b/cinelerra-5.1/cinelerra/file.C @@ -52,6 +52,7 @@ #include "filejpeg.h" #include "filempeg.h" #undef HAVE_STDLIB_H // automake conflict +#include "fileogg.h" #include "filepng.h" #include "fileppm.h" #include "fileref.h" @@ -60,6 +61,7 @@ #include "filetga.h" #include "filethread.h" #include "filetiff.h" +#include "filevorbis.h" #include "filexml.h" #include "formatwindow.h" #include "formattools.h" @@ -75,6 +77,14 @@ #include "samples.h" #include "vframe.h" +#ifdef HAVE_OGG +//suppress noref warning +void *vorbis0_ov_callbacks[] = { + &OV_CALLBACKS_DEFAULT, &OV_CALLBACKS_NOCLOSE, + &OV_CALLBACKS_STREAMONLY, &OV_CALLBACKS_STREAMONLY_NOCLOSE, +}; +#endif + File::File() { cpus = 1; @@ -94,7 +104,6 @@ File::~File() } if( temp_frame ) { -//printf("File::~File %d temp_debug=%d\n", __LINE__, --temp_debug); delete temp_frame; } @@ -229,6 +238,12 @@ int File::get_options(FormatTools *format, FileTIFF::get_parameters(parent_window, asset, format_window, audio_options, video_options, edl); break; +#ifdef HAVE_OGG + case FILE_OGG: + FileOGG::get_parameters(parent_window, asset, format_window, + audio_options, video_options, edl); + break; +#endif default: break; } @@ -329,6 +344,24 @@ int File::delete_oldest() return frame_cache->delete_oldest(); } +int File::get_cache_frame(VFrame *frame, int64_t position) +{ + return frame_cache->get_cache_frame(frame, position, + current_layer, asset->frame_rate); +} + +void File::put_cache_frame(VFrame *frame, int64_t position, int use_copy) +{ + frame_cache->put_cache_frame(frame, + position, current_layer, asset->frame_rate, use_copy); +} + +int File::get_use_cache() +{ + return use_cache; +} + + // file driver in order of probe precidence // can be reordered in preferences->interface const char *File::default_probes[] = { @@ -350,6 +383,10 @@ const char *File::default_probes[] = { "CR2", "TGA", "TIFF", +#ifdef HAVE_OGG + "OGG", + "Vorbis", +#endif "MPEG", "EDL", "FFMPEG_Late", @@ -450,6 +487,18 @@ int File::probe() file = new FileTIFF(this->asset, this); return FILE_OK; } +#ifdef HAVE_OGG + if( !strcmp(pref->name,"OGG") ) { // OGG file + if( !FileOGG::check_sig(this->asset) ) continue; + file = new FileOGG(this->asset, this); + return FILE_OK; + } + if( !strcmp(pref->name,"Vorbis") ) { // VorbisFile file + if( !FileVorbis::check_sig(this->asset) ) continue; + file = new FileVorbis(this->asset, this); + return FILE_OK; + } +#endif #ifdef HAVE_LIBZMPEG if( !strcmp(pref->name,"MPEG") ) { // MPEG file if( !FileMPEG::check_sig(this->asset) ) continue; @@ -573,6 +622,15 @@ int File::open_file(Preferences *preferences, file = new FileMPEG(this->asset, this); break; #endif +#ifdef HAVE_OGG + case FILE_OGG: + file = new FileOGG(this->asset, this); + break; + + case FILE_VORBIS: + file = new FileVorbis(this->asset, this); + break; +#endif #ifdef HAVE_DV case FILE_RAWDV: file = new FileDV(this->asset, this); @@ -1109,52 +1167,52 @@ int File::read_frame(VFrame *frame, int is_thread) if( debug ) PRINT_TRACE int result = 0; int supported_colormodel = colormodel_supported(frame->get_color_model()); - int advance_position = 1; - int cache_active = use_cache || asset->single_frame ? 1 : 0; + int do_read = 1; +// if reverse playback reading, use_cache is -1 + int cache_active = asset->single_frame ? 1 : use_cache; 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) ) { -// Can't advance position if cache used. -//printf("File::read_frame %d\n", __LINE__); - advance_position = 0; + if( cache_active ) { + if( get_cache_frame(frame, cache_position) ) { + do_read = 0; + } + else if( cache_active < 0 && frame_cache->cache_items() > 0 ) { +// reverse reading and cache miss, clear cache for new readahead + purge_cache(); + } } -// Need temp - else if( frame->get_color_model() != BC_COMPRESSED && - (supported_colormodel != frame->get_color_model() || - (!file->can_scale_input() && - (frame->get_w() != asset->width || - frame->get_h() != asset->height))) ) { - -// printf("File::read_frame %d\n", __LINE__); -// Can't advance position here because it needs to be added to cache - if( temp_frame ) { - if( !temp_frame->params_match(asset->width, asset->height, supported_colormodel) ) { - delete temp_frame; - temp_frame = 0; +// Need to read + if( do_read ) { + VFrame *vframe = frame; + if( frame->get_color_model() != BC_COMPRESSED && + (supported_colormodel != frame->get_color_model() || + (!file->can_scale_input() && + (frame->get_w() != asset->width || + frame->get_h() != asset->height))) ) { + if( temp_frame ) { + if( !temp_frame->params_match(asset->width, asset->height, + supported_colormodel) ) { + delete temp_frame; temp_frame = 0; + } + } + if( !temp_frame ) { + temp_frame = new VFrame(asset->width, asset->height, + supported_colormodel, 0); + temp_frame->clear_frame(); } - } - if( !temp_frame ) { - temp_frame = new VFrame(asset->width, asset->height, supported_colormodel, 0); - temp_frame->clear_frame(); + temp_frame->copy_stacks(frame); + vframe = temp_frame; } - -// printf("File::read_frame %d\n", __LINE__); - temp_frame->copy_stacks(frame); - result = file->read_frame(temp_frame); - if( !result ) - frame->transfer_from(temp_frame); - else if( result && frame->get_status() > 0 ) - frame->set_status(-1); -//printf("File::read_frame %d\n", __LINE__); - } - else { -// Can't advance position here because it needs to be added to cache -//printf("File::read_frame %d\n", __LINE__); - result = file->read_frame(frame); - if( result && frame->get_status() > 0 ) + result = file->read_frame(vframe); + if( !result ) { + if( frame != vframe ) + frame->transfer_from(vframe); + if( cache_active > 0 ) + put_cache_frame(frame, cache_position, 1); + } + else if( frame->get_status() > 0 ) frame->set_status(-1); //for( int i = 0; i < 100 * 1000; i++ ) ((float*)frame->get_rows()[0])[i] = 1.0; } @@ -1162,12 +1220,9 @@ int File::read_frame(VFrame *frame, int is_thread) if( result && !current_frame ) frame->clear_frame(); - if( cache_active && advance_position && frame->get_status() > 0 ) - frame_cache->put_frame(frame, cache_position, - current_layer, asset->frame_rate, 1, 0); //printf("File::read_frame %d\n", __LINE__); - if( advance_position ) current_frame++; + if( do_read ) current_frame++; if( debug ) PRINT_TRACE return 0; } @@ -1214,6 +1269,8 @@ int File::strtoformat(const char *format) if( !strcasecmp(format, _(VMPEG_NAME)) ) return FILE_VMPEG; if( !strcasecmp(format, _(TGA_NAME)) ) return FILE_TGA; if( !strcasecmp(format, _(TGA_LIST_NAME)) ) return FILE_TGA_LIST; + if( !strcasecmp(format, _(OGG_NAME)) ) return FILE_OGG; + if( !strcasecmp(format, _(VORBIS_NAME)) ) return FILE_VORBIS; if( !strcasecmp(format, _(RAWDV_NAME)) ) return FILE_RAWDV; if( !strcasecmp(format, _(FFMPEG_NAME)) ) return FILE_FFMPEG; if( !strcasecmp(format, _(DBASE_NAME)) ) return FILE_DB; @@ -1255,6 +1312,8 @@ const char* File::formattostr(int format) case FILE_TGA_LIST: return _(TGA_LIST_NAME); case FILE_TIFF: return _(TIFF_NAME); case FILE_TIFF_LIST: return _(TIFF_LIST_NAME); + case FILE_OGG: return _(OGG_NAME); + case FILE_VORBIS: return _(VORBIS_NAME); case FILE_RAWDV: return _(RAWDV_NAME); case FILE_FFMPEG: return _(FFMPEG_NAME); case FILE_DB: return _(DBASE_NAME); @@ -1388,6 +1447,7 @@ int64_t File::get_memory_usage() int File::renders_video(int format) { switch( format ) { + case FILE_OGG: case FILE_JPEG: case FILE_JPEG_LIST: case FILE_CR2: @@ -1425,6 +1485,8 @@ int File::renders_audio(int format) case FILE_FLAC: case FILE_PCM: case FILE_WAV: + case FILE_OGG: + case FILE_VORBIS: case FILE_AMPEG: case FILE_AU: case FILE_AIFF: @@ -1471,6 +1533,7 @@ const char* File::get_tag(int format) case FILE_FLAC: return "flac"; case FILE_JPEG: return "jpg"; case FILE_JPEG_LIST: return "jpgs"; + case FILE_OGG: return "ogg"; case FILE_GIF: return "gif"; case FILE_GIF_LIST: return "gifs"; case FILE_PCM: return "pcm"; @@ -1483,6 +1546,7 @@ const char* File::get_tag(int format) case FILE_TIFF: return "tif"; case FILE_TIFF_LIST: return "tifs"; case FILE_VMPEG: return "m2v"; + case FILE_VORBIS: return "ogg"; case FILE_WAV: return "wav"; case FILE_FFMPEG: return "ffmpg"; case FILE_REF: return "ref"; @@ -1517,6 +1581,8 @@ const char* File::get_prefix(int format) case FILE_EXR: return "EXR"; case FILE_EXR_LIST: return "EXR_LIST"; case FILE_CR2: return "CR2"; + case FILE_OGG: return "OGG"; + case FILE_VORBIS: return "VORBIS"; case FILE_FLAC: return "FLAC"; case FILE_FFMPEG: return "FFMPEG"; case FILE_SCENE: return "SCENE"; @@ -1529,13 +1595,6 @@ const char* File::get_prefix(int format) } -PackagingEngine *File::new_packaging_engine(Asset *asset) -{ - PackagingEngine *result = (PackagingEngine*) new PackagingEngineDefault(); - return result; -} - - int File::record_fd() { return file ? file->record_fd() : -1;