#include "packagingengine.h"
#include "pluginserver.h"
#include "preferences.h"
+#include "probeprefs.h"
#include "samples.h"
#include "vframe.h"
+//static int temp_debug = 0;
//suppress noref warning
void *vorbis0_ov_callbacks[] = {
&OV_CALLBACKS_DEFAULT, &OV_CALLBACKS_NOCLOSE,
File::~File()
{
- if(getting_options)
- {
- if(format_window) format_window->set_done(0);
+ if( getting_options ) {
+ if( format_window ) format_window->set_done(0);
format_completion->lock("File::~File");
format_completion->unlock();
}
- if(temp_frame) delete temp_frame;
-
+ if( temp_frame ) {
+//printf("File::~File %d temp_debug=%d\n", __LINE__, --temp_debug);
+ delete temp_frame;
+ }
close_file(0);
int File::raise_window()
{
- if(getting_options && format_window)
- {
+ if( getting_options && format_window ) {
format_window->raise_window();
format_window->flush();
}
void File::close_window()
{
- if(getting_options)
- {
+ if( getting_options ) {
format_window->lock_window("File::close_window");
format_window->set_done(1);
format_window->unlock_window();
getting_options = 1;
format_completion->lock("File::get_options");
- switch(asset->format)
- {
- case FILE_AC3:
- FileAC3::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_RAWDV:
- FileDV::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_PCM:
- case FILE_WAV:
- case FILE_AU:
- case FILE_AIFF:
- case FILE_SND:
- FileSndFile::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_FFMPEG:
- FileFFMPEG::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_AMPEG:
- case FILE_VMPEG:
- FileMPEG::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_JPEG:
- case FILE_JPEG_LIST:
- FileJPEG::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_EXR:
- case FILE_EXR_LIST:
- FileEXR::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_FLAC:
- FileFLAC::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_PNG:
- case FILE_PNG_LIST:
- FilePNG::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_TGA:
- case FILE_TGA_LIST:
- FileTGA::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_TIFF:
- case FILE_TIFF_LIST:
- FileTIFF::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- case FILE_OGG:
- FileOGG::get_parameters(parent_window,
- asset,
- format_window,
- audio_options,
- video_options);
- break;
- default:
- break;
+ switch( asset->format ) {
+ case FILE_AC3:
+ FileAC3::get_parameters(parent_window,
+ asset,
+ format_window,
+ audio_options,
+ video_options);
+ break;
+#ifdef HAVE_DV
+ case FILE_RAWDV:
+ FileDV::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+#endif
+ case FILE_PCM:
+ case FILE_WAV:
+ case FILE_AU:
+ case FILE_AIFF:
+ case FILE_SND:
+ FileSndFile::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+ case FILE_FFMPEG:
+ FileFFMPEG::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+ case FILE_AMPEG:
+ case FILE_VMPEG:
+ FileMPEG::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+ case FILE_JPEG:
+ case FILE_JPEG_LIST:
+ FileJPEG::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+#ifdef HAVE_OPENEXR
+ case FILE_EXR:
+ case FILE_EXR_LIST:
+ FileEXR::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+#endif
+ case FILE_FLAC:
+ FileFLAC::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+ case FILE_PNG:
+ case FILE_PNG_LIST:
+ FilePNG::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+ case FILE_TGA:
+ case FILE_TGA_LIST:
+ FileTGA::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+ case FILE_TIFF:
+ case FILE_TIFF_LIST:
+ FileTIFF::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+ case FILE_OGG:
+ FileOGG::get_parameters(parent_window, asset, format_window,
+ audio_options, video_options);
+ break;
+ default:
+ break;
}
- if(!format_window)
- {
+ if( !format_window ) {
ErrorBox *errorbox = new ErrorBox(_(PROGRAM_NAME ": Error"),
parent_window->get_abs_cursor_x(1),
parent_window->get_abs_cursor_y(1));
format_window = errorbox;
getting_options = 1;
- if(audio_options)
+ if( audio_options )
errorbox->create_objects(_("This format doesn't support audio."));
else
- if(video_options)
+ if( video_options )
errorbox->create_objects(_("This format doesn't support video."));
errorbox->run_window();
delete errorbox;
this->white_balance_raw = value;
}
-
void File::set_cache_frames(int value)
{
// caching only done locally
- if(!video_thread)
+ if( !video_thread )
use_cache = value;
}
{
// caching only done locally
int result = 0;
- if( frame_cache->cache_items() > 0 )
- {
+ if( frame_cache->cache_items() > 0 ) {
frame_cache->remove_all();
result = 1;
}
int File::delete_oldest()
{
-// caching only done locally
+// return the number of bytes freed
return frame_cache->delete_oldest();
}
-
-
-
-
-
-
-
-
-
+// file driver in order of probe precidence
+// can be reordered in preferences->interface
+const char *File::default_probes[] = {
+ "FFMPEG_Early",
+ "Scene",
+ "DB",
+#ifdef HAVE_DV
+ "DV",
+#endif
+ "SndFile",
+ "PNG",
+ "JPEG",
+ "GIF",
+#ifdef HAVE_OPENEXR
+ "EXR",
+#endif
+ "FLAC",
+ "CR2",
+ "TGA",
+ "TIFF",
+ "OGG",
+ "Vorbis",
+ "MPEG",
+ "EDL",
+ "FFMPEG_Late",
+};
+const int File::nb_probes =
+ sizeof(File::default_probes)/sizeof(File::default_probes[0]);
+
+
+int File::probe()
+{
+ FILE *fp = fopen(this->asset->path, "rb");
+ if( !fp ) return FILE_NOT_FOUND;
+ char data[16];
+ memset(data,0,sizeof(data));
+ int ret = fread(data, 1, 16, fp);
+ fclose(fp);
+ if( !ret ) return FILE_NOT_FOUND;
+
+ for( int i=0; i<preferences->file_probes.size(); ++i ) {
+ ProbePref *pref = preferences->file_probes[i];
+ if( !pref->armed ) continue;
+ if( !strncmp(pref->name,"FFMPEG",6) ) { // FFMPEG Early/Late
+ if( !FileFFMPEG::check_sig(this->asset) ) continue;
+ file = new FileFFMPEG(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"DB") ) { // MediaDB
+ if( !FileDB::check_sig(this->asset) ) continue;
+ file = new FileDB(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"Scene") ) { // scene file
+ if( !FileScene::check_sig(this->asset, data)) continue;
+ file = new FileScene(this->asset, this);
+ return FILE_OK;
+ }
+#ifdef HAVE_DV
+ if( !strcmp(pref->name,"DV") ) { // libdv
+ if( !FileDV::check_sig(this->asset) ) continue;
+ file = new FileDV(this->asset, this);
+ return FILE_OK;
+ }
+#endif
+ if( !strcmp(pref->name,"SndFile") ) { // libsndfile
+ if( !FileSndFile::check_sig(this->asset) ) continue;
+ file = new FileSndFile(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"PNG") ) { // PNG file
+ if( !FilePNG::check_sig(this->asset) ) continue;
+ file = new FilePNG(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"JPEG") ) { // JPEG file
+ if( !FileJPEG::check_sig(this->asset) ) continue;
+ file = new FileJPEG(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"GIF") ) { // GIF file
+ if( !FileGIF::check_sig(this->asset)) continue;
+ file = new FileGIF(this->asset, this);
+ return FILE_OK;
+ }
+#ifdef HAVE_EXR
+ if( !strcmp(pref->name,"EXR") ) { // EXR file
+ if( !FileEXR::check_sig(this->asset, data)) continue;
+ file = new FileEXR(this->asset, this);
+ return FILE_OK;
+ }
+#endif
+ if( !strcmp(pref->name,"FLAC") ) { // FLAC file
+ if( !FileFLAC::check_sig(this->asset, data)) continue;
+ file = new FileFLAC(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"CR2") ) { // CR2 file
+ if( !FileCR2::check_sig(this->asset)) continue;
+ file = new FileCR2(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"TGA") ) { // TGA file
+ if( !FileTGA::check_sig(this->asset) ) continue;
+ file = new FileTGA(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"TIFF") ) { // TIFF file
+ if( !FileTIFF::check_sig(this->asset) ) continue;
+ file = new FileTIFF(this->asset, this);
+ return FILE_OK;
+ }
+ 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;
+ }
+ if( !strcmp(pref->name,"MPEG") ) { // MPEG file
+ if( !FileMPEG::check_sig(this->asset) ) continue;
+ file = new FileMPEG(this->asset, this);
+ return FILE_OK;
+ }
+ if( !strcmp(pref->name,"EDL") ) { // XML file
+ if( data[0] != '<' ) continue;
+ if( !strncmp(&data[1],"EDL>",4) ||
+ !strncmp(&data[1],"HTAL>",5) ||
+ !strncmp(&data[1],"?xml",4) )
+ return FILE_IS_XML;
+ }
+ }
+ return FILE_UNRECOGNIZED_CODEC; // maybe PCM file ?
+}
int File::open_file(Preferences *preferences,
Asset *asset,
this->wr = wr;
file = 0;
- if(debug) printf("File::open_file %d\n", __LINE__);
-
- if(debug) printf("File::open_file %p %d\n", this, __LINE__);
+ if( debug ) printf("File::open_file %p %d\n", this, __LINE__);
- switch(this->asset->format)
- {
+ switch( this->asset->format ) {
// get the format now
// If you add another format to case 0, you also need to add another case for the
// file format #define.
- case FILE_UNKNOWN:
- if(FileDB::check_sig(this->asset)) {
-// MediaDb file
- file = new FileDB(this->asset, this);
- break;
- }
-// if early probe enabled
- if( preferences->ffmpeg_early_probe &&
- FileFFMPEG::check_sig(this->asset)) {
- file = new FileFFMPEG(this->asset, this);
- break;
- }
-
- FILE *stream;
- if(!(stream = fopen(this->asset->path, "rb"))) {
-// file not found
- return 1;
- }
-
- char test[16]; memset(test,0,sizeof(test)); // int result =
- fread(test, 16, 1, stream);
-
- if(FileScene::check_sig(this->asset, test)) {
-// scene file
- fclose(stream);
- file = new FileScene(this->asset, this);
- break;
- }
- if(FileDV::check_sig(this->asset)) {
-// libdv
- fclose(stream);
- file = new FileDV(this->asset, this);
- break;
- }
- if(FileSndFile::check_sig(this->asset)) {
-// libsndfile
- fclose(stream);
- file = new FileSndFile(this->asset, this);
- break;
- }
- if(FilePNG::check_sig(this->asset)) {
-// PNG file
- fclose(stream);
- file = new FilePNG(this->asset, this);
- break;
- }
- if(FileJPEG::check_sig(this->asset)) {
-// JPEG file
- fclose(stream);
- file = new FileJPEG(this->asset, this);
- break;
- }
- if(FileGIF::check_sig(this->asset)) {
-// GIF file
- fclose(stream);
- file = new FileGIF(this->asset, this);
- break;
- }
- if(FileEXR::check_sig(this->asset, test)) {
-// EXR file
- fclose(stream);
- file = new FileEXR(this->asset, this);
- break;
- }
- if(FileFLAC::check_sig(this->asset, test)) {
-// FLAC file
- fclose(stream);
- file = new FileFLAC(this->asset, this);
- break;
- }
- if(FileCR2::check_sig(this->asset)) {
-// CR2 file
- fclose(stream);
- file = new FileCR2(this->asset, this);
- break;
- }
- if(FileTGA::check_sig(this->asset)) {
-// TGA file
- fclose(stream);
- file = new FileTGA(this->asset, this);
- break;
- }
- if(FileTIFF::check_sig(this->asset)) {
-// TIFF file
- fclose(stream);
- file = new FileTIFF(this->asset, this);
- break;
- }
- if(FileOGG::check_sig(this->asset)) {
-// OGG file
- fclose(stream);
- file = new FileOGG(this->asset, this);
- break;
- }
- if(FileVorbis::check_sig(this->asset)) {
-// VorbisFile file
- fclose(stream);
- file = new FileVorbis(this->asset, this);
- break;
- }
- if(FileMPEG::check_sig(this->asset)) {
-// MPEG file
- fclose(stream);
- file = new FileMPEG(this->asset, this);
- break;
- }
- if( test[0] == '<' && (
- !strncmp(&test[1],"EDL>",4) ||
- !strncmp(&test[1],"HTAL>",5) ||
- !strncmp(&test[1],"?xml",4) ) ) {
-// XML file
- fclose(stream);
- return FILE_IS_XML;
- } // can't load project file
- if( !preferences->ffmpeg_early_probe &&
- FileFFMPEG::check_sig(this->asset) ) {
- fclose(stream);
- file = new FileFFMPEG(this->asset, this);
- break;
- }
-// PCM file
- fclose(stream);
- return FILE_UNRECOGNIZED_CODEC;
- break;
-
+ case FILE_UNKNOWN: {
+ int ret = probe();
+ if( ret != FILE_OK ) return ret;
+ break; }
// format already determined
- case FILE_AC3:
- file = new FileAC3(this->asset, this);
- break;
-
- case FILE_SCENE:
- file = new FileScene(this->asset, this);
- break;
-
- case FILE_FFMPEG:
- file = new FileFFMPEG(this->asset, this);
- break;
-
- case FILE_PCM:
- case FILE_WAV:
- case FILE_AU:
- case FILE_AIFF:
- case FILE_SND:
+ case FILE_AC3:
+ file = new FileAC3(this->asset, this);
+ break;
+
+ case FILE_SCENE:
+ file = new FileScene(this->asset, this);
+ break;
+
+ case FILE_FFMPEG:
+ file = new FileFFMPEG(this->asset, this);
+ break;
+
+ case FILE_PCM:
+ case FILE_WAV:
+ case FILE_AU:
+ case FILE_AIFF:
+ case FILE_SND:
//printf("File::open_file 1\n");
- file = new FileSndFile(this->asset, this);
- break;
-
- case FILE_PNG:
- case FILE_PNG_LIST:
- file = new FilePNG(this->asset, this);
- break;
-
- case FILE_JPEG:
- case FILE_JPEG_LIST:
- file = new FileJPEG(this->asset, this);
- break;
-
- case FILE_GIF:
- case FILE_GIF_LIST:
- file = new FileGIF(this->asset, this);
- break;
-
- case FILE_EXR:
- case FILE_EXR_LIST:
- file = new FileEXR(this->asset, this);
- break;
-
- case FILE_FLAC:
- file = new FileFLAC(this->asset, this);
- break;
-
- case FILE_CR2:
- case FILE_CR2_LIST:
- file = new FileCR2(this->asset, this);
- break;
-
- case FILE_TGA_LIST:
- case FILE_TGA:
- file = new FileTGA(this->asset, this);
- break;
-
- case FILE_TIFF:
- case FILE_TIFF_LIST:
- file = new FileTIFF(this->asset, this);
- break;
-
- case FILE_DB:
- file = new FileDB(this->asset, this);
- break;
-
- case FILE_MPEG:
- case FILE_AMPEG:
- case FILE_VMPEG:
- file = new FileMPEG(this->asset, this);
- break;
-
- case FILE_OGG:
- file = new FileOGG(this->asset, this);
- break;
-
- case FILE_VORBIS:
- file = new FileVorbis(this->asset, this);
- break;
-
- case FILE_RAWDV:
- file = new FileDV(this->asset, this);
- break;
-
+ file = new FileSndFile(this->asset, this);
+ break;
+
+ case FILE_PNG:
+ case FILE_PNG_LIST:
+ file = new FilePNG(this->asset, this);
+ break;
+
+ case FILE_JPEG:
+ case FILE_JPEG_LIST:
+ file = new FileJPEG(this->asset, this);
+ break;
+
+ case FILE_GIF:
+ case FILE_GIF_LIST:
+ file = new FileGIF(this->asset, this);
+ break;
+#ifdef HAVE_OPENEXR
+ case FILE_EXR:
+ case FILE_EXR_LIST:
+ file = new FileEXR(this->asset, this);
+ break;
+#endif
+ case FILE_FLAC:
+ file = new FileFLAC(this->asset, this);
+ break;
+
+ case FILE_CR2:
+ case FILE_CR2_LIST:
+ file = new FileCR2(this->asset, this);
+ break;
+
+ case FILE_TGA_LIST:
+ case FILE_TGA:
+ file = new FileTGA(this->asset, this);
+ break;
+
+ case FILE_TIFF:
+ case FILE_TIFF_LIST:
+ file = new FileTIFF(this->asset, this);
+ break;
+
+ case FILE_DB:
+ file = new FileDB(this->asset, this);
+ break;
+
+ case FILE_MPEG:
+ case FILE_AMPEG:
+ case FILE_VMPEG:
+ file = new FileMPEG(this->asset, this);
+ break;
+
+ case FILE_OGG:
+ file = new FileOGG(this->asset, this);
+ break;
+
+ case FILE_VORBIS:
+ file = new FileVorbis(this->asset, this);
+ break;
+#ifdef HAVE_DV
+ case FILE_RAWDV:
+ file = new FileDV(this->asset, this);
+ break;
+#endif
// try plugins
- default:
- return 1;
- break;
+ default:
+ return 1;
+ break;
}
// Reopen file with correct parser and get header.
- if(file->open_file(rd, wr)) {
+ if( file->open_file(rd, wr) ) {
delete file; file = 0;
return FILE_NOT_FOUND;
}
// Set extra writing parameters to mandatory settings.
if( wr ) {
- if(this->asset->dither) file->set_dither();
+ if( this->asset->dither ) file->set_dither();
}
if( rd ) {
-// one frame image file, no specific length
- if( !this->asset->audio_data && this->asset->video_data &&
- this->asset->video_length <= 1 )
+// one frame image file, not brender, no specific length
+ if( !this->asset->audio_data && this->asset->use_header &&
+ 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
asset->copy_from(this->asset, 1);
//asset->dump();
- if(debug) printf("File::open_file %d file=%p\n", __LINE__, file);
+ if( debug ) printf("File::open_file %d file=%p\n", __LINE__, file);
// sleep(1);
return FILE_OK;
void File::delete_temp_samples_buffer()
{
- if(temp_samples_buffer) {
- for(int j = 0; j < audio_ring_buffers; j++) {
- for(int i = 0; i < asset->channels; i++) {
+ if( temp_samples_buffer ) {
+ for( int j = 0; j < audio_ring_buffers; j++ ) {
+ for( int i = 0; i < asset->channels; i++ ) {
delete temp_samples_buffer[j][i];
}
delete [] temp_samples_buffer[j];
void File::delete_temp_frame_buffer()
{
- if(temp_frame_buffer) {
- for(int k = 0; k < video_ring_buffers; k++) {
- for(int i = 0; i < asset->layers; i++) {
- for(int j = 0; j < video_buffer_size; j++) {
+ if( temp_frame_buffer ) {
+ for( int k = 0; k < video_ring_buffers; k++ ) {
+ for( int i = 0; i < asset->layers; i++ ) {
+ for( int j = 0; j < video_buffer_size; j++ ) {
delete temp_frame_buffer[k][i][j];
}
delete [] temp_frame_buffer[k][i];
{
const int debug = 0;
- if(debug) printf("File::close_file file=%p %d\n", file, __LINE__);
+ if( debug ) printf("File::close_file file=%p %d\n", file, __LINE__);
- if(!ignore_thread) {
+ if( !ignore_thread ) {
stop_audio_thread();
stop_video_thread();
}
- if(debug) printf("File::close_file file=%p %d\n", file, __LINE__);
- if(file) {
+ if( debug ) printf("File::close_file file=%p %d\n", file, __LINE__);
+ if( file ) {
// The file's asset is a copy of the argument passed to open_file so the
// user must copy lengths from the file's asset.
- if(asset && wr) {
+ if( asset && wr ) {
asset->audio_length = current_sample;
asset->video_length = current_frame;
}
file->close_file();
delete file;
}
- if(debug) printf("File::close_file file=%p %d\n", file, __LINE__);
+ if( debug ) printf("File::close_file file=%p %d\n", file, __LINE__);
delete_temp_samples_buffer();
delete_temp_frame_buffer();
- if(debug) printf("File::close_file file=%p %d\n", file, __LINE__);
+ if( debug ) printf("File::close_file file=%p %d\n", file, __LINE__);
- if(debug) printf("File::close_file file=%p %d\n", file, __LINE__);
+ if( debug ) printf("File::close_file file=%p %d\n", file, __LINE__);
reset_parameters();
- if(debug) printf("File::close_file file=%p %d\n", file, __LINE__);
+ if( debug ) printf("File::close_file file=%p %d\n", file, __LINE__);
return 0;
}
this->audio_ring_buffers = ring_buffers;
- if(!audio_thread)
- {
+ if( !audio_thread ) {
audio_thread = new FileThread(this, 1, 0);
audio_thread->start_writing(buffer_size, 0, ring_buffers, 0);
}
this->video_ring_buffers = ring_buffers;
this->video_buffer_size = buffer_size;
- if(!video_thread)
- {
+ if( !video_thread ) {
video_thread = new FileThread(this, 0, 1);
video_thread->start_writing(buffer_size,
color_model,
{
// Currently, CR2 is the only one which won't work asynchronously, so
// we're not using a virtual function yet.
- if(!video_thread /* && asset->format != FILE_CR2 */)
- {
+ if( !video_thread /* && asset->format != FILE_CR2 */ ) {
video_thread = new FileThread(this, 0, 1);
video_thread->start_reading();
use_cache = 0;
int File::stop_audio_thread()
{
- if(audio_thread)
- {
+ if( audio_thread ) {
audio_thread->stop_writing();
delete audio_thread;
audio_thread = 0;
int File::stop_video_thread()
{
- if(video_thread)
- {
+ if( video_thread ) {
video_thread->stop_reading();
video_thread->stop_writing();
delete video_thread;
int File::set_channel(int channel)
{
- if(file && channel < asset->channels)
- {
+ if( file && channel < asset->channels ) {
current_channel = channel;
return 0;
}
int File::set_layer(int layer, int is_thread)
{
- if(file && layer < asset->layers)
- {
- if(!is_thread && video_thread)
- {
+ if( file && layer < asset->layers ) {
+ if( !is_thread && video_thread ) {
video_thread->set_layer(layer);
}
- else
- {
+ else {
current_layer = layer;
}
return 0;
{
int64_t result = asset->audio_length;
int64_t base_samplerate = -1;
- if(result > 0)
- {
- if(base_samplerate > 0)
+ if( result > 0 ) {
+ if( base_samplerate > 0 )
return (int64_t)((double)result / asset->sample_rate * base_samplerate + 0.5);
else
return result;
{
int64_t result = asset->video_length;
float base_framerate = -1;
- if(result > 0)
- {
- if(base_framerate > 0)
+ if( result > 0 ) {
+ if( base_framerate > 0 )
return (int64_t)((double)result / asset->frame_rate * base_framerate + 0.5);
else
return result;
int64_t File::get_video_position()
{
float base_framerate = -1;
- if(base_framerate > 0)
+ if( base_framerate > 0 )
return (int64_t)((double)current_frame / asset->frame_rate * base_framerate + 0.5);
else
return current_frame;
int64_t File::get_audio_position()
{
// int64_t base_samplerate = -1;
-// if(base_samplerate > 0)
+// if( base_samplerate > 0 )
// {
-// if(normalized_sample_rate == base_samplerate)
+// if( normalized_sample_rate == base_samplerate )
// return normalized_sample;
// else
// return (int64_t)((double)current_sample /
{
int result = 0;
- if(!file) return 1;
+ if( !file ) return 1;
#define REPOSITION(x, y) \
(labs((x) - (y)) > 1)
// normalized_sample);
result = file->set_audio_position(current_sample);
- if(result)
+ if( result )
printf("File::set_audio_position position=%jd"
" base_samplerate=%f asset=%p asset->sample_rate=%d\n",
position, base_samplerate, asset, asset->sample_rate);
int is_thread)
{
int result = 0;
- if(!file) return 0;
+ if( !file ) return 0;
// Convert to file's rate
-// if(base_framerate > 0)
+// if( base_framerate > 0 )
// position = (int64_t)((double)position /
// base_framerate *
// asset->frame_rate +
// 0.5);
- if(video_thread && !is_thread)
- {
+ if( video_thread && !is_thread ) {
// Call thread. Thread calls this again to set the file state.
video_thread->set_video_position(position);
}
else
- if(current_frame != position)
- {
- if(file)
- {
+ if( current_frame != position ) {
+ if( file ) {
current_frame = position;
result = file->set_video_position(current_frame);
}
{
int result = 1;
- if(file)
- {
+ if( file ) {
write_lock->lock("File::write_samples");
// Convert to arrays for backwards compatability
double *temp[asset->channels];
- for(int i = 0; i < asset->channels; i++)
- {
+ for( int i = 0; i < asset->channels; i++ ) {
temp[i] = buffer[i]->get_data();
}
int File::write_audio_buffer(int64_t len)
{
int result = 0;
- if(audio_thread)
- {
+ if( audio_thread ) {
result = audio_thread->write_buffer(len);
}
return result;
int File::write_video_buffer(int64_t len)
{
int result = 0;
- if(video_thread)
- {
+ if( video_thread ) {
result = video_thread->write_buffer(len);
}
Samples** File::get_audio_buffer()
{
- if(audio_thread) return audio_thread->get_audio_buffer();
+ if( audio_thread ) return audio_thread->get_audio_buffer();
return 0;
}
VFrame*** File::get_video_buffer()
{
- if(video_thread)
- {
+ if( video_thread ) {
VFrame*** result = video_thread->get_video_buffer();
return result;
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;
+ if( len <= 0 ) return 0;
int result = 0;
const int debug = 0;
- if(debug) PRINT_TRACE
+ if( debug ) PRINT_TRACE
- if(debug) PRINT_TRACE
+ if( debug ) PRINT_TRACE
double *buffer = samples->get_data();
int64_t base_samplerate = asset->sample_rate;
- if(file)
- {
+ if( file ) {
// Resample recursively calls this with the asset sample rate
- if(base_samplerate == 0) base_samplerate = asset->sample_rate;
+ if( base_samplerate == 0 ) base_samplerate = asset->sample_rate;
- if(debug) PRINT_TRACE
+ if( debug ) PRINT_TRACE
result = file->read_samples(buffer, len);
- if(debug) PRINT_TRACE
+ if( debug ) PRINT_TRACE
current_sample += len;
normalized_sample += len;
}
- if(debug) PRINT_TRACE
+ if( debug ) PRINT_TRACE
return result;
}
int File::read_frame(VFrame *frame, int is_thread)
{
const int debug = 0;
-
- if(debug) PRINT_TRACE
-
-//printf("File::read_frame %d\n", __LINE__);
-
- if(video_thread && !is_thread) return video_thread->read_frame(frame);
-
-//printf("File::read_frame %d\n", __LINE__);
- if(debug) PRINT_TRACE
+//printf("File::read_frame pos=%jd cache=%d 1frame=%d\n",
+// current_frame, use_cache, asset->single_frame);
+ if( video_thread && !is_thread ) return video_thread->read_frame(frame);
if( !file ) return 1;
- if(debug) PRINT_TRACE
+ 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->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) )
- {
+ current_layer, asset->frame_rate) ) {
// Can't advance position if cache used.
//printf("File::read_frame %d\n", __LINE__);
advance_position = 0;
}
// Need temp
- else if(frame->get_color_model() != BC_COMPRESSED &&
+ else if( frame->get_color_model() != BC_COMPRESSED &&
(supported_colormodel != frame->get_color_model() ||
- frame->get_w() != asset->width ||
- frame->get_h() != asset->height))
- {
+ (!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))
- {
+ if( temp_frame ) {
+ if( !temp_frame->params_match(asset->width, asset->height, supported_colormodel) ) {
delete temp_frame;
temp_frame = 0;
}
}
-// printf("File::read_frame %d\n", __LINE__);
- if(!temp_frame)
- {
- temp_frame = new VFrame(0,
- -1,
- asset->width,
- asset->height,
- supported_colormodel,
- -1);
+ if( !temp_frame ) {
+ temp_frame = new VFrame(asset->width, asset->height, supported_colormodel, 0);
}
// printf("File::read_frame %d\n", __LINE__);
temp_frame->copy_stacks(frame);
- int result = file->read_frame(temp_frame);
- if( result && frame->get_status() > 0 )
+ result = file->read_frame(temp_frame);
+ if( !result )
+ frame->transfer_from(temp_frame);
+ else if( result && frame->get_status() > 0 )
frame->set_status(-1);
-//for(int i = 0; i < 1000 * 1000; i++) ((float*)temp_frame->get_rows()[0])[i] = 1.0;
-// printf("File::read_frame %d %d %d %d %d %d\n",
-// temp_frame->get_color_model(),
-// temp_frame->get_w(),
-// temp_frame->get_h(),
-// frame->get_color_model(),
-// frame->get_w(),
-// frame->get_h());
- BC_CModels::transfer(frame->get_rows(), temp_frame->get_rows(),
- frame->get_y(), frame->get_u(), frame->get_v(),
- temp_frame->get_y(), temp_frame->get_u(), temp_frame->get_v(),
- 0, 0, temp_frame->get_w(), temp_frame->get_h(),
- 0, 0, frame->get_w(), frame->get_h(),
- temp_frame->get_color_model(),
- frame->get_color_model(), 0, temp_frame->get_w(),
- frame->get_w());
-// printf("File::read_frame %d\n", __LINE__);
+//printf("File::read_frame %d\n", __LINE__);
}
- else
- {
+ else {
// Can't advance position here because it needs to be added to cache
//printf("File::read_frame %d\n", __LINE__);
- int result = file->read_frame(frame);
+ result = file->read_frame(frame);
if( result && frame->get_status() > 0 )
frame->set_status(-1);
-//for(int i = 0; i < 100 * 1000; i++) ((float*)frame->get_rows()[0])[i] = 1.0;
+//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(debug) PRINT_TRACE
+ if( advance_position ) current_frame++;
+ if( debug ) PRINT_TRACE
return 0;
}
-int File::can_copy_from(Asset *asset,
- int64_t position,
- int output_w,
- int output_h)
+int File::can_copy_from(Asset *asset, int64_t position, int output_w, int output_h)
{
- if(!asset) return 0;
-
- if(file)
- {
+ if( asset && file ) {
return asset->width == output_w &&
asset->height == output_h &&
file->can_copy_from(asset, position);
}
- else
- return 0;
+ return 0;
}
// Fill in queries about formats when adding formats here.
int File::strtoformat(const char *format)
{
- return strtoformat(0, format);
-}
-
-int File::strtoformat(ArrayList<PluginServer*> *plugindb, const char *format)
-{
- if(!strcasecmp(format, _(AC3_NAME))) return FILE_AC3;
- if(!strcasecmp(format, _(SCENE_NAME))) return FILE_SCENE;
- if(!strcasecmp(format, _(WAV_NAME))) return FILE_WAV;
- if(!strcasecmp(format, _(PCM_NAME))) return FILE_PCM;
- if(!strcasecmp(format, _(AU_NAME))) return FILE_AU;
- if(!strcasecmp(format, _(AIFF_NAME))) return FILE_AIFF;
- if(!strcasecmp(format, _(SND_NAME))) return FILE_SND;
- if(!strcasecmp(format, _(PNG_NAME))) return FILE_PNG;
- if(!strcasecmp(format, _(PNG_LIST_NAME))) return FILE_PNG_LIST;
- if(!strcasecmp(format, _(TIFF_NAME))) return FILE_TIFF;
- if(!strcasecmp(format, _(TIFF_LIST_NAME))) return FILE_TIFF_LIST;
- if(!strcasecmp(format, _(JPEG_NAME))) return FILE_JPEG;
- if(!strcasecmp(format, _(JPEG_LIST_NAME))) return FILE_JPEG_LIST;
- if(!strcasecmp(format, _(EXR_NAME))) return FILE_EXR;
- if(!strcasecmp(format, _(EXR_LIST_NAME))) return FILE_EXR_LIST;
- if(!strcasecmp(format, _(FLAC_NAME))) return FILE_FLAC;
- if(!strcasecmp(format, _(CR2_NAME))) return FILE_CR2;
- if(!strcasecmp(format, _(CR2_LIST_NAME))) return FILE_CR2_LIST;
- if(!strcasecmp(format, _(MPEG_NAME))) return FILE_MPEG;
- if(!strcasecmp(format, _(AMPEG_NAME))) return FILE_AMPEG;
- 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, _(AC3_NAME)) ) return FILE_AC3;
+ if( !strcasecmp(format, _(SCENE_NAME)) ) return FILE_SCENE;
+ if( !strcasecmp(format, _(WAV_NAME)) ) return FILE_WAV;
+ if( !strcasecmp(format, _(PCM_NAME)) ) return FILE_PCM;
+ if( !strcasecmp(format, _(AU_NAME)) ) return FILE_AU;
+ if( !strcasecmp(format, _(AIFF_NAME)) ) return FILE_AIFF;
+ if( !strcasecmp(format, _(SND_NAME)) ) return FILE_SND;
+ if( !strcasecmp(format, _(PNG_NAME)) ) return FILE_PNG;
+ if( !strcasecmp(format, _(PNG_LIST_NAME)) ) return FILE_PNG_LIST;
+ if( !strcasecmp(format, _(TIFF_NAME)) ) return FILE_TIFF;
+ if( !strcasecmp(format, _(TIFF_LIST_NAME)) ) return FILE_TIFF_LIST;
+ if( !strcasecmp(format, _(JPEG_NAME)) ) return FILE_JPEG;
+ if( !strcasecmp(format, _(JPEG_LIST_NAME)) ) return FILE_JPEG_LIST;
+ if( !strcasecmp(format, _(EXR_NAME)) ) return FILE_EXR;
+ if( !strcasecmp(format, _(EXR_LIST_NAME)) ) return FILE_EXR_LIST;
+ if( !strcasecmp(format, _(FLAC_NAME)) ) return FILE_FLAC;
+ if( !strcasecmp(format, _(CR2_NAME)) ) return FILE_CR2;
+ if( !strcasecmp(format, _(CR2_LIST_NAME)) ) return FILE_CR2_LIST;
+ if( !strcasecmp(format, _(MPEG_NAME)) ) return FILE_MPEG;
+ if( !strcasecmp(format, _(AMPEG_NAME)) ) return FILE_AMPEG;
+ 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;
return 0;
}
const char* File::formattostr(int format)
{
- return formattostr(0, format);
-}
-
-const char* File::formattostr(ArrayList<PluginServer*> *plugindb, int format)
-{
- switch(format)
- {
- case FILE_SCENE: return _(SCENE_NAME);
- case FILE_AC3: return _(AC3_NAME);
- case FILE_WAV: return _(WAV_NAME);
- case FILE_PCM: return _(PCM_NAME);
- case FILE_AU: return _(AU_NAME);
- case FILE_AIFF: return _(AIFF_NAME);
- case FILE_SND: return _(SND_NAME);
- case FILE_PNG: return _(PNG_NAME);
- case FILE_PNG_LIST: return _(PNG_LIST_NAME);
- case FILE_JPEG: return _(JPEG_NAME);
- case FILE_JPEG_LIST: return _(JPEG_LIST_NAME);
- case FILE_CR2: return _(CR2_NAME);
- case FILE_CR2_LIST: return _(CR2_LIST_NAME);
- case FILE_FLAC: return _(FLAC_NAME);
- case FILE_EXR: return _(EXR_NAME);
- case FILE_EXR_LIST: return _(EXR_LIST_NAME);
- case FILE_MPEG: return _(MPEG_NAME);
- case FILE_AMPEG: return _(AMPEG_NAME);
- case FILE_VMPEG: return _(VMPEG_NAME);
- case FILE_TGA: return _(TGA_NAME);
- 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);
+ switch( format ) {
+ case FILE_SCENE: return _(SCENE_NAME);
+ case FILE_AC3: return _(AC3_NAME);
+ case FILE_WAV: return _(WAV_NAME);
+ case FILE_PCM: return _(PCM_NAME);
+ case FILE_AU: return _(AU_NAME);
+ case FILE_AIFF: return _(AIFF_NAME);
+ case FILE_SND: return _(SND_NAME);
+ case FILE_PNG: return _(PNG_NAME);
+ case FILE_PNG_LIST: return _(PNG_LIST_NAME);
+ case FILE_JPEG: return _(JPEG_NAME);
+ case FILE_JPEG_LIST: return _(JPEG_LIST_NAME);
+ case FILE_CR2: return _(CR2_NAME);
+ case FILE_CR2_LIST: return _(CR2_LIST_NAME);
+ case FILE_FLAC: return _(FLAC_NAME);
+ case FILE_EXR: return _(EXR_NAME);
+ case FILE_EXR_LIST: return _(EXR_LIST_NAME);
+ case FILE_MPEG: return _(MPEG_NAME);
+ case FILE_AMPEG: return _(AMPEG_NAME);
+ case FILE_VMPEG: return _(VMPEG_NAME);
+ case FILE_TGA: return _(TGA_NAME);
+ 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);
}
return _("Unknown");
}
int File::strtobits(const char *bits)
{
- if(!strcasecmp(bits, _(NAME_8BIT))) return BITSLINEAR8;
- if(!strcasecmp(bits, _(NAME_16BIT))) return BITSLINEAR16;
- if(!strcasecmp(bits, _(NAME_24BIT))) return BITSLINEAR24;
- if(!strcasecmp(bits, _(NAME_32BIT))) return BITSLINEAR32;
- if(!strcasecmp(bits, _(NAME_ULAW))) return BITSULAW;
- if(!strcasecmp(bits, _(NAME_ADPCM))) return BITS_ADPCM;
- if(!strcasecmp(bits, _(NAME_FLOAT))) return BITSFLOAT;
+ if( !strcasecmp(bits, _(NAME_8BIT)) ) return BITSLINEAR8;
+ if( !strcasecmp(bits, _(NAME_16BIT)) ) return BITSLINEAR16;
+ if( !strcasecmp(bits, _(NAME_24BIT)) ) return BITSLINEAR24;
+ if( !strcasecmp(bits, _(NAME_32BIT)) ) return BITSLINEAR32;
+ if( !strcasecmp(bits, _(NAME_ULAW)) ) return BITSULAW;
+ if( !strcasecmp(bits, _(NAME_ADPCM)) ) return BITS_ADPCM;
+ if( !strcasecmp(bits, _(NAME_FLOAT)) ) return BITSFLOAT;
return BITSLINEAR16;
}
const char* File::bitstostr(int bits)
{
//printf("File::bitstostr\n");
- switch(bits)
- {
- case BITSLINEAR8: return (NAME_8BIT);
- case BITSLINEAR16: return (NAME_16BIT);
- case BITSLINEAR24: return (NAME_24BIT);
- case BITSLINEAR32: return (NAME_32BIT);
- case BITSULAW: return (NAME_ULAW);
- case BITS_ADPCM: return (NAME_ADPCM);
- case BITSFLOAT: return (NAME_FLOAT);
+ switch( bits ) {
+ case BITSLINEAR8: return (NAME_8BIT);
+ case BITSLINEAR16: return (NAME_16BIT);
+ case BITSLINEAR24: return (NAME_24BIT);
+ case BITSLINEAR32: return (NAME_32BIT);
+ case BITSULAW: return (NAME_ULAW);
+ case BITS_ADPCM: return (NAME_ADPCM);
+ case BITSFLOAT: return (NAME_FLOAT);
}
return _("Unknown");
}
int File::str_to_byteorder(const char *string)
{
- if(!strcasecmp(string, _("Lo Hi"))) return 1;
+ if( !strcasecmp(string, _("Lo Hi")) ) return 1;
return 0;
}
const char* File::byteorder_to_str(int byte_order)
{
- if(byte_order) return _("Lo Hi");
+ if( byte_order ) return _("Lo Hi");
return _("Hi Lo");
}
int File::bytes_per_sample(int bits)
{
- switch(bits)
- {
- case BITSLINEAR8: return 1;
- case BITSLINEAR16: return 2;
- case BITSLINEAR24: return 3;
- case BITSLINEAR32: return 4;
- case BITSULAW: return 1;
+ switch( bits ) {
+ case BITSLINEAR8: return 1;
+ case BITSLINEAR16: return 2;
+ case BITSLINEAR24: return 3;
+ case BITSLINEAR32: return 4;
+ case BITSULAW: return 1;
}
return 1;
}
int File::get_best_colormodel(Asset *asset, int driver)
{
- switch(asset->format)
- {
- case FILE_RAWDV: return FileDV::get_best_colormodel(asset, driver);
- case FILE_MPEG: return FileMPEG::get_best_colormodel(asset, driver);
- case FILE_JPEG:
- case FILE_JPEG_LIST: return FileJPEG::get_best_colormodel(asset, driver);
- case FILE_EXR:
- case FILE_EXR_LIST: return FileEXR::get_best_colormodel(asset, driver);
- case FILE_PNG:
- case FILE_PNG_LIST: return FilePNG::get_best_colormodel(asset, driver);
- case FILE_TGA:
- case FILE_TGA_LIST: return FileTGA::get_best_colormodel(asset, driver);
- case FILE_CR2:
- case FILE_CR2_LIST: return FileCR2::get_best_colormodel(asset, driver);
- case FILE_DB: return FileDB::get_best_colormodel(asset, driver);
+ switch( asset->format ) {
+#ifdef HAVE_DV
+ case FILE_RAWDV: return FileDV::get_best_colormodel(asset, driver);
+#endif
+ case FILE_MPEG: return FileMPEG::get_best_colormodel(asset, driver);
+ case FILE_JPEG:
+ case FILE_JPEG_LIST: return FileJPEG::get_best_colormodel(asset, driver);
+#ifdef HAVE_OPENEXR
+ case FILE_EXR:
+ case FILE_EXR_LIST: return FileEXR::get_best_colormodel(asset, driver);
+#endif
+ case FILE_PNG:
+ case FILE_PNG_LIST: return FilePNG::get_best_colormodel(asset, driver);
+ case FILE_TGA:
+ case FILE_TGA_LIST: return FileTGA::get_best_colormodel(asset, driver);
+ case FILE_CR2:
+ case FILE_CR2_LIST: return FileCR2::get_best_colormodel(asset, driver);
+ case FILE_DB: return FileDB::get_best_colormodel(asset, driver);
+ case FILE_FFMPEG: return FileFFMPEG::get_best_colormodel(asset, driver);
}
return BC_RGB888;
int File::colormodel_supported(int colormodel)
{
- if(file)
+ if( file )
return file->colormodel_supported(colormodel);
return BC_RGB888;
int64_t result = 0;
result += file_memory_usage();
- if(temp_frame) result += temp_frame->get_data_size();
+ if( temp_frame ) result += temp_frame->get_data_size();
result += frame_cache->get_memory_usage();
- if(video_thread) result += video_thread->get_memory_usage();
+ if( video_thread ) result += video_thread->get_memory_usage();
- if(result < MIN_CACHEITEM_SIZE) result = MIN_CACHEITEM_SIZE;
+ if( result < MIN_CACHEITEM_SIZE ) result = MIN_CACHEITEM_SIZE;
return result;
}
-int File::supports_video(ArrayList<PluginServer*> *plugindb, char *format)
-{
- int format_i = strtoformat(plugindb, format);
-
- return supports_video(format_i);
+int File::renders_video(int format)
+{
+ switch( format ) {
+ case FILE_OGG:
+ case FILE_JPEG:
+ case FILE_JPEG_LIST:
+ case FILE_CR2:
+ case FILE_CR2_LIST:
+ case FILE_EXR:
+ case FILE_EXR_LIST:
+ case FILE_PNG:
+ case FILE_PNG_LIST:
+ case FILE_TGA:
+ case FILE_TGA_LIST:
+ case FILE_TIFF:
+ case FILE_TIFF_LIST:
+ case FILE_VMPEG:
+ case FILE_RAWDV:
+ case FILE_FFMPEG:
+ return 1;
+ }
return 0;
}
-
-int File::supports_audio(ArrayList<PluginServer*> *plugindb, char *format)
+int File::renders_video(Asset *asset)
{
- int format_i = strtoformat(plugindb, format);
-
- return supports_audio(format_i);
- return 0;
+ return asset->format == FILE_FFMPEG ?
+ FileFFMPEG::renders_video(asset->fformat) :
+ renders_video(asset->format);
}
-
-int File::supports_video(int format)
-{
-//printf("File::supports_video %d\n", format);
- switch(format)
- {
- case FILE_OGG:
- case FILE_JPEG:
- case FILE_JPEG_LIST:
- case FILE_CR2:
- case FILE_CR2_LIST:
- case FILE_EXR:
- case FILE_EXR_LIST:
- case FILE_PNG:
- case FILE_PNG_LIST:
- case FILE_TGA:
- case FILE_TGA_LIST:
- case FILE_TIFF:
- case FILE_TIFF_LIST:
- case FILE_VMPEG:
- case FILE_FFMPEG:
- case FILE_RAWDV:
- return 1;
+int File::renders_audio(int format)
+{
+ switch( format ) {
+ case FILE_AC3:
+ 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_SND:
+ case FILE_RAWDV:
+ case FILE_FFMPEG:
+ return 1;
}
return 0;
}
+int File::renders_audio(Asset *asset)
+{
+ return asset->format == FILE_FFMPEG ?
+ FileFFMPEG::renders_audio(asset->fformat) :
+ renders_audio(asset->format);
+}
-int File::supports_audio(int format)
-{
- switch(format)
- {
- case FILE_AC3:
- 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_SND:
- case FILE_FFMPEG:
- return 1;
+int File::is_image_render(int format)
+{
+ switch( format ) {
+ case FILE_EXR:
+ case FILE_JPEG:
+ case FILE_PNG:
+ case FILE_TGA:
+ case FILE_TIFF:
+ return 1;
}
+
return 0;
}
const char* File::get_tag(int format)
{
- switch(format)
- {
- case FILE_AC3: return "ac3";
- case FILE_AIFF: return "aif";
- case FILE_AMPEG: return "mp3";
- case FILE_AU: return "au";
- case FILE_RAWDV: return "dv";
- case FILE_DB: return "db";
- case FILE_EXR: return "exr";
- case FILE_EXR_LIST: return "exr";
- case FILE_FLAC: return "flac";
- case FILE_JPEG: return "jpg";
- case FILE_JPEG_LIST: return "jpg";
- case FILE_OGG: return "ogg";
- case FILE_PCM: return "pcm";
- case FILE_PNG: return "png";
- case FILE_PNG_LIST: return "png";
- case FILE_TGA: return "tga";
- case FILE_TGA_LIST: return "tga";
- case FILE_TIFF: return "tif";
- case FILE_TIFF_LIST: return "tif";
- case FILE_VMPEG: return "m2v";
- case FILE_VORBIS: return "ogg";
- case FILE_WAV: return "wav";
- case FILE_FFMPEG: return "ffmpg";
+ switch( format ) {
+ case FILE_AC3: return "ac3";
+ case FILE_AIFF: return "aif";
+ case FILE_AMPEG: return "mp3";
+ case FILE_AU: return "au";
+ case FILE_RAWDV: return "dv";
+ case FILE_DB: return "db";
+ case FILE_EXR: return "exr";
+ case FILE_EXR_LIST: return "exr";
+ case FILE_FLAC: return "flac";
+ case FILE_JPEG: return "jpg";
+ case FILE_JPEG_LIST: return "jpg";
+ case FILE_OGG: return "ogg";
+ case FILE_PCM: return "pcm";
+ case FILE_PNG: return "png";
+ case FILE_PNG_LIST: return "png";
+ case FILE_TGA: return "tga";
+ case FILE_TGA_LIST: return "tga";
+ case FILE_TIFF: return "tif";
+ case FILE_TIFF_LIST: return "tif";
+ case FILE_VMPEG: return "m2v";
+ case FILE_VORBIS: return "ogg";
+ case FILE_WAV: return "wav";
+ case FILE_FFMPEG: return "ffmpg";
}
return 0;
}
const char* File::get_prefix(int format)
{
- switch(format) {
+ switch( format ) {
case FILE_PCM: return "PCM";
case FILE_WAV: return "WAV";
case FILE_PNG: return "PNG";
PackagingEngine *File::new_packaging_engine(Asset *asset)
{
PackagingEngine *result;
- switch (asset->format)
- {
- case FILE_OGG:
- result = (PackagingEngine*)new PackagingEngineOGG();
- break;
- default:
- result = (PackagingEngine*) new PackagingEngineDefault();
- break;
+ switch( asset->format ) {
+ case FILE_OGG:
+ result = (PackagingEngine*)new PackagingEngineOGG();
+ break;
+ default:
+ result = (PackagingEngine*) new PackagingEngineDefault();
+ break;
}
return result;
}
-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;
+}
+
+void File::setenv_path(char *result, const char *var, const char *path)
+{
+ char *env = getenv(var);
+ if( env ) return;
+ char env_path[BCTEXTLEN];
+ getenv_path(env_path, path);
+ sprintf(result, "%s=%s", var, env_path);
+ putenv(result);
+}
+
+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];
+char File::cinbwr_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);
+
+ setenv_path(cindat_path, "CIN_DAT", CINDAT_DIR);
+ setenv_path(cinlib_path, "CIN_LIB", CINLIB_DIR);
+ setenv_path(cincfg_path, "CIN_CONFIG", CONFIG_DIR);
+ setenv_path(cinplg_path, "CIN_PLUGIN", PLUGIN_DIR);
+ setenv_path(cinlad_path, "CIN_LADSPA", LADSPA_DIR);
+ setenv_path(cinlcl_path, "CIN_LOCALE", LOCALE_DIR);
+ setenv_path(cinbwr_path, "CIN_BROWSER", CIN_BROWSER);
}