18 #include "filesndfile.h"
20 #include "filethread.h"
22 #include "filevorbis.h"
23 #include "formatwindow.h"
24 #include "framecache.h"
26 #include "pluginserver.h"
28 #include "stringfile.h"
38 format_completion = new Mutex("File::format_completion");
39 write_lock = new Condition(1, "File::write_lock");
40 frame_cache = new FrameCache;
48 if(format_window) format_window->set_done(0);
49 format_completion->lock("File::~File");
50 format_completion->unlock();
53 if(temp_frame) delete temp_frame;
58 delete format_completion;
60 if(frame_cache) delete frame_cache;
63 void File::reset_parameters()
75 normalized_sample = 0;
76 normalized_sample_rate = 0;
81 int File::raise_window()
83 if(getting_options && format_window)
85 format_window->raise_window();
86 format_window->flush();
91 void File::close_window()
95 format_window->lock_window("File::close_window");
96 format_window->set_done(1);
97 format_window->unlock_window();
102 int File::get_options(BC_WindowBase *parent_window,
103 ArrayList<PluginServer*> *plugindb,
110 format_completion->lock("File::get_options");
111 switch(asset->format)
114 FileAC3::get_parameters(parent_window,
125 FileSndFile::get_parameters(parent_window,
132 FileMOV::get_parameters(parent_window,
141 FileMPEG::get_parameters(parent_window,
148 FileMOV::get_parameters(parent_window,
155 case FILE_AVI_LAVTOOLS:
158 case FILE_AVI_AVIFILE:
159 FileAVI::get_parameters(parent_window,
168 FileJPEG::get_parameters(parent_window,
176 FileEXR::get_parameters(parent_window,
184 FilePNG::get_parameters(parent_window,
192 FileTGA::get_parameters(parent_window,
200 FileTIFF::get_parameters(parent_window,
207 FileVorbis::get_parameters(parent_window,
219 ErrorBox *errorbox = new ErrorBox(PROGRAM_NAME ": Error",
220 parent_window->get_abs_cursor_x(1),
221 parent_window->get_abs_cursor_y(1));
222 format_window = errorbox;
225 errorbox->create_objects(_("This format doesn't support audio."));
228 errorbox->create_objects(_("This format doesn't support video."));
229 errorbox->run_window();
235 format_completion->unlock();
239 void File::set_asset(Asset *asset)
241 *this->asset = *asset;
244 int File::set_processors(int cpus) // Set the number of cpus for certain codecs
250 int File::set_preload(int64_t size)
252 this->playback_preload = size;
256 void File::set_cache_frames(int value)
261 int File::purge_cache()
263 return frame_cache->delete_oldest();
276 int File::open_file(ArrayList<PluginServer*> *plugindb,
280 int64_t base_samplerate,
281 float base_framerate)
283 *this->asset = *asset;
287 //printf("File::open_file 1 %s %d\n", asset->path, asset->format);
288 switch(this->asset->format)
290 // get the format now
291 // If you add another format to case 0, you also need to add another case for the
292 // file format #define.
295 if(!(stream = fopen(this->asset->path, "rb")))
302 fread(test, 16, 1, stream);
304 // if(FileAVI::check_sig(this->asset))
307 // file = new FileAVI(this->asset, this);
310 if(FileSndFile::check_sig(this->asset))
314 file = new FileSndFile(this->asset, this);
317 if(FilePNG::check_sig(this->asset))
321 file = new FilePNG(this->asset, this);
324 if(FileJPEG::check_sig(this->asset))
328 file = new FileJPEG(this->asset, this);
331 if(FileEXR::check_sig(this->asset, test))
335 file = new FileEXR(this->asset, this);
338 if(FileTGA::check_sig(this->asset))
342 file = new FileTGA(this->asset, this);
345 if(FileTIFF::check_sig(this->asset))
349 file = new FileTIFF(this->asset, this);
352 if(FileVorbis::check_sig(this->asset))
356 file = new FileVorbis(this->asset, this);
359 if(FileMPEG::check_sig(this->asset))
363 file = new FileMPEG(this->asset, this);
366 if(test[0] == '<' && test[1] == 'E' && test[2] == 'D' && test[3] == 'L' && test[4] == '>' ||
367 test[0] == '<' && test[1] == 'H' && test[2] == 'T' && test[3] == 'A' && test[4] == 'L' && test[5] == '>' ||
368 test[0] == '<' && test[1] == '?' && test[2] == 'x' && test[3] == 'm' && test[4] == 'l')
373 } // can't load project file
375 if(FileMOV::check_sig(this->asset))
378 // should be last because quicktime lacks a magic number
380 file = new FileMOV(this->asset, this);
386 return FILE_UNRECOGNIZED_CODEC;
390 // format already determined
392 file = new FileAC3(this->asset, this);
400 //printf("File::open_file 1\n");
401 file = new FileSndFile(this->asset, this);
406 file = new FilePNG(this->asset, this);
411 file = new FileJPEG(this->asset, this);
416 file = new FileEXR(this->asset, this);
421 file = new FileTGA(this->asset, this);
426 file = new FileTIFF(this->asset, this);
430 file = new FileMOV(this->asset, this);
436 file = new FileMPEG(this->asset, this);
440 file = new FileVorbis(this->asset, this);
444 file = new FileMOV(this->asset, this);
447 case FILE_AVI_LAVTOOLS:
450 case FILE_AVI_AVIFILE:
451 file = new FileAVI(this->asset, this);
459 //printf("File::open_file 2\n");
461 // Reopen file with correct parser and get header.
462 if(file->open_file(rd, wr))
464 //printf("File::open_file 2.5\n");
468 //printf("File::open_file 3\n");
471 // Set extra writing parameters to mandatory settings.
474 if(this->asset->dither) file->set_dither();
477 // Synchronize header parameters
478 *asset = *this->asset;
483 return FILE_NOT_FOUND;
486 int File::close_file(int ignore_thread)
496 // The file's asset is a copy of the argument passed to open_file so the
497 // user must copy lengths from the file's asset.
498 if(asset && file->wr)
500 asset->audio_length = current_sample;
501 asset->video_length = current_frame;
507 if(resample) delete resample;
513 int File::start_audio_thread(int64_t buffer_size, int ring_buffers)
515 audio_thread = new FileThread(this, 1, 0);
516 audio_thread->start_writing(buffer_size, 0, ring_buffers, 0);
520 int File::start_video_thread(int64_t buffer_size,
525 video_thread = new FileThread(this, 0, 1);
526 //printf("File::start_video_thread 1\n");
527 video_thread->start_writing(buffer_size,
531 //printf("File::start_video_thread 2\n");
535 int File::stop_audio_thread()
537 //printf("File::stop_audio_thread 1\n");
540 audio_thread->stop_writing();
547 int File::stop_video_thread()
549 //printf("File::stop_video_thread 1\n");
552 video_thread->stop_writing();
559 int File::lock_read()
565 int File::unlock_read()
567 // read_lock.unlock();
571 int File::set_channel(int channel)
573 if(file && channel < asset->channels)
575 current_channel = channel;
582 int File::set_layer(int layer)
584 if(file && layer < asset->layers)
586 current_layer = layer;
587 //printf("File::set_layer 1 %d\n", layer);
594 int64_t File::get_audio_length(int64_t base_samplerate)
596 int64_t result = asset->audio_length;
599 if(base_samplerate > 0)
600 return (int64_t)((double)result / asset->sample_rate * base_samplerate + 0.5);
608 int64_t File::get_video_length(float base_framerate)
610 int64_t result = asset->video_length;
613 if(base_framerate > 0)
614 return (int64_t)((double)result / asset->frame_rate * base_framerate + 0.5);
619 return -1; // infinity
623 int64_t File::get_video_position(float base_framerate)
625 if(base_framerate > 0)
626 return (int64_t)((double)current_frame / asset->frame_rate * base_framerate + 0.5);
628 return current_frame;
631 int64_t File::get_audio_position(int64_t base_samplerate)
633 if(base_samplerate > 0)
635 if(normalized_sample_rate == base_samplerate)
636 return normalized_sample;
638 return (int64_t)((double)current_sample /
644 return current_sample;
649 // The base samplerate must be nonzero if the base samplerate in the calling
650 // function is expected to change as this forces the resampler to reset.
652 int File::set_audio_position(int64_t position, float base_samplerate)
658 #define REPOSITION(x, y) \
659 (labs((x) - (y)) > 1)
663 if((base_samplerate && REPOSITION(normalized_sample, position)) ||
664 (!base_samplerate && REPOSITION(current_sample, position)))
666 // Can't reset resampler since one seek operation is done
667 // for every channel to be read at the same position.
669 // Use a conditional reset for just the case of different base_samplerates
670 if(base_samplerate > 0)
672 if(normalized_sample_rate &&
673 normalized_sample_rate != base_samplerate &&
677 normalized_sample = position;
678 normalized_sample_rate = (int64_t)((base_samplerate > 0) ?
682 // Convert position to file's rate
683 if(base_samplerate > 0)
684 current_sample = Units::round((double)position /
690 current_sample = position;
691 normalized_sample = Units::round((double)position /
693 normalized_sample_rate);
694 // Can not set the normalized sample rate since this would reset the resampler.
697 result = file->set_audio_position(current_sample);
700 printf("File::set_audio_position position=%d base_samplerate=%f asset=%p asset->sample_rate=%d\n",
701 position, base_samplerate, asset, asset->sample_rate);
704 //printf("File::set_audio_position %d %d %d\n", current_channel, current_sample, position);
709 int File::set_video_position(int64_t position, float base_framerate)
714 // Convert to file's rate
715 if(base_framerate > 0)
716 position = (int64_t)((double)position /
722 if(current_frame != position && file)
724 current_frame = position;
725 result = file->set_video_position(current_frame);
731 // No resampling here.
732 int File::write_samples(double **buffer, int64_t len)
738 write_lock->lock("File::write_samples");
739 result = file->write_samples(buffer, len);
740 current_sample += len;
741 normalized_sample += len;
742 asset->audio_length += len;
743 write_lock->unlock();
748 // Can't put any cmodel abstraction here because the filebase couldn't be
750 int File::write_frames(VFrame ***frames, int len)
752 // Store the counters in temps so the filebase can choose to overwrite them.
754 int current_frame_temp = current_frame;
755 int video_length_temp = asset->video_length;
756 write_lock->lock("File::write_frames");
761 result = file->write_frames(frames, len);
767 current_frame = current_frame_temp + len;
768 asset->video_length = video_length_temp + len;
769 write_lock->unlock();
773 int File::write_compressed_frame(VFrame *buffer)
776 write_lock->lock("File::write_compressed_frame");
777 result = file->write_compressed_frame(buffer);
779 asset->video_length++;
780 write_lock->unlock();
785 int File::write_audio_buffer(int64_t len)
790 result = audio_thread->write_buffer(len);
795 int File::write_video_buffer(int64_t len)
800 result = video_thread->write_buffer(len);
806 double** File::get_audio_buffer()
808 if(audio_thread) return audio_thread->get_audio_buffer();
812 VFrame*** File::get_video_buffer()
814 if(video_thread) return video_thread->get_video_buffer();
819 int File::read_samples(double *buffer, int64_t len, int64_t base_samplerate)
822 //printf("File::read_samples 1\n");
824 // Load with resampling
827 // Resample recursively calls this with the asset sample rate
828 if(base_samplerate == 0) base_samplerate = asset->sample_rate;
830 //printf("File::read_samples 2 %d %d\n", base_samplerate, asset->sample_rate);
831 if(base_samplerate != asset->sample_rate)
833 //printf("File::read_samples 3\n");
836 //printf("File::read_samples 4\n");
837 resample = new Resample(this, asset->channels);
840 //printf("File::read_samples 5\n");
841 current_sample += resample->resample(buffer,
848 //printf("File::read_samples 6\n");
853 //printf("File::read_samples 7\n");
854 result = file->read_samples(buffer, len);
855 //printf("File::read_samples 8\n");
856 current_sample += len;
859 normalized_sample += len;
864 int File::read_compressed_frame(VFrame *buffer)
868 result = file->read_compressed_frame(buffer);
873 int64_t File::compressed_frame_size()
876 return file->compressed_frame_size();
884 int File::read_frame(VFrame *frame)
888 int supported_colormodel = colormodel_supported(frame->get_color_model());
889 int advance_position = 1;
894 frame_cache->get_frame(frame,
898 // Can't advance position if cache used.
899 advance_position = 0;
903 if(frame->get_color_model() != BC_COMPRESSED &&
904 (supported_colormodel != frame->get_color_model() ||
905 frame->get_w() != asset->width ||
906 frame->get_h() != asset->height))
909 // Can't advance position here because it needs to be added to cache
912 if(!temp_frame->params_match(asset->width, asset->height, supported_colormodel))
921 temp_frame = new VFrame(0,
924 supported_colormodel);
927 file->read_frame(temp_frame);
928 cmodel_transfer(frame->get_rows(),
929 temp_frame->get_rows(),
944 temp_frame->get_color_model(),
945 frame->get_color_model(),
952 // Can't advance position here because it needs to be added to cache
953 file->read_frame(frame);
956 if(use_cache) frame_cache->put_frame(frame,
961 if(advance_position) current_frame++;
968 int File::can_copy_from(Edit *edit, int64_t position, int output_w, int output_h)
972 return edit->asset->width == output_w &&
973 edit->asset->height == output_h &&
974 file->can_copy_from(edit, position);
980 // Fill in queries about formats when adding formats here.
983 int File::strtoformat(char *format)
985 return strtoformat(0, format);
988 int File::strtoformat(ArrayList<PluginServer*> *plugindb, char *format)
990 if(!strcasecmp(format, _(AC3_NAME))) return FILE_AC3;
992 if(!strcasecmp(format, _(WAV_NAME))) return FILE_WAV;
994 if(!strcasecmp(format, _(PCM_NAME))) return FILE_PCM;
996 if(!strcasecmp(format, _(AU_NAME))) return FILE_AU;
998 if(!strcasecmp(format, _(AIFF_NAME))) return FILE_AIFF;
1000 if(!strcasecmp(format, _(SND_NAME))) return FILE_SND;
1002 if(!strcasecmp(format, _(PNG_NAME))) return FILE_PNG;
1004 if(!strcasecmp(format, _(PNG_LIST_NAME))) return FILE_PNG_LIST;
1006 if(!strcasecmp(format, _(TIFF_NAME))) return FILE_TIFF;
1008 if(!strcasecmp(format, _(TIFF_LIST_NAME))) return FILE_TIFF_LIST;
1010 if(!strcasecmp(format, _(JPEG_NAME))) return FILE_JPEG;
1012 if(!strcasecmp(format, _(JPEG_LIST_NAME))) return FILE_JPEG_LIST;
1014 if(!strcasecmp(format, _(EXR_NAME))) return FILE_EXR;
1016 if(!strcasecmp(format, _(EXR_LIST_NAME))) return FILE_EXR_LIST;
1018 if(!strcasecmp(format, _(MPEG_NAME))) return FILE_MPEG;
1020 if(!strcasecmp(format, _(AMPEG_NAME))) return FILE_AMPEG;
1022 if(!strcasecmp(format, _(VMPEG_NAME))) return FILE_VMPEG;
1024 if(!strcasecmp(format, _(TGA_NAME))) return FILE_TGA;
1026 if(!strcasecmp(format, _(TGA_LIST_NAME))) return FILE_TGA_LIST;
1028 if(!strcasecmp(format, _(MOV_NAME))) return FILE_MOV;
1030 if(!strcasecmp(format, _(AVI_NAME))) return FILE_AVI;
1032 if(!strcasecmp(format, _(AVI_LAVTOOLS_NAME))) return FILE_AVI_LAVTOOLS;
1034 if(!strcasecmp(format, _(AVI_ARNE2_NAME))) return FILE_AVI_ARNE2;
1036 if(!strcasecmp(format, _(AVI_ARNE1_NAME))) return FILE_AVI_ARNE1;
1038 if(!strcasecmp(format, _(AVI_AVIFILE_NAME))) return FILE_AVI_AVIFILE;
1040 if(!strcasecmp(format, _(VORBIS_NAME))) return FILE_VORBIS;
1045 char* File::formattostr(int format)
1047 return formattostr(0, format);
1050 char* File::formattostr(ArrayList<PluginServer*> *plugindb, int format)
1067 return _(AIFF_NAME);
1076 return _(PNG_LIST_NAME);
1079 return _(JPEG_NAME);
1081 case FILE_JPEG_LIST:
1082 return _(JPEG_LIST_NAME);
1088 return _(EXR_LIST_NAME);
1091 return _(MPEG_NAME);
1094 return _(AMPEG_NAME);
1097 return _(VMPEG_NAME);
1103 return _(TGA_LIST_NAME);
1106 return _(TIFF_NAME);
1108 case FILE_TIFF_LIST:
1109 return _(TIFF_LIST_NAME);
1114 case FILE_AVI_LAVTOOLS:
1115 return _(AVI_LAVTOOLS_NAME);
1120 case FILE_AVI_ARNE2:
1121 return _(AVI_ARNE2_NAME);
1123 case FILE_AVI_ARNE1:
1124 return _(AVI_ARNE1_NAME);
1126 case FILE_AVI_AVIFILE:
1127 return _(AVI_AVIFILE_NAME);
1130 return _(VORBIS_NAME);
1134 return _("Unknown");
1140 int File::strtobits(char *bits)
1142 if(!strcasecmp(bits, _(NAME_8BIT))) return BITSLINEAR8;
1143 if(!strcasecmp(bits, _(NAME_16BIT))) return BITSLINEAR16;
1144 if(!strcasecmp(bits, _(NAME_24BIT))) return BITSLINEAR24;
1145 if(!strcasecmp(bits, _(NAME_32BIT))) return BITSLINEAR32;
1146 if(!strcasecmp(bits, _(NAME_ULAW))) return BITSULAW;
1147 if(!strcasecmp(bits, _(NAME_ADPCM))) return BITS_ADPCM;
1148 if(!strcasecmp(bits, _(NAME_FLOAT))) return BITSFLOAT;
1149 if(!strcasecmp(bits, _(NAME_IMA4))) return BITSIMA4;
1150 return BITSLINEAR16;
1153 char* File::bitstostr(int bits)
1155 //printf("File::bitstostr\n");
1162 return (NAME_16BIT);
1165 return (NAME_24BIT);
1168 return (NAME_32BIT);
1174 return (NAME_ADPCM);
1177 return (NAME_FLOAT);
1188 int File::str_to_byteorder(char *string)
1190 if(!strcasecmp(string, _("Lo Hi"))) return 1;
1194 char* File::byteorder_to_str(int byte_order)
1196 if(byte_order) return _("Lo Hi");
1200 int File::bytes_per_sample(int bits)
1230 int File::get_best_colormodel(int driver)
1232 return get_best_colormodel(asset, driver);
1235 int File::get_best_colormodel(Asset *asset, int driver)
1237 switch(asset->format)
1240 return FileMOV::get_best_colormodel(asset, driver);
1244 return FileMPEG::get_best_colormodel(asset, driver);
1248 case FILE_JPEG_LIST:
1249 return FileJPEG::get_best_colormodel(asset, driver);
1254 return FileEXR::get_best_colormodel(asset, driver);
1259 return FilePNG::get_best_colormodel(asset, driver);
1264 return FileTGA::get_best_colormodel(asset, driver);
1272 int File::colormodel_supported(int colormodel)
1275 return file->colormodel_supported(colormodel);
1281 int File::get_memory_usage()
1284 if(temp_frame) result += temp_frame->get_data_size();
1285 if(file) result += file->get_memory_usage();
1286 result += frame_cache->get_memory_usage();
1288 if(result < MIN_CACHEITEM_SIZE) result = MIN_CACHEITEM_SIZE;
1292 FrameCache* File::get_frame_cache()
1297 int File::supports_video(ArrayList<PluginServer*> *plugindb, char *format)
1299 int i, format_i = strtoformat(plugindb, format);
1301 return supports_video(format_i);
1305 int File::supports_audio(ArrayList<PluginServer*> *plugindb, char *format)
1307 int i, format_i = strtoformat(plugindb, format);
1309 return supports_audio(format_i);
1314 int File::supports_video(int format)
1316 //printf("File::supports_video %d\n", format);
1321 case FILE_JPEG_LIST:
1329 case FILE_TIFF_LIST:
1331 case FILE_AVI_LAVTOOLS:
1332 case FILE_AVI_ARNE2:
1334 case FILE_AVI_ARNE1:
1335 case FILE_AVI_AVIFILE:
1345 int File::supports_audio(int format)
1359 case FILE_AVI_LAVTOOLS:
1360 case FILE_AVI_ARNE2:
1361 case FILE_AVI_ARNE1:
1362 case FILE_AVI_AVIFILE: