#include "filejpeg.h"
#include "filempeg.h"
#undef HAVE_STDLIB_H // automake conflict
+#include "fileogg.h"
#include "filepng.h"
#include "fileppm.h"
+#include "fileref.h"
#include "filescene.h"
#include "filesndfile.h"
#include "filetga.h"
#include "filethread.h"
#include "filetiff.h"
+#include "filevorbis.h"
#include "filexml.h"
#include "formatwindow.h"
#include "formattools.h"
#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;
}
if( temp_frame ) {
-//printf("File::~File %d temp_debug=%d\n", __LINE__, --temp_debug);
delete temp_frame;
}
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;
}
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[] = {
"CR2",
"TGA",
"TIFF",
+#ifdef HAVE_OGG
+ "OGG",
+ "Vorbis",
+#endif
"MPEG",
"EDL",
"FFMPEG_Late",
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;
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);
break;
#endif
+ case FILE_REF:
+ file = new FileREF(this->asset, this);
+ break;
// try plugins
default:
return 1;
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;
}
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;
}
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;
+ if( !strcasecmp(format, _(REF_NAME)) ) return FILE_REF;
return 0;
}
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);
+ case FILE_REF: return _(REF_NAME);
}
return _("Unknown");
}
case FILE_DB: return FileDB::get_best_colormodel(asset, driver);
#endif
case FILE_FFMPEG: return FileFFMPEG::get_best_colormodel(asset, driver);
+ case FILE_REF: return FileREF::get_best_colormodel(asset, driver);
}
return BC_RGB888;
int File::renders_video(int format)
{
switch( format ) {
+ case FILE_OGG:
case FILE_JPEG:
case FILE_JPEG_LIST:
case FILE_CR2:
case FILE_FLAC:
case FILE_PCM:
case FILE_WAV:
+ case FILE_OGG:
+ case FILE_VORBIS:
case FILE_AMPEG:
case FILE_AU:
case FILE_AIFF:
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";
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";
}
return 0;
}
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";
case FILE_CR2_LIST: return "CR2_LIST";
case FILE_GIF_LIST: return "GIF_LIST";
case FILE_DB: return "DB";
+ case FILE_REF: return "REF";
}
return _("UNKNOWN");
}
-PackagingEngine *File::new_packaging_engine(Asset *asset)
-{
- PackagingEngine *result = (PackagingEngine*) new PackagingEngineDefault();
- return result;
-}
-
-
int File::record_fd()
{
return file ? file->record_fd() : -1;