23 #include "filesndfile.h"
25 #include "filethread.h"
27 #include "filevorbis.h"
29 #include "formatwindow.h"
30 #include "formattools.h"
31 #include "framecache.h"
34 #include "pluginserver.h"
36 #include "stringfile.h"
46 format_completion = new Mutex("File::format_completion");
47 write_lock = new Condition(1, "File::write_lock");
48 frame_cache = new FrameCache;
56 if(format_window) format_window->set_done(0);
57 format_completion->lock("File::~File");
58 format_completion->unlock();
61 if(temp_frame) delete temp_frame;
64 Garbage::delete_object(asset);
65 delete format_completion;
67 if(frame_cache) delete frame_cache;
70 void File::reset_parameters()
82 normalized_sample = 0;
83 normalized_sample_rate = 0;
90 int File::raise_window()
92 if(getting_options && format_window)
94 format_window->raise_window();
95 format_window->flush();
100 void File::close_window()
104 format_window->lock_window("File::close_window");
105 format_window->set_done(1);
106 format_window->unlock_window();
111 int File::get_options(FormatTools *format,
116 BC_WindowBase *parent_window = format->window;
117 ArrayList<PluginServer*> *plugindb = format->plugindb;
118 Asset *asset = format->asset;
121 format_completion->lock("File::get_options");
122 switch(asset->format)
125 FileAC3::get_parameters(parent_window,
132 FileDV::get_parameters(parent_window,
143 FileSndFile::get_parameters(parent_window,
150 FileMOV::get_parameters(parent_window,
159 FileMPEG::get_parameters(parent_window,
166 FileMOV::get_parameters(parent_window,
173 case FILE_AVI_LAVTOOLS:
176 case FILE_AVI_AVIFILE:
177 FileAVI::get_parameters(parent_window,
186 FileJPEG::get_parameters(parent_window,
194 FileEXR::get_parameters(parent_window,
201 FileYUV::get_parameters(parent_window,
209 FilePNG::get_parameters(parent_window,
217 FileTGA::get_parameters(parent_window,
225 FileTIFF::get_parameters(parent_window,
232 FileOGG::get_parameters(parent_window,
244 ErrorBox *errorbox = new ErrorBox(PROGRAM_NAME ": Error",
245 parent_window->get_abs_cursor_x(1),
246 parent_window->get_abs_cursor_y(1));
247 format_window = errorbox;
250 errorbox->create_objects(_("This format doesn't support audio."));
253 errorbox->create_objects(_("This format doesn't support video."));
254 errorbox->run_window();
260 format_completion->unlock();
264 void File::set_asset(Asset *asset)
266 this->asset->copy_from(asset, 1);
269 int File::set_processors(int cpus) // Set the number of cpus for certain codecs
275 int File::set_preload(int64_t size)
277 this->playback_preload = size;
281 void File::set_cache_frames(int value)
286 int File::purge_cache()
288 return frame_cache->delete_oldest();
301 int File::open_file(Preferences *preferences,
305 int64_t base_samplerate,
306 float base_framerate)
308 this->preferences = preferences;
309 this->asset->copy_from(asset, 1);
313 switch(this->asset->format)
315 // get the format now
316 // If you add another format to case 0, you also need to add another case for the
317 // file format #define.
320 if(!(stream = fopen(this->asset->path, "rb")))
327 fread(test, 16, 1, stream);
329 if(FileDV::check_sig(this->asset))
333 file = new FileDV(this->asset, this);
335 else if(FileSndFile::check_sig(this->asset))
339 file = new FileSndFile(this->asset, this);
342 if(FilePNG::check_sig(this->asset))
346 file = new FilePNG(this->asset, this);
349 if(FileJPEG::check_sig(this->asset))
353 file = new FileJPEG(this->asset, this);
356 if(FileEXR::check_sig(this->asset, test))
360 file = new FileEXR(this->asset, this);
363 if(FileYUV::check_sig(this->asset))
367 file = new FileYUV(this->asset, this);
370 if(FileCR2::check_sig(this->asset))
374 file = new FileCR2(this->asset, this);
377 if(FileTGA::check_sig(this->asset))
381 file = new FileTGA(this->asset, this);
384 if(FileTIFF::check_sig(this->asset))
388 file = new FileTIFF(this->asset, this);
391 if(FileOGG::check_sig(this->asset))
395 file = new FileOGG(this->asset, this);
398 if(FileVorbis::check_sig(this->asset))
402 file = new FileVorbis(this->asset, this);
405 if(FileOGG::check_sig(this->asset))
407 // OGG file. Doesn't always work with pure audio files.
409 file = new FileOGG(this->asset, this);
412 if(FileMPEG::check_sig(this->asset))
416 file = new FileMPEG(this->asset, this);
419 if(test[0] == '<' && test[1] == 'E' && test[2] == 'D' && test[3] == 'L' && test[4] == '>' ||
420 test[0] == '<' && test[1] == 'H' && test[2] == 'T' && test[3] == 'A' && test[4] == 'L' && test[5] == '>' ||
421 test[0] == '<' && test[1] == '?' && test[2] == 'x' && test[3] == 'm' && test[4] == 'l')
426 } // can't load project file
428 if(FileMOV::check_sig(this->asset))
431 // should be last because quicktime lacks a magic number
433 file = new FileMOV(this->asset, this);
439 return FILE_UNRECOGNIZED_CODEC;
443 // format already determined
445 file = new FileAC3(this->asset, this);
453 //printf("File::open_file 1\n");
454 file = new FileSndFile(this->asset, this);
459 file = new FilePNG(this->asset, this);
464 file = new FileJPEG(this->asset, this);
469 file = new FileEXR(this->asset, this);
473 file = new FileYUV(this->asset, this);
477 file = new FileCR2(this->asset, this);
482 file = new FileTGA(this->asset, this);
487 file = new FileTIFF(this->asset, this);
491 file = new FileMOV(this->asset, this);
497 file = new FileMPEG(this->asset, this);
501 file = new FileOGG(this->asset, this);
505 file = new FileVorbis(this->asset, this);
509 file = new FileMOV(this->asset, this);
512 case FILE_AVI_LAVTOOLS:
515 case FILE_AVI_AVIFILE:
516 file = new FileAVI(this->asset, this);
520 file = new FileDV(this->asset, this);
529 // Reopen file with correct parser and get header.
530 if(file->open_file(rd, wr))
537 // Set extra writing parameters to mandatory settings.
540 if(this->asset->dither) file->set_dither();
544 // Synchronize header parameters
547 asset->copy_from(this->asset, 1);
553 return FILE_NOT_FOUND;
556 int File::close_file(int ignore_thread)
566 // The file's asset is a copy of the argument passed to open_file so the
567 // user must copy lengths from the file's asset.
568 if(asset && file->wr)
570 asset->audio_length = current_sample;
571 asset->video_length = current_frame;
577 if(resample) delete resample;
578 if(resample_float) delete resample_float;
586 int File::get_index(char *index_path)
590 return file->get_index(index_path);
597 int File::start_audio_thread(int64_t buffer_size, int ring_buffers)
599 audio_thread = new FileThread(this, 1, 0);
600 audio_thread->start_writing(buffer_size, 0, ring_buffers, 0);
604 int File::start_video_thread(int64_t buffer_size,
609 video_thread = new FileThread(this, 0, 1);
610 video_thread->start_writing(buffer_size,
617 int File::stop_audio_thread()
621 audio_thread->stop_writing();
628 int File::stop_video_thread()
632 video_thread->stop_writing();
639 int File::lock_read()
645 int File::unlock_read()
647 // read_lock.unlock();
651 int File::set_channel(int channel)
653 if(file && channel < asset->channels)
655 current_channel = channel;
662 int File::set_layer(int layer)
664 if(file && layer < asset->layers)
666 current_layer = layer;
673 int64_t File::get_audio_length(int64_t base_samplerate)
675 int64_t result = asset->audio_length;
678 if(base_samplerate > 0)
679 return (int64_t)((double)result / asset->sample_rate * base_samplerate + 0.5);
687 int64_t File::get_video_length(float base_framerate)
689 int64_t result = asset->video_length;
692 if(base_framerate > 0)
693 return (int64_t)((double)result / asset->frame_rate * base_framerate + 0.5);
698 return -1; // infinity
702 int64_t File::get_video_position(float base_framerate)
704 if(base_framerate > 0)
705 return (int64_t)((double)current_frame / asset->frame_rate * base_framerate + 0.5);
707 return current_frame;
710 int64_t File::get_audio_position(int64_t base_samplerate)
712 if(base_samplerate > 0)
714 if(normalized_sample_rate == base_samplerate)
715 return normalized_sample;
717 return (int64_t)((double)current_sample /
723 return current_sample;
728 // The base samplerate must be nonzero if the base samplerate in the calling
729 // function is expected to change as this forces the resampler to reset.
731 int File::set_audio_position(int64_t position, float base_samplerate)
737 #define REPOSITION(x, y) \
738 (labs((x) - (y)) > 1)
742 if((base_samplerate && REPOSITION(normalized_sample, position)) ||
743 (!base_samplerate && REPOSITION(current_sample, position)))
745 // Can't reset resampler since one seek operation is done
746 // for every channel to be read at the same position.
748 // Use a conditional reset for just the case of different base_samplerates
749 if(base_samplerate > 0)
751 if(normalized_sample_rate &&
752 normalized_sample_rate != base_samplerate &&
756 normalized_sample = position;
757 normalized_sample_rate = (int64_t)((base_samplerate > 0) ?
761 // Convert position to file's rate
762 if(base_samplerate > 0)
763 current_sample = Units::round((double)position /
769 current_sample = position;
770 normalized_sample = Units::round((double)position /
772 normalized_sample_rate);
773 // Can not set the normalized sample rate since this would reset the resampler.
776 result = file->set_audio_position(current_sample);
779 printf("File::set_audio_position position=%d base_samplerate=%f asset=%p asset->sample_rate=%d\n",
780 position, base_samplerate, asset, asset->sample_rate);
783 //printf("File::set_audio_position %d %d %d\n", current_channel, current_sample, position);
788 int File::set_video_position(int64_t position, float base_framerate)
793 // Convert to file's rate
794 if(base_framerate > 0)
795 position = (int64_t)((double)position /
801 if(current_frame != position && file)
803 current_frame = position;
804 result = file->set_video_position(current_frame);
810 // No resampling here.
811 int File::write_samples(double **buffer, int64_t len)
817 write_lock->lock("File::write_samples");
818 result = file->write_samples(buffer, len);
819 current_sample += len;
820 normalized_sample += len;
821 asset->audio_length += len;
822 write_lock->unlock();
827 // Can't put any cmodel abstraction here because the filebase couldn't be
829 int File::write_frames(VFrame ***frames, int len)
831 // Store the counters in temps so the filebase can choose to overwrite them.
833 int current_frame_temp = current_frame;
834 int video_length_temp = asset->video_length;
835 write_lock->lock("File::write_frames");
840 result = file->write_frames(frames, len);
846 current_frame = current_frame_temp + len;
847 asset->video_length = video_length_temp + len;
848 write_lock->unlock();
852 int File::write_compressed_frame(VFrame *buffer)
855 write_lock->lock("File::write_compressed_frame");
856 result = file->write_compressed_frame(buffer);
858 asset->video_length++;
859 write_lock->unlock();
864 int File::write_audio_buffer(int64_t len)
869 result = audio_thread->write_buffer(len);
874 int File::write_video_buffer(int64_t len)
879 result = video_thread->write_buffer(len);
885 double** File::get_audio_buffer()
887 if(audio_thread) return audio_thread->get_audio_buffer();
891 VFrame*** File::get_video_buffer()
893 if(video_thread) return video_thread->get_video_buffer();
898 int File::read_samples(double *buffer, int64_t len, int64_t base_samplerate, float *buffer_float)
901 if(len < 0) return 0;
903 // Never try to read more samples than exist in the file
904 if (current_sample + len > asset->audio_length) {
905 len = asset->audio_length - current_sample;
908 // Load with resampling
911 // Resample recursively calls this with the asset sample rate
912 if(base_samplerate == 0) base_samplerate = asset->sample_rate;
914 //printf("File::read_samples 2 %d %d\n", base_samplerate, asset->sample_rate);
915 if(base_samplerate != asset->sample_rate)
917 //printf("File::read_samples 3\n");
918 //struct timeval start_time;
919 //gettimeofday(&start_time, 0);
920 if (!file->prefer_samples_float())
924 //printf("File::read_samples 4\n");
925 resample = new Resample(this, asset->channels);
928 //printf("File::read_samples 5\n");
929 current_sample += resample->resample(buffer,
936 //printf("File::read_samples 6\n");
941 //printf("File::read_samples 4\n");
942 resample_float = new Resample_float(this, asset->channels);
945 //printf("File::read_samples 5\n");
946 current_sample += resample_float->resample(buffer,
953 //printf("File::read_samples 6\n");
956 //printf("diff2: %lli\n", get_difference(&start_time));
962 //printf("File::read_samples 7\n");
963 if (buffer_float && file->prefer_samples_float())
964 result = file->read_samples_float(buffer_float, len);
966 result = file->read_samples(buffer, len);
967 //printf("File::read_samples 8\n");
968 current_sample += len;
971 normalized_sample += len;
976 int File::read_compressed_frame(VFrame *buffer)
980 result = file->read_compressed_frame(buffer);
985 int64_t File::compressed_frame_size()
988 return file->compressed_frame_size();
996 int File::read_frame(VFrame *frame)
1000 int supported_colormodel = colormodel_supported(frame->get_color_model());
1001 int advance_position = 1;
1005 frame_cache->get_frame(frame,
1009 // Can't advance position if cache used.
1010 advance_position = 0;
1014 if(frame->get_color_model() != BC_COMPRESSED &&
1015 (supported_colormodel != frame->get_color_model() ||
1016 frame->get_w() != asset->width ||
1017 frame->get_h() != asset->height))
1020 // Can't advance position here because it needs to be added to cache
1023 if(!temp_frame->params_match(asset->width, asset->height, supported_colormodel))
1032 temp_frame = new VFrame(0,
1035 supported_colormodel);
1038 file->read_frame(temp_frame);
1039 // FUTURE: convert from YUV planar if cmodel_is_planar(temp_frame)
1040 cmodel_transfer(frame->get_rows(),
1041 temp_frame->get_rows(),
1050 temp_frame->get_w(),
1051 temp_frame->get_h(),
1056 temp_frame->get_color_model(),
1057 frame->get_color_model(),
1059 temp_frame->get_w(),
1064 // Can't advance position here because it needs to be added to cache
1065 file->read_frame(frame);
1068 if(use_cache) frame_cache->put_frame(frame,
1072 // printf("File::read_frame\n");
1073 // frame->dump_params();
1075 if(advance_position) current_frame++;
1082 int File::can_copy_from(Edit *edit, int64_t position, int output_w, int output_h)
1086 return edit->asset->width == output_w &&
1087 edit->asset->height == output_h &&
1088 file->can_copy_from(edit, position);
1094 // Fill in queries about formats when adding formats here.
1097 int File::strtoformat(char *format)
1099 return strtoformat(0, format);
1102 int File::strtoformat(ArrayList<PluginServer*> *plugindb, char *format)
1104 if(!strcasecmp(format, _(AC3_NAME))) return FILE_AC3;
1106 if(!strcasecmp(format, _(WAV_NAME))) return FILE_WAV;
1108 if(!strcasecmp(format, _(PCM_NAME))) return FILE_PCM;
1110 if(!strcasecmp(format, _(AU_NAME))) return FILE_AU;
1112 if(!strcasecmp(format, _(AIFF_NAME))) return FILE_AIFF;
1114 if(!strcasecmp(format, _(SND_NAME))) return FILE_SND;
1116 if(!strcasecmp(format, _(PNG_NAME))) return FILE_PNG;
1118 if(!strcasecmp(format, _(PNG_LIST_NAME))) return FILE_PNG_LIST;
1120 if(!strcasecmp(format, _(TIFF_NAME))) return FILE_TIFF;
1122 if(!strcasecmp(format, _(TIFF_LIST_NAME))) return FILE_TIFF_LIST;
1124 if(!strcasecmp(format, _(JPEG_NAME))) return FILE_JPEG;
1126 if(!strcasecmp(format, _(JPEG_LIST_NAME))) return FILE_JPEG_LIST;
1128 if(!strcasecmp(format, _(EXR_NAME))) return FILE_EXR;
1130 if(!strcasecmp(format, _(EXR_LIST_NAME))) return FILE_EXR_LIST;
1132 if(!strcasecmp(format, _(YUV_NAME))) return FILE_YUV;
1134 if(!strcasecmp(format, _(CR2_NAME))) return FILE_CR2;
1136 if(!strcasecmp(format, _(MPEG_NAME))) return FILE_MPEG;
1138 if(!strcasecmp(format, _(AMPEG_NAME))) return FILE_AMPEG;
1140 if(!strcasecmp(format, _(VMPEG_NAME))) return FILE_VMPEG;
1142 if(!strcasecmp(format, _(TGA_NAME))) return FILE_TGA;
1144 if(!strcasecmp(format, _(TGA_LIST_NAME))) return FILE_TGA_LIST;
1146 if(!strcasecmp(format, _(MOV_NAME))) return FILE_MOV;
1148 if(!strcasecmp(format, _(AVI_NAME))) return FILE_AVI;
1150 if(!strcasecmp(format, _(AVI_LAVTOOLS_NAME))) return FILE_AVI_LAVTOOLS;
1152 if(!strcasecmp(format, _(AVI_ARNE2_NAME))) return FILE_AVI_ARNE2;
1154 if(!strcasecmp(format, _(AVI_ARNE1_NAME))) return FILE_AVI_ARNE1;
1156 if(!strcasecmp(format, _(AVI_AVIFILE_NAME))) return FILE_AVI_AVIFILE;
1158 if(!strcasecmp(format, _(OGG_NAME))) return FILE_OGG;
1160 if(!strcasecmp(format, _(VORBIS_NAME))) return FILE_VORBIS;
1162 if(!strcasecmp(format, _(RAWDV_NAME))) return FILE_RAWDV;
1166 char* File::formattostr(int format)
1168 return formattostr(0, format);
1171 char* File::formattostr(ArrayList<PluginServer*> *plugindb, int format)
1188 return _(AIFF_NAME);
1197 return _(PNG_LIST_NAME);
1200 return _(JPEG_NAME);
1202 case FILE_JPEG_LIST:
1203 return _(JPEG_LIST_NAME);
1212 return _(EXR_LIST_NAME);
1218 return _(MPEG_NAME);
1221 return _(AMPEG_NAME);
1224 return _(VMPEG_NAME);
1230 return _(TGA_LIST_NAME);
1233 return _(TIFF_NAME);
1235 case FILE_TIFF_LIST:
1236 return _(TIFF_LIST_NAME);
1241 case FILE_AVI_LAVTOOLS:
1242 return _(AVI_LAVTOOLS_NAME);
1247 case FILE_AVI_ARNE2:
1248 return _(AVI_ARNE2_NAME);
1250 case FILE_AVI_ARNE1:
1251 return _(AVI_ARNE1_NAME);
1253 case FILE_AVI_AVIFILE:
1254 return _(AVI_AVIFILE_NAME);
1260 return _(VORBIS_NAME);
1263 return _(RAWDV_NAME);
1266 return _("Unknown");
1272 int File::strtobits(char *bits)
1274 if(!strcasecmp(bits, _(NAME_8BIT))) return BITSLINEAR8;
1275 if(!strcasecmp(bits, _(NAME_16BIT))) return BITSLINEAR16;
1276 if(!strcasecmp(bits, _(NAME_24BIT))) return BITSLINEAR24;
1277 if(!strcasecmp(bits, _(NAME_32BIT))) return BITSLINEAR32;
1278 if(!strcasecmp(bits, _(NAME_ULAW))) return BITSULAW;
1279 if(!strcasecmp(bits, _(NAME_ADPCM))) return BITS_ADPCM;
1280 if(!strcasecmp(bits, _(NAME_FLOAT))) return BITSFLOAT;
1281 if(!strcasecmp(bits, _(NAME_IMA4))) return BITSIMA4;
1282 return BITSLINEAR16;
1285 char* File::bitstostr(int bits)
1287 //printf("File::bitstostr\n");
1294 return (NAME_16BIT);
1297 return (NAME_24BIT);
1300 return (NAME_32BIT);
1306 return (NAME_ADPCM);
1309 return (NAME_FLOAT);
1320 int File::str_to_byteorder(char *string)
1322 if(!strcasecmp(string, _("Lo Hi"))) return 1;
1326 char* File::byteorder_to_str(int byte_order)
1328 if(byte_order) return _("Lo Hi");
1332 int File::bytes_per_sample(int bits)
1362 int File::get_best_colormodel(int driver)
1364 return get_best_colormodel(asset, driver);
1367 int File::get_best_colormodel(Asset *asset, int driver)
1369 switch(asset->format)
1372 return FileDV::get_best_colormodel(asset, driver);
1376 return FileMOV::get_best_colormodel(asset, driver);
1380 return FileMOV::get_best_colormodel(asset, driver);
1384 return FileMPEG::get_best_colormodel(asset, driver);
1388 case FILE_JPEG_LIST:
1389 return FileJPEG::get_best_colormodel(asset, driver);
1394 return FileEXR::get_best_colormodel(asset, driver);
1398 return FileYUV::get_best_colormodel(asset, driver);
1403 return FilePNG::get_best_colormodel(asset, driver);
1408 return FileTGA::get_best_colormodel(asset, driver);
1416 int File::colormodel_supported(int colormodel)
1419 return file->colormodel_supported(colormodel);
1425 int64_t File::get_memory_usage()
1428 if(temp_frame) result += temp_frame->get_data_size();
1429 if(file) result += file->get_memory_usage();
1430 result += frame_cache->get_memory_usage();
1432 if(result < MIN_CACHEITEM_SIZE) result = MIN_CACHEITEM_SIZE;
1436 FrameCache* File::get_frame_cache()
1441 int File::supports_video(ArrayList<PluginServer*> *plugindb, char *format)
1443 int i, format_i = strtoformat(plugindb, format);
1445 return supports_video(format_i);
1449 int File::supports_audio(ArrayList<PluginServer*> *plugindb, char *format)
1451 int i, format_i = strtoformat(plugindb, format);
1453 return supports_audio(format_i);
1458 int File::supports_video(int format)
1460 //printf("File::supports_video %d\n", format);
1466 case FILE_JPEG_LIST:
1476 case FILE_TIFF_LIST:
1478 case FILE_AVI_LAVTOOLS:
1479 case FILE_AVI_ARNE2:
1481 case FILE_AVI_ARNE1:
1482 case FILE_AVI_AVIFILE:
1493 int File::supports_audio(int format)
1508 case FILE_AVI_LAVTOOLS:
1509 case FILE_AVI_ARNE2:
1510 case FILE_AVI_ARNE1:
1511 case FILE_AVI_AVIFILE:
1521 char* File::get_tag(int format)
1525 case FILE_AC3: return "ac3";
1526 case FILE_AIFF: return "aif";
1527 case FILE_AMPEG: return "mp3";
1528 case FILE_AU: return "au";
1529 case FILE_AVI: return "avi";
1530 case FILE_EXR: return "exr";
1531 case FILE_EXR_LIST: return "exr";
1532 case FILE_JPEG: return "jpg";
1533 case FILE_JPEG_LIST: return "jpg";
1534 case FILE_MOV: return "mov";
1535 case FILE_OGG: return "ogg";
1536 case FILE_PCM: return "pcm";
1537 case FILE_PNG: return "png";
1538 case FILE_PNG_LIST: return "png";
1539 case FILE_TGA: return "tga";
1540 case FILE_TGA_LIST: return "tga";
1541 case FILE_TIFF: return "tif";
1542 case FILE_TIFF_LIST: return "tif";
1543 case FILE_VMPEG: return "m2v";
1544 case FILE_VORBIS: return "ogg";
1545 case FILE_WAV: return "wav";
1550 PackagingEngine *File::new_packaging_engine(Asset *asset)
1552 PackagingEngine *result;
1553 switch (asset->format)
1556 result = (PackagingEngine*)new PackagingEngineOGG();
1559 result = (PackagingEngine*) new PackagingEngineDefault();