00001 #include "asset.h"
00002 #include "bcsignals.h"
00003 #include "byteorder.h"
00004 #include "cache.inc"
00005 #include "condition.h"
00006 #include "edit.h"
00007 #include "errorbox.h"
00008 #include "file.h"
00009 #include "fileac3.h"
00010 #include "fileavi.h"
00011 #include "filedv.h"
00012 #include "fileogg.h"
00013 #include "filebase.h"
00014 #include "filecr2.h"
00015 #include "fileexr.h"
00016 #include "fileogg.h"
00017 #include "filexml.h"
00018 #include "filejpeg.h"
00019 #include "filemov.h"
00020 #include "filempeg.h"
00021 #include "fileogg.h"
00022 #include "filepng.h"
00023 #include "filesndfile.h"
00024 #include "filetga.h"
00025 #include "filethread.h"
00026 #include "filetiff.h"
00027 #include "filevorbis.h"
00028 #include "fileyuv.h"
00029 #include "formatwindow.h"
00030 #include "formattools.h"
00031 #include "framecache.h"
00032 #include "language.h"
00033 #include "mutex.h"
00034 #include "pluginserver.h"
00035 #include "resample.h"
00036 #include "stringfile.h"
00037 #include "vframe.h"
00038
00039
00040
00041
00042 File::File()
00043 {
00044 cpus = 1;
00045 asset = new Asset;
00046 format_completion = new Mutex("File::format_completion");
00047 write_lock = new Condition(1, "File::write_lock");
00048 frame_cache = new FrameCache;
00049 reset_parameters();
00050 }
00051
00052 File::~File()
00053 {
00054 if(getting_options)
00055 {
00056 if(format_window) format_window->set_done(0);
00057 format_completion->lock("File::~File");
00058 format_completion->unlock();
00059 }
00060
00061 if(temp_frame) delete temp_frame;
00062
00063 close_file(0);
00064 Garbage::delete_object(asset);
00065 delete format_completion;
00066 delete write_lock;
00067 if(frame_cache) delete frame_cache;
00068 }
00069
00070 void File::reset_parameters()
00071 {
00072 file = 0;
00073 audio_thread = 0;
00074 video_thread = 0;
00075 getting_options = 0;
00076 format_window = 0;
00077 temp_frame = 0;
00078 current_sample = 0;
00079 current_frame = 0;
00080 current_channel = 0;
00081 current_layer = 0;
00082 normalized_sample = 0;
00083 normalized_sample_rate = 0;
00084 resample = 0;
00085 resample_float = 0;
00086 use_cache = 0;
00087 preferences = 0;
00088 playback_subtitle = -1;
00089 interpolate_raw = 1;
00090 }
00091
00092 int File::raise_window()
00093 {
00094 if(getting_options && format_window)
00095 {
00096 format_window->raise_window();
00097 format_window->flush();
00098 }
00099 return 0;
00100 }
00101
00102 void File::close_window()
00103 {
00104 if(getting_options)
00105 {
00106 format_window->lock_window("File::close_window");
00107 format_window->set_done(1);
00108 format_window->unlock_window();
00109 getting_options = 0;
00110 }
00111 }
00112
00113 int File::get_options(FormatTools *format,
00114 int audio_options,
00115 int video_options)
00116 {
00117 BC_WindowBase *parent_window = format->window;
00118 ArrayList<PluginServer*> *plugindb = format->plugindb;
00119 Asset *asset = format->asset;
00120
00121 getting_options = 1;
00122 format_completion->lock("File::get_options");
00123 switch(asset->format)
00124 {
00125 case FILE_AC3:
00126 FileAC3::get_parameters(parent_window,
00127 asset,
00128 format_window,
00129 audio_options,
00130 video_options);
00131 break;
00132 case FILE_RAWDV:
00133 FileDV::get_parameters(parent_window,
00134 asset,
00135 format_window,
00136 audio_options,
00137 video_options);
00138 break;
00139 case FILE_PCM:
00140 case FILE_WAV:
00141 case FILE_AU:
00142 case FILE_AIFF:
00143 case FILE_SND:
00144 FileSndFile::get_parameters(parent_window,
00145 asset,
00146 format_window,
00147 audio_options,
00148 video_options);
00149 break;
00150 case FILE_MOV:
00151 FileMOV::get_parameters(parent_window,
00152 asset,
00153 format_window,
00154 audio_options,
00155 video_options,
00156 format->locked_compressor);
00157 break;
00158 case FILE_AMPEG:
00159 case FILE_VMPEG:
00160 FileMPEG::get_parameters(parent_window,
00161 asset,
00162 format_window,
00163 audio_options,
00164 video_options);
00165 break;
00166 case FILE_AVI:
00167 FileMOV::get_parameters(parent_window,
00168 asset,
00169 format_window,
00170 audio_options,
00171 video_options,
00172 format->locked_compressor);
00173 break;
00174 case FILE_AVI_LAVTOOLS:
00175 case FILE_AVI_ARNE2:
00176 case FILE_AVI_ARNE1:
00177 case FILE_AVI_AVIFILE:
00178 FileAVI::get_parameters(parent_window,
00179 asset,
00180 format_window,
00181 audio_options,
00182 video_options,
00183 format->locked_compressor);
00184 break;
00185 case FILE_JPEG:
00186 case FILE_JPEG_LIST:
00187 FileJPEG::get_parameters(parent_window,
00188 asset,
00189 format_window,
00190 audio_options,
00191 video_options);
00192 break;
00193 case FILE_EXR:
00194 case FILE_EXR_LIST:
00195 FileEXR::get_parameters(parent_window,
00196 asset,
00197 format_window,
00198 audio_options,
00199 video_options);
00200 break;
00201 case FILE_YUV:
00202 FileYUV::get_parameters(parent_window,
00203 asset,
00204 format_window,
00205 video_options,
00206 format);
00207 break;
00208 case FILE_PNG:
00209 case FILE_PNG_LIST:
00210 FilePNG::get_parameters(parent_window,
00211 asset,
00212 format_window,
00213 audio_options,
00214 video_options);
00215 break;
00216 case FILE_TGA:
00217 case FILE_TGA_LIST:
00218 FileTGA::get_parameters(parent_window,
00219 asset,
00220 format_window,
00221 audio_options,
00222 video_options);
00223 break;
00224 case FILE_TIFF:
00225 case FILE_TIFF_LIST:
00226 FileTIFF::get_parameters(parent_window,
00227 asset,
00228 format_window,
00229 audio_options,
00230 video_options);
00231 break;
00232 case FILE_OGG:
00233 FileOGG::get_parameters(parent_window,
00234 asset,
00235 format_window,
00236 audio_options,
00237 video_options);
00238 break;
00239 default:
00240 break;
00241 }
00242
00243 if(!format_window)
00244 {
00245 ErrorBox *errorbox = new ErrorBox(PROGRAM_NAME ": Error",
00246 parent_window->get_abs_cursor_x(1),
00247 parent_window->get_abs_cursor_y(1));
00248 format_window = errorbox;
00249 getting_options = 1;
00250 if(audio_options)
00251 errorbox->create_objects(_("This format doesn't support audio."));
00252 else
00253 if(video_options)
00254 errorbox->create_objects(_("This format doesn't support video."));
00255 errorbox->run_window();
00256 delete errorbox;
00257 }
00258
00259 getting_options = 0;
00260 format_window = 0;
00261 format_completion->unlock();
00262 return 0;
00263 }
00264
00265 void File::set_asset(Asset *asset)
00266 {
00267 this->asset->copy_from(asset, 1);
00268 }
00269
00270 int File::set_processors(int cpus)
00271 {
00272 this->cpus = cpus;
00273 return 0;
00274 }
00275
00276 int File::set_preload(int64_t size)
00277 {
00278 this->playback_preload = size;
00279 return 0;
00280 }
00281
00282 void File::set_subtitle(int value)
00283 {
00284 this->playback_subtitle = value;
00285 }
00286
00287 void File::set_interpolate_raw(int value)
00288 {
00289 this->interpolate_raw = value;
00290 }
00291
00292 void File::set_white_balance_raw(int value)
00293 {
00294 this->white_balance_raw = value;
00295 }
00296
00297 void File::set_cache_frames(int value)
00298 {
00299 use_cache = value;
00300 }
00301
00302 int File::purge_cache()
00303 {
00304 return frame_cache->delete_oldest();
00305 }
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 int File::open_file(Preferences *preferences,
00318 Asset *asset,
00319 int rd,
00320 int wr,
00321 int64_t base_samplerate,
00322 float base_framerate)
00323 {
00324 this->preferences = preferences;
00325 this->asset->copy_from(asset, 1);
00326 file = 0;
00327
00328
00329 switch(this->asset->format)
00330 {
00331
00332
00333
00334 case FILE_UNKNOWN:
00335 FILE *stream;
00336 if(!(stream = fopen(this->asset->path, "rb")))
00337 {
00338
00339 return 1;
00340 }
00341
00342 char test[16];
00343 fread(test, 16, 1, stream);
00344
00345 if(FileDV::check_sig(this->asset))
00346 {
00347
00348 fclose(stream);
00349 file = new FileDV(this->asset, this);
00350 }
00351 else if(FileSndFile::check_sig(this->asset))
00352 {
00353
00354 fclose(stream);
00355 file = new FileSndFile(this->asset, this);
00356 }
00357 else
00358 if(FilePNG::check_sig(this->asset))
00359 {
00360
00361 fclose(stream);
00362 file = new FilePNG(this->asset, this);
00363 }
00364 else
00365 if(FileJPEG::check_sig(this->asset))
00366 {
00367
00368 fclose(stream);
00369 file = new FileJPEG(this->asset, this);
00370 }
00371 else
00372 if(FileEXR::check_sig(this->asset, test))
00373 {
00374
00375 fclose(stream);
00376 file = new FileEXR(this->asset, this);
00377 }
00378 else
00379 if(FileYUV::check_sig(this->asset))
00380 {
00381
00382 fclose(stream);
00383 file = new FileYUV(this->asset, this);
00384 }
00385 else
00386 if(FileCR2::check_sig(this->asset))
00387 {
00388
00389 fclose(stream);
00390 file = new FileCR2(this->asset, this);
00391 }
00392 else
00393 if(FileTGA::check_sig(this->asset))
00394 {
00395
00396 fclose(stream);
00397 file = new FileTGA(this->asset, this);
00398 }
00399 else
00400 if(FileTIFF::check_sig(this->asset))
00401 {
00402
00403 fclose(stream);
00404 file = new FileTIFF(this->asset, this);
00405 }
00406 else
00407 if(FileOGG::check_sig(this->asset))
00408 {
00409
00410 fclose(stream);
00411 file = new FileOGG(this->asset, this);
00412 }
00413 else
00414 if(FileVorbis::check_sig(this->asset))
00415 {
00416
00417 fclose(stream);
00418 file = new FileVorbis(this->asset, this);
00419 }
00420 else
00421 if(FileOGG::check_sig(this->asset))
00422 {
00423
00424 fclose(stream);
00425 file = new FileOGG(this->asset, this);
00426 }
00427 else
00428 if(FileMPEG::check_sig(this->asset))
00429 {
00430
00431 fclose(stream);
00432 file = new FileMPEG(this->asset, this);
00433 }
00434 else
00435 if(test[0] == '<' && test[1] == 'E' && test[2] == 'D' && test[3] == 'L' && test[4] == '>' ||
00436 test[0] == '<' && test[1] == 'H' && test[2] == 'T' && test[3] == 'A' && test[4] == 'L' && test[5] == '>' ||
00437 test[0] == '<' && test[1] == '?' && test[2] == 'x' && test[3] == 'm' && test[4] == 'l')
00438 {
00439
00440 fclose(stream);
00441 return FILE_IS_XML;
00442 }
00443 else
00444 if(FileMOV::check_sig(this->asset))
00445 {
00446
00447
00448 fclose(stream);
00449 file = new FileMOV(this->asset, this);
00450 }
00451 else
00452 {
00453
00454 fclose(stream);
00455 return FILE_UNRECOGNIZED_CODEC;
00456 }
00457 break;
00458
00459
00460 case FILE_AC3:
00461 file = new FileAC3(this->asset, this);
00462 break;
00463
00464 case FILE_PCM:
00465 case FILE_WAV:
00466 case FILE_AU:
00467 case FILE_AIFF:
00468 case FILE_SND:
00469
00470 file = new FileSndFile(this->asset, this);
00471 break;
00472
00473 case FILE_PNG:
00474 case FILE_PNG_LIST:
00475 file = new FilePNG(this->asset, this);
00476 break;
00477
00478 case FILE_JPEG:
00479 case FILE_JPEG_LIST:
00480 file = new FileJPEG(this->asset, this);
00481 break;
00482
00483 case FILE_EXR:
00484 case FILE_EXR_LIST:
00485 file = new FileEXR(this->asset, this);
00486 break;
00487
00488 case FILE_YUV:
00489 file = new FileYUV(this->asset, this);
00490 break;
00491
00492 case FILE_CR2:
00493 file = new FileCR2(this->asset, this);
00494 break;
00495
00496 case FILE_TGA_LIST:
00497 case FILE_TGA:
00498 file = new FileTGA(this->asset, this);
00499 break;
00500
00501 case FILE_TIFF:
00502 case FILE_TIFF_LIST:
00503 file = new FileTIFF(this->asset, this);
00504 break;
00505
00506 case FILE_MOV:
00507 file = new FileMOV(this->asset, this);
00508 break;
00509
00510 case FILE_MPEG:
00511 case FILE_AMPEG:
00512 case FILE_VMPEG:
00513 file = new FileMPEG(this->asset, this);
00514 break;
00515
00516 case FILE_OGG:
00517 file = new FileOGG(this->asset, this);
00518 break;
00519
00520 case FILE_VORBIS:
00521 file = new FileVorbis(this->asset, this);
00522 break;
00523
00524 case FILE_AVI:
00525 file = new FileMOV(this->asset, this);
00526 break;
00527
00528 case FILE_AVI_LAVTOOLS:
00529 case FILE_AVI_ARNE2:
00530 case FILE_AVI_ARNE1:
00531 case FILE_AVI_AVIFILE:
00532 file = new FileAVI(this->asset, this);
00533 break;
00534
00535 case FILE_RAWDV:
00536 file = new FileDV(this->asset, this);
00537 break;
00538
00539
00540 default:
00541 return 1;
00542 break;
00543 }
00544
00545
00546 if(file->open_file(rd, wr))
00547 {
00548 delete file;
00549 file = 0;
00550 }
00551
00552
00553
00554 if(file && wr)
00555 {
00556 if(this->asset->dither) file->set_dither();
00557 }
00558
00559
00560
00561 if(file)
00562 {
00563 asset->copy_from(this->asset, 1);
00564 }
00565
00566 if(file)
00567 return FILE_OK;
00568 else
00569 return FILE_NOT_FOUND;
00570 }
00571
00572 int File::close_file(int ignore_thread)
00573 {
00574 if(!ignore_thread)
00575 {
00576 stop_audio_thread();
00577 stop_video_thread();
00578 }
00579
00580 if(file)
00581 {
00582
00583
00584 if(asset && file->wr)
00585 {
00586 asset->audio_length = current_sample;
00587 asset->video_length = current_frame;
00588 }
00589 file->close_file();
00590 delete file;
00591 }
00592
00593 if(resample) delete resample;
00594 if(resample_float) delete resample_float;
00595
00596 reset_parameters();
00597 return 0;
00598 }
00599
00600
00601
00602 int File::get_index(char *index_path)
00603 {
00604 if(file)
00605 {
00606 return file->get_index(index_path);
00607 }
00608 return 1;
00609 }
00610
00611
00612
00613 int File::start_audio_thread(int64_t buffer_size, int ring_buffers)
00614 {
00615 if(!audio_thread)
00616 {
00617 audio_thread = new FileThread(this, 1, 0);
00618 audio_thread->start_writing(buffer_size, 0, ring_buffers, 0);
00619 }
00620 return 0;
00621 }
00622
00623 int File::start_video_thread(int64_t buffer_size,
00624 int color_model,
00625 int ring_buffers,
00626 int compressed)
00627 {
00628 if(!video_thread)
00629 {
00630 video_thread = new FileThread(this, 0, 1);
00631 video_thread->start_writing(buffer_size,
00632 color_model,
00633 ring_buffers,
00634 compressed);
00635 }
00636 return 0;
00637 }
00638
00639 int File::start_video_decode_thread()
00640 {
00641
00642
00643 if(!video_thread && asset->format != FILE_CR2)
00644 {
00645 video_thread = new FileThread(this, 0, 1);
00646 video_thread->start_reading();
00647 }
00648 }
00649
00650 int File::stop_audio_thread()
00651 {
00652 if(audio_thread)
00653 {
00654 audio_thread->stop_writing();
00655 delete audio_thread;
00656 audio_thread = 0;
00657 }
00658 return 0;
00659 }
00660
00661 int File::stop_video_thread()
00662 {
00663 if(video_thread)
00664 {
00665 video_thread->stop_reading();
00666 video_thread->stop_writing();
00667 delete video_thread;
00668 video_thread = 0;
00669 }
00670 return 0;
00671 }
00672
00673 FileThread* File::get_video_thread()
00674 {
00675 return video_thread;
00676 }
00677
00678 int File::set_channel(int channel)
00679 {
00680 if(file && channel < asset->channels)
00681 {
00682 current_channel = channel;
00683 return 0;
00684 }
00685 else
00686 return 1;
00687 }
00688
00689 int File::set_layer(int layer, int is_thread)
00690 {
00691 if(file && layer < asset->layers)
00692 {
00693 if(!is_thread && video_thread)
00694 {
00695 video_thread->set_layer(layer);
00696 }
00697 else
00698 {
00699 current_layer = layer;
00700 }
00701 return 0;
00702 }
00703 else
00704 return 1;
00705 }
00706
00707 int64_t File::get_audio_length(int64_t base_samplerate)
00708 {
00709 int64_t result = asset->audio_length;
00710 if(result > 0)
00711 {
00712 if(base_samplerate > 0)
00713 return (int64_t)((double)result / asset->sample_rate * base_samplerate + 0.5);
00714 else
00715 return result;
00716 }
00717 else
00718 return -1;
00719 }
00720
00721 int64_t File::get_video_length(float base_framerate)
00722 {
00723 int64_t result = asset->video_length;
00724 if(result > 0)
00725 {
00726 if(base_framerate > 0)
00727 return (int64_t)((double)result / asset->frame_rate * base_framerate + 0.5);
00728 else
00729 return result;
00730 }
00731 else
00732 return -1;
00733 }
00734
00735
00736 int64_t File::get_video_position(float base_framerate)
00737 {
00738 if(base_framerate > 0)
00739 return (int64_t)((double)current_frame / asset->frame_rate * base_framerate + 0.5);
00740 else
00741 return current_frame;
00742 }
00743
00744 int64_t File::get_audio_position(int64_t base_samplerate)
00745 {
00746 if(base_samplerate > 0)
00747 {
00748 if(normalized_sample_rate == base_samplerate)
00749 return normalized_sample;
00750 else
00751 return (int64_t)((double)current_sample /
00752 asset->sample_rate *
00753 base_samplerate +
00754 0.5);
00755 }
00756 else
00757 return current_sample;
00758 }
00759
00760
00761
00762
00763
00764
00765 int File::set_audio_position(int64_t position, float base_samplerate)
00766 {
00767 int result = 0;
00768
00769 if(!file) return 1;
00770
00771 #define REPOSITION(x, y) \
00772 (labs((x) - (y)) > 1)
00773
00774
00775
00776 if((base_samplerate && REPOSITION(normalized_sample, position)) ||
00777 (!base_samplerate && REPOSITION(current_sample, position)))
00778 {
00779
00780
00781
00782
00783 if(base_samplerate > 0)
00784 {
00785 if(normalized_sample_rate &&
00786 normalized_sample_rate != base_samplerate &&
00787 resample)
00788 resample->reset(-1);
00789
00790 normalized_sample = position;
00791 normalized_sample_rate = (int64_t)((base_samplerate > 0) ?
00792 base_samplerate :
00793 asset->sample_rate);
00794
00795
00796 if(base_samplerate > 0)
00797 current_sample = Units::round((double)position /
00798 base_samplerate *
00799 asset->sample_rate);
00800 }
00801 else
00802 {
00803 current_sample = position;
00804 normalized_sample = Units::round((double)position /
00805 asset->sample_rate *
00806 normalized_sample_rate);
00807
00808 }
00809
00810 result = file->set_audio_position(current_sample);
00811
00812 if(result)
00813 printf("File::set_audio_position position=%d base_samplerate=%f asset=%p asset->sample_rate=%d\n",
00814 position, base_samplerate, asset, asset->sample_rate);
00815 }
00816
00817
00818
00819 return result;
00820 }
00821
00822 int File::set_video_position(int64_t position, float base_framerate, int is_thread)
00823 {
00824 int result = 0;
00825 if(!file) return 0;
00826
00827
00828 if(base_framerate > 0)
00829 position = (int64_t)((double)position /
00830 base_framerate *
00831 asset->frame_rate +
00832 0.5);
00833
00834
00835 if(video_thread && !is_thread)
00836 {
00837
00838 video_thread->set_video_position(position);
00839 }
00840 else
00841 if(current_frame != position)
00842 {
00843 if(file)
00844 {
00845 current_frame = position;
00846 result = file->set_video_position(current_frame);
00847 }
00848 }
00849
00850 return result;
00851 }
00852
00853
00854 int File::write_samples(double **buffer, int64_t len)
00855 {
00856 int result = 1;
00857
00858 if(file)
00859 {
00860 write_lock->lock("File::write_samples");
00861 result = file->write_samples(buffer, len);
00862 current_sample += len;
00863 normalized_sample += len;
00864 asset->audio_length += len;
00865 write_lock->unlock();
00866 }
00867 return result;
00868 }
00869
00870
00871
00872 int File::write_frames(VFrame ***frames, int len)
00873 {
00874
00875 int result;
00876 int current_frame_temp = current_frame;
00877 int video_length_temp = asset->video_length;
00878 write_lock->lock("File::write_frames");
00879
00880
00881
00882
00883 result = file->write_frames(frames, len);
00884
00885
00886
00887
00888
00889 current_frame = current_frame_temp + len;
00890 asset->video_length = video_length_temp + len;
00891 write_lock->unlock();
00892 return result;
00893 }
00894
00895 int File::write_compressed_frame(VFrame *buffer)
00896 {
00897 int result = 0;
00898 write_lock->lock("File::write_compressed_frame");
00899 result = file->write_compressed_frame(buffer);
00900 current_frame++;
00901 asset->video_length++;
00902 write_lock->unlock();
00903 return result;
00904 }
00905
00906
00907 int File::write_audio_buffer(int64_t len)
00908 {
00909 int result = 0;
00910 if(audio_thread)
00911 {
00912 result = audio_thread->write_buffer(len);
00913 }
00914 return result;
00915 }
00916
00917 int File::write_video_buffer(int64_t len)
00918 {
00919 int result = 0;
00920 if(video_thread)
00921 {
00922 result = video_thread->write_buffer(len);
00923 }
00924
00925 return result;
00926 }
00927
00928 double** File::get_audio_buffer()
00929 {
00930 if(audio_thread) return audio_thread->get_audio_buffer();
00931 return 0;
00932 }
00933
00934 VFrame*** File::get_video_buffer()
00935 {
00936 if(video_thread) return video_thread->get_video_buffer();
00937 return 0;
00938 }
00939
00940
00941 int File::read_samples(double *buffer, int64_t len, int64_t base_samplerate, float *buffer_float)
00942 {
00943 int result = 0;
00944 if(len < 0) return 0;
00945
00946
00947 if (current_sample + len > asset->audio_length) {
00948 len = asset->audio_length - current_sample;
00949 }
00950
00951
00952 if(file)
00953 {
00954
00955 if(base_samplerate == 0) base_samplerate = asset->sample_rate;
00956
00957
00958 if(base_samplerate != asset->sample_rate)
00959 {
00960
00961
00962
00963 if (!file->prefer_samples_float())
00964 {
00965 if(!resample)
00966 {
00967
00968 resample = new Resample(this, asset->channels);
00969 }
00970
00971
00972 current_sample += resample->resample(buffer,
00973 len,
00974 asset->sample_rate,
00975 base_samplerate,
00976 current_channel,
00977 current_sample,
00978 normalized_sample);
00979
00980 } else
00981 {
00982 if(!resample_float)
00983 {
00984
00985 resample_float = new Resample_float(this, asset->channels);
00986 }
00987
00988
00989 current_sample += resample_float->resample(buffer,
00990 len,
00991 asset->sample_rate,
00992 base_samplerate,
00993 current_channel,
00994 current_sample,
00995 normalized_sample);
00996
00997
00998 }
00999
01000
01001 }
01002 else
01003
01004 {
01005
01006 if (buffer_float && file->prefer_samples_float())
01007 result = file->read_samples_float(buffer_float, len);
01008 else
01009 result = file->read_samples(buffer, len);
01010
01011 current_sample += len;
01012 }
01013
01014 normalized_sample += len;
01015 }
01016 return result;
01017 }
01018
01019 int File::read_compressed_frame(VFrame *buffer)
01020 {
01021 int result = 1;
01022 if(file)
01023 result = file->read_compressed_frame(buffer);
01024 current_frame++;
01025 return result;
01026 }
01027
01028 int64_t File::compressed_frame_size()
01029 {
01030 if(file)
01031 return file->compressed_frame_size();
01032 else
01033 return 0;
01034 }
01035
01036
01037
01038
01039 int File::read_frame(VFrame *frame, int is_thread)
01040 {
01041 if(video_thread && !is_thread) return video_thread->read_frame(frame);
01042
01043 if(file)
01044 {
01045 int supported_colormodel = colormodel_supported(frame->get_color_model());
01046 int advance_position = 1;
01047
01048
01049 if(use_cache &&
01050 frame_cache->get_frame(frame,
01051 current_frame,
01052 current_layer,
01053 asset->frame_rate))
01054 {
01055
01056 advance_position = 0;
01057 }
01058 else
01059
01060 if(frame->get_color_model() != BC_COMPRESSED &&
01061 (supported_colormodel != frame->get_color_model() ||
01062 frame->get_w() != asset->width ||
01063 frame->get_h() != asset->height))
01064 {
01065
01066
01067 if(temp_frame)
01068 {
01069 if(!temp_frame->params_match(asset->width, asset->height, supported_colormodel))
01070 {
01071 delete temp_frame;
01072 temp_frame = 0;
01073 }
01074 }
01075
01076 if(!temp_frame)
01077 {
01078 temp_frame = new VFrame(0,
01079 asset->width,
01080 asset->height,
01081 supported_colormodel);
01082 }
01083
01084 temp_frame->copy_stacks(frame);
01085 file->read_frame(temp_frame);
01086 cmodel_transfer(frame->get_rows(),
01087 temp_frame->get_rows(),
01088 temp_frame->get_y(),
01089 temp_frame->get_u(),
01090 temp_frame->get_v(),
01091 frame->get_y(),
01092 frame->get_u(),
01093 frame->get_v(),
01094 0,
01095 0,
01096 temp_frame->get_w(),
01097 temp_frame->get_h(),
01098 0,
01099 0,
01100 frame->get_w(),
01101 frame->get_h(),
01102 temp_frame->get_color_model(),
01103 frame->get_color_model(),
01104 0,
01105 temp_frame->get_w(),
01106 frame->get_w());
01107 }
01108 else
01109 {
01110
01111 file->read_frame(frame);
01112 }
01113
01114 if(use_cache) frame_cache->put_frame(frame,
01115 current_frame,
01116 current_layer,
01117 asset->frame_rate,
01118 1);
01119
01120
01121
01122 if(advance_position) current_frame++;
01123 return 0;
01124 }
01125 else
01126 return 1;
01127 }
01128
01129 int File::can_copy_from(Edit *edit, int64_t position, int output_w, int output_h)
01130 {
01131 if(file)
01132 {
01133 return edit->asset->width == output_w &&
01134 edit->asset->height == output_h &&
01135 file->can_copy_from(edit, position);
01136 }
01137 else
01138 return 0;
01139 }
01140
01141
01142
01143
01144 int File::strtoformat(char *format)
01145 {
01146 return strtoformat(0, format);
01147 }
01148
01149 int File::strtoformat(ArrayList<PluginServer*> *plugindb, char *format)
01150 {
01151 if(!strcasecmp(format, _(AC3_NAME))) return FILE_AC3;
01152 else
01153 if(!strcasecmp(format, _(WAV_NAME))) return FILE_WAV;
01154 else
01155 if(!strcasecmp(format, _(PCM_NAME))) return FILE_PCM;
01156 else
01157 if(!strcasecmp(format, _(AU_NAME))) return FILE_AU;
01158 else
01159 if(!strcasecmp(format, _(AIFF_NAME))) return FILE_AIFF;
01160 else
01161 if(!strcasecmp(format, _(SND_NAME))) return FILE_SND;
01162 else
01163 if(!strcasecmp(format, _(PNG_NAME))) return FILE_PNG;
01164 else
01165 if(!strcasecmp(format, _(PNG_LIST_NAME))) return FILE_PNG_LIST;
01166 else
01167 if(!strcasecmp(format, _(TIFF_NAME))) return FILE_TIFF;
01168 else
01169 if(!strcasecmp(format, _(TIFF_LIST_NAME))) return FILE_TIFF_LIST;
01170 else
01171 if(!strcasecmp(format, _(JPEG_NAME))) return FILE_JPEG;
01172 else
01173 if(!strcasecmp(format, _(JPEG_LIST_NAME))) return FILE_JPEG_LIST;
01174 else
01175 if(!strcasecmp(format, _(EXR_NAME))) return FILE_EXR;
01176 else
01177 if(!strcasecmp(format, _(EXR_LIST_NAME))) return FILE_EXR_LIST;
01178 else
01179 if(!strcasecmp(format, _(YUV_NAME))) return FILE_YUV;
01180 else
01181 if(!strcasecmp(format, _(CR2_NAME))) return FILE_CR2;
01182 else
01183 if(!strcasecmp(format, _(MPEG_NAME))) return FILE_MPEG;
01184 else
01185 if(!strcasecmp(format, _(AMPEG_NAME))) return FILE_AMPEG;
01186 else
01187 if(!strcasecmp(format, _(VMPEG_NAME))) return FILE_VMPEG;
01188 else
01189 if(!strcasecmp(format, _(TGA_NAME))) return FILE_TGA;
01190 else
01191 if(!strcasecmp(format, _(TGA_LIST_NAME))) return FILE_TGA_LIST;
01192 else
01193 if(!strcasecmp(format, _(MOV_NAME))) return FILE_MOV;
01194 else
01195 if(!strcasecmp(format, _(AVI_NAME))) return FILE_AVI;
01196 else
01197 if(!strcasecmp(format, _(AVI_LAVTOOLS_NAME))) return FILE_AVI_LAVTOOLS;
01198 else
01199 if(!strcasecmp(format, _(AVI_ARNE2_NAME))) return FILE_AVI_ARNE2;
01200 else
01201 if(!strcasecmp(format, _(AVI_ARNE1_NAME))) return FILE_AVI_ARNE1;
01202 else
01203 if(!strcasecmp(format, _(AVI_AVIFILE_NAME))) return FILE_AVI_AVIFILE;
01204 else
01205 if(!strcasecmp(format, _(OGG_NAME))) return FILE_OGG;
01206 else
01207 if(!strcasecmp(format, _(VORBIS_NAME))) return FILE_VORBIS;
01208 else
01209 if(!strcasecmp(format, _(RAWDV_NAME))) return FILE_RAWDV;
01210 return 0;
01211 }
01212
01213 char* File::formattostr(int format)
01214 {
01215 return formattostr(0, format);
01216 }
01217
01218 char* File::formattostr(ArrayList<PluginServer*> *plugindb, int format)
01219 {
01220 switch(format)
01221 {
01222 case FILE_AC3:
01223 return _(AC3_NAME);
01224 break;
01225 case FILE_WAV:
01226 return _(WAV_NAME);
01227 break;
01228 case FILE_PCM:
01229 return _(PCM_NAME);
01230 break;
01231 case FILE_AU:
01232 return _(AU_NAME);
01233 break;
01234 case FILE_AIFF:
01235 return _(AIFF_NAME);
01236 break;
01237 case FILE_SND:
01238 return _(SND_NAME);
01239 break;
01240 case FILE_PNG:
01241 return _(PNG_NAME);
01242 break;
01243 case FILE_PNG_LIST:
01244 return _(PNG_LIST_NAME);
01245 break;
01246 case FILE_JPEG:
01247 return _(JPEG_NAME);
01248 break;
01249 case FILE_JPEG_LIST:
01250 return _(JPEG_LIST_NAME);
01251 break;
01252 case FILE_CR2:
01253 return _(CR2_NAME);
01254 break;
01255 case FILE_EXR:
01256 return _(EXR_NAME);
01257 break;
01258 case FILE_EXR_LIST:
01259 return _(EXR_LIST_NAME);
01260 break;
01261 case FILE_YUV:
01262 return _(YUV_NAME);
01263 break;
01264 case FILE_MPEG:
01265 return _(MPEG_NAME);
01266 break;
01267 case FILE_AMPEG:
01268 return _(AMPEG_NAME);
01269 break;
01270 case FILE_VMPEG:
01271 return _(VMPEG_NAME);
01272 break;
01273 case FILE_TGA:
01274 return _(TGA_NAME);
01275 break;
01276 case FILE_TGA_LIST:
01277 return _(TGA_LIST_NAME);
01278 break;
01279 case FILE_TIFF:
01280 return _(TIFF_NAME);
01281 break;
01282 case FILE_TIFF_LIST:
01283 return _(TIFF_LIST_NAME);
01284 break;
01285 case FILE_MOV:
01286 return _(MOV_NAME);
01287 break;
01288 case FILE_AVI_LAVTOOLS:
01289 return _(AVI_LAVTOOLS_NAME);
01290 break;
01291 case FILE_AVI:
01292 return _(AVI_NAME);
01293 break;
01294 case FILE_AVI_ARNE2:
01295 return _(AVI_ARNE2_NAME);
01296 break;
01297 case FILE_AVI_ARNE1:
01298 return _(AVI_ARNE1_NAME);
01299 break;
01300 case FILE_AVI_AVIFILE:
01301 return _(AVI_AVIFILE_NAME);
01302 break;
01303 case FILE_OGG:
01304 return _(OGG_NAME);
01305 break;
01306 case FILE_VORBIS:
01307 return _(VORBIS_NAME);
01308 break;
01309 case FILE_RAWDV:
01310 return _(RAWDV_NAME);
01311 break;
01312 default:
01313 return _("Unknown");
01314 break;
01315 }
01316 return "Unknown";
01317 }
01318
01319 int File::strtobits(char *bits)
01320 {
01321 if(!strcasecmp(bits, _(NAME_8BIT))) return BITSLINEAR8;
01322 if(!strcasecmp(bits, _(NAME_16BIT))) return BITSLINEAR16;
01323 if(!strcasecmp(bits, _(NAME_24BIT))) return BITSLINEAR24;
01324 if(!strcasecmp(bits, _(NAME_32BIT))) return BITSLINEAR32;
01325 if(!strcasecmp(bits, _(NAME_ULAW))) return BITSULAW;
01326 if(!strcasecmp(bits, _(NAME_ADPCM))) return BITS_ADPCM;
01327 if(!strcasecmp(bits, _(NAME_FLOAT))) return BITSFLOAT;
01328 if(!strcasecmp(bits, _(NAME_IMA4))) return BITSIMA4;
01329 return BITSLINEAR16;
01330 }
01331
01332 char* File::bitstostr(int bits)
01333 {
01334
01335 switch(bits)
01336 {
01337 case BITSLINEAR8:
01338 return (NAME_8BIT);
01339 break;
01340 case BITSLINEAR16:
01341 return (NAME_16BIT);
01342 break;
01343 case BITSLINEAR24:
01344 return (NAME_24BIT);
01345 break;
01346 case BITSLINEAR32:
01347 return (NAME_32BIT);
01348 break;
01349 case BITSULAW:
01350 return (NAME_ULAW);
01351 break;
01352 case BITS_ADPCM:
01353 return (NAME_ADPCM);
01354 break;
01355 case BITSFLOAT:
01356 return (NAME_FLOAT);
01357 break;
01358 case BITSIMA4:
01359 return (NAME_IMA4);
01360 break;
01361 }
01362 return "Unknown";
01363 }
01364
01365
01366
01367 int File::str_to_byteorder(char *string)
01368 {
01369 if(!strcasecmp(string, _("Lo Hi"))) return 1;
01370 return 0;
01371 }
01372
01373 char* File::byteorder_to_str(int byte_order)
01374 {
01375 if(byte_order) return _("Lo Hi");
01376 return _("Hi Lo");
01377 }
01378
01379 int File::bytes_per_sample(int bits)
01380 {
01381 switch(bits)
01382 {
01383 case BITSLINEAR8:
01384 return 1;
01385 break;
01386 case BITSLINEAR16:
01387 return 2;
01388 break;
01389 case BITSLINEAR24:
01390 return 3;
01391 break;
01392 case BITSLINEAR32:
01393 return 4;
01394 break;
01395 case BITSULAW:
01396 return 1;
01397 break;
01398 case BITSIMA4:
01399 return 1;
01400 break;
01401 }
01402 return 1;
01403 }
01404
01405
01406
01407
01408
01409 int File::get_best_colormodel(int driver)
01410 {
01411 return get_best_colormodel(asset, driver);
01412 }
01413
01414 int File::get_best_colormodel(Asset *asset, int driver)
01415 {
01416 switch(asset->format)
01417 {
01418 case FILE_RAWDV:
01419 return FileDV::get_best_colormodel(asset, driver);
01420 break;
01421
01422 case FILE_MOV:
01423 return FileMOV::get_best_colormodel(asset, driver);
01424 break;
01425
01426 case FILE_AVI:
01427 return FileMOV::get_best_colormodel(asset, driver);
01428 break;
01429
01430 case FILE_MPEG:
01431 return FileMPEG::get_best_colormodel(asset, driver);
01432 break;
01433
01434 case FILE_JPEG:
01435 case FILE_JPEG_LIST:
01436 return FileJPEG::get_best_colormodel(asset, driver);
01437 break;
01438
01439 case FILE_EXR:
01440 case FILE_EXR_LIST:
01441 return FileEXR::get_best_colormodel(asset, driver);
01442 break;
01443
01444 case FILE_YUV:
01445 return FileYUV::get_best_colormodel(asset, driver);
01446 break;
01447
01448 case FILE_PNG:
01449 case FILE_PNG_LIST:
01450 return FilePNG::get_best_colormodel(asset, driver);
01451 break;
01452
01453 case FILE_TGA:
01454 case FILE_TGA_LIST:
01455 return FileTGA::get_best_colormodel(asset, driver);
01456 break;
01457 }
01458
01459 return BC_RGB888;
01460 }
01461
01462
01463 int File::colormodel_supported(int colormodel)
01464 {
01465 if(file)
01466 return file->colormodel_supported(colormodel);
01467
01468 return BC_RGB888;
01469 }
01470
01471
01472 int64_t File::get_memory_usage()
01473 {
01474 int64_t result = 0;
01475 if(temp_frame) result += temp_frame->get_data_size();
01476 if(file) result += file->get_memory_usage();
01477 result += frame_cache->get_memory_usage();
01478 if(video_thread) result += video_thread->get_memory_usage();
01479
01480 if(result < MIN_CACHEITEM_SIZE) result = MIN_CACHEITEM_SIZE;
01481 return result;
01482 }
01483
01484 FrameCache* File::get_frame_cache()
01485 {
01486 return frame_cache;
01487 }
01488
01489 int File::supports_video(ArrayList<PluginServer*> *plugindb, char *format)
01490 {
01491 int i, format_i = strtoformat(plugindb, format);
01492
01493 return supports_video(format_i);
01494 return 0;
01495 }
01496
01497 int File::supports_audio(ArrayList<PluginServer*> *plugindb, char *format)
01498 {
01499 int i, format_i = strtoformat(plugindb, format);
01500
01501 return supports_audio(format_i);
01502 return 0;
01503 }
01504
01505
01506 int File::supports_video(int format)
01507 {
01508
01509 switch(format)
01510 {
01511 case FILE_OGG:
01512 case FILE_MOV:
01513 case FILE_JPEG:
01514 case FILE_JPEG_LIST:
01515 case FILE_CR2:
01516 case FILE_EXR:
01517 case FILE_EXR_LIST:
01518 case FILE_YUV:
01519 case FILE_PNG:
01520 case FILE_PNG_LIST:
01521 case FILE_TGA:
01522 case FILE_TGA_LIST:
01523 case FILE_TIFF:
01524 case FILE_TIFF_LIST:
01525 case FILE_VMPEG:
01526 case FILE_AVI_LAVTOOLS:
01527 case FILE_AVI_ARNE2:
01528 case FILE_AVI:
01529 case FILE_AVI_ARNE1:
01530 case FILE_AVI_AVIFILE:
01531 case FILE_RAWDV:
01532 return 1;
01533 break;
01534
01535 default:
01536 return 0;
01537 break;
01538 }
01539 }
01540
01541 int File::supports_audio(int format)
01542 {
01543 switch(format)
01544 {
01545 case FILE_AC3:
01546 case FILE_PCM:
01547 case FILE_WAV:
01548 case FILE_MOV:
01549 case FILE_OGG:
01550 case FILE_VORBIS:
01551 case FILE_AMPEG:
01552 case FILE_AU:
01553 case FILE_AIFF:
01554 case FILE_SND:
01555 case FILE_AVI:
01556 case FILE_AVI_LAVTOOLS:
01557 case FILE_AVI_ARNE2:
01558 case FILE_AVI_ARNE1:
01559 case FILE_AVI_AVIFILE:
01560 case FILE_RAWDV:
01561 return 1;
01562
01563 default:
01564 return 0;
01565 break;
01566 }
01567 }
01568
01569 char* File::get_tag(int format)
01570 {
01571 switch(format)
01572 {
01573 case FILE_AC3: return "ac3";
01574 case FILE_AIFF: return "aif";
01575 case FILE_AMPEG: return "mp3";
01576 case FILE_AU: return "au";
01577 case FILE_AVI: return "avi";
01578 case FILE_RAWDV: return "dv";
01579 case FILE_EXR: return "exr";
01580 case FILE_EXR_LIST: return "exr";
01581 case FILE_JPEG: return "jpg";
01582 case FILE_JPEG_LIST: return "jpg";
01583 case FILE_MOV: return "mov";
01584 case FILE_OGG: return "ogg";
01585 case FILE_PCM: return "pcm";
01586 case FILE_PNG: return "png";
01587 case FILE_PNG_LIST: return "png";
01588 case FILE_TGA: return "tga";
01589 case FILE_TGA_LIST: return "tga";
01590 case FILE_TIFF: return "tif";
01591 case FILE_TIFF_LIST: return "tif";
01592 case FILE_VMPEG: return "m2v";
01593 case FILE_VORBIS: return "ogg";
01594 case FILE_WAV: return "wav";
01595 case FILE_YUV: return "m2v";
01596 }
01597 return 0;
01598 }
01599
01600 PackagingEngine *File::new_packaging_engine(Asset *asset)
01601 {
01602 PackagingEngine *result;
01603 switch (asset->format)
01604 {
01605 case FILE_OGG:
01606 result = (PackagingEngine*)new PackagingEngineOGG();
01607 break;
01608 default:
01609 result = (PackagingEngine*) new PackagingEngineDefault();
01610 break;
01611 }
01612
01613 return result;
01614 }
01615
01616
01617
01618
01619
01620
01621
01622
01623