Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / filelist.h
diff --git a/cinelerra-5.1/cinelerra/filelist.h b/cinelerra-5.1/cinelerra/filelist.h
new file mode 100644 (file)
index 0000000..d35c211
--- /dev/null
@@ -0,0 +1,162 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef FILELIST_H
+#define FILELIST_H
+
+#include "file.inc"
+#include "filebase.h"
+#include "filelist.inc"
+#include "loadbalance.h"
+#include "mutex.inc"
+#include "vframe.inc"
+
+// Any file which is a list of frames.
+// FileList handles both frame files and indexes of frame files.
+
+
+
+
+
+
+class FileList : public FileBase
+{
+public:
+       FileList(Asset *asset,
+               File *file,
+               const char *list_prefix,
+               const char *file_extension,
+               int frame_type,
+               int list_type);
+       virtual ~FileList();
+
+// basic commands for every file interpreter
+       int open_file(int rd, int wr);
+       int close_file();
+
+       char* calculate_path(int number, char *string);
+       char* create_path(int number_override);
+       void add_return_value(int amount);
+
+       int read_list_header();
+       virtual int read_frame_header(char *path) { return 1; };
+       int read_frame(VFrame *frame);
+
+// subclass returns whether the asset format is a list or single file
+       virtual int read_frame(VFrame *frame, VFrame *data) { return 0; };
+       virtual int read_frame(VFrame *frame, char *path) { return 0; };
+       virtual int write_frame(VFrame *frame, VFrame *data, FrameWriterUnit *unit) { return 0; };
+// Return 1 if read frame should use the path instead of the compressed data
+       virtual int use_path();
+
+       int write_list_header();
+       int write_frames(VFrame ***frames, int len);
+       VFrame* read_frame(int use_alpha, int use_float);
+       virtual int64_t get_memory_usage();
+// Get the total writer units for calculating memory usage
+       int get_units();
+// Get a writer unit for retrieving temporary usage.
+       FrameWriterUnit* get_unit(int number);
+
+       virtual FrameWriterUnit* new_writer_unit(FrameWriter *writer);
+
+// Temp storage for compressed data
+       VFrame *data;
+// Storage for single frame
+       VFrame *temp;
+
+private:
+       int read_raw(VFrame *frame,
+               float in_x1, float in_y1, float in_x2, float in_y2,
+               float out_x1, float out_y1, float out_x2, float out_y2,
+               int alpha, int use_alpha, int use_float, int interpolate);
+       int reset_parameters_derived();
+       ArrayList<char*> path_list;     // List of files
+       const char *list_prefix;
+       const char *file_extension;
+       int frame_type;
+       int list_type;
+       Mutex *table_lock;
+       FrameWriter *writer;
+       int return_value;
+       int first_number;
+       int number_start;
+       int number_digits;
+};
+
+
+
+
+class FrameWriterPackage : public LoadPackage
+{
+public:
+       FrameWriterPackage();
+       ~FrameWriterPackage();
+
+
+       VFrame *input;
+
+       char *path;
+};
+
+
+
+
+class FrameWriterUnit : public LoadClient
+{
+public:
+       FrameWriterUnit(FrameWriter *server);
+       virtual ~FrameWriterUnit();
+
+       void process_package(LoadPackage *package);
+
+       FrameWriter *server;
+       VFrame *output;
+};
+
+
+
+
+
+class FrameWriter : public LoadServer
+{
+public:
+       FrameWriter(FileList *file, int cpus);
+       ~FrameWriter();
+
+       void write_frames(VFrame ***frames, int len);
+       void init_packages();
+       LoadClient* new_client();
+       LoadPackage* new_package();
+
+       FileList *file;
+       VFrame ***frames;
+       int len;
+};
+
+
+
+
+
+
+
+
+#endif