5 #include "filethread.h"
11 FileThread::FileThread(File *file, int do_audio, int do_video)
20 FileThread::~FileThread()
29 void FileThread::reset()
40 void FileThread::create_objects(File *file,
45 this->do_audio = do_audio;
46 this->do_video = do_video;
47 file_lock = new Mutex("FileThread::file_lock");
51 void FileThread::delete_objects()
55 for(int i = 0; i < ring_buffers; i++)
57 delete output_lock[i];
59 delete [] output_lock;
64 for(int i = 0; i < ring_buffers; i++)
73 delete [] last_buffer;
79 void FileThread::run()
84 //printf("FileThread::run 1 %d\n", getpid());
87 output_lock[local_buffer]->lock("FileThread::run 1");
93 if(!last_buffer[local_buffer])
95 if(output_size[local_buffer])
97 file_lock->lock("FileThread::run 2");
100 TRACE("FileThread::run 4");
101 result = file->write_samples(audio_buffer[local_buffer],
102 output_size[local_buffer]);
103 TRACE("FileThread::run 5");
111 for(j = 0; j < file->asset->layers && !result; j++)
112 for(i = 0; i < output_size[local_buffer] && !result; i++)
113 result = file->write_compressed_frame(video_buffer[local_buffer][j][i]);
117 result = file->write_frames(video_buffer[local_buffer],
118 output_size[local_buffer]);
123 return_value = result;
128 output_size[local_buffer] = 0;
133 input_lock[local_buffer]->unlock();
135 if(local_buffer >= ring_buffers) local_buffer = 0;
141 int FileThread::stop_writing()
143 int i, buffer, layer, frame;
146 input_lock[current_buffer]->lock("FileThread::stop_writing 1");
148 last_buffer[current_buffer] = 1;
150 for(i = 0; i < ring_buffers; i++)
151 output_lock[i]->unlock();
155 // wait for thread to finish
159 file_lock->lock("FileThread::stop_writing 2");
162 for(buffer = 0; buffer < ring_buffers; buffer++)
164 for(i = 0; i < file->asset->channels; i++)
165 delete [] audio_buffer[buffer][i];
166 delete [] audio_buffer[buffer];
168 delete [] audio_buffer;
172 // printf("FileThread::stop_writing %d %d %d %d\n",
175 // file->asset->layers,
179 for(buffer = 0; buffer < ring_buffers; buffer++)
181 for(layer = 0; layer < file->asset->layers; layer++)
183 for(frame = 0; frame < buffer_size; frame++)
185 delete video_buffer[buffer][layer][frame];
187 delete [] video_buffer[buffer][layer];
189 delete [] video_buffer[buffer];
191 delete [] video_buffer;
198 int FileThread::start_writing(long buffer_size,
204 int buffer, layer, frame;
205 long bytes_per_frame;
207 this->ring_buffers = ring_buffers;
208 this->buffer_size = buffer_size;
209 this->color_model = color_model;
210 this->compressed = compressed;
211 this->current_buffer = ring_buffers - 1;
215 file_lock->lock("FileThread::start_writing 1");
220 // Buffer is swapped before first get
221 last_buffer = new int[ring_buffers];
222 output_size = new long[ring_buffers];
225 output_lock = new Condition*[ring_buffers];
226 input_lock = new Condition*[ring_buffers];
227 for(int i = 0; i < ring_buffers; i++)
229 output_lock[i] = new Condition(0, "FileThread::output_lock");
230 input_lock[i] = new Condition(1, "FileThread::input_lock");
239 audio_buffer = new double**[ring_buffers];
240 for(buffer = 0; buffer < ring_buffers; buffer++)
242 audio_buffer[buffer] = new double*[file->asset->channels];
244 for(int channel = 0; channel < file->asset->channels; channel++)
246 audio_buffer[buffer][channel] = new double[buffer_size];
253 this->color_model = color_model;
254 bytes_per_frame = VFrame::calculate_data_size(file->asset->width,
259 video_buffer = new VFrame***[ring_buffers];
260 // printf("FileThread::start_writing 1 %d %d %d %p\n",
262 // file->asset->layers,
265 for(buffer = 0; buffer < ring_buffers; buffer++)
267 video_buffer[buffer] = new VFrame**[file->asset->layers];
268 for(layer = 0; layer < file->asset->layers; layer++)
270 video_buffer[buffer][layer] = new VFrame*[buffer_size];
271 for(frame = 0; frame < buffer_size; frame++)
274 video_buffer[buffer][layer][frame] = new VFrame;
277 video_buffer[buffer][layer][frame] =
282 // printf("FileThread::start_writing 4 %d %d %d %p\n",
286 // video_buffer[buffer][layer]);
294 for(int i = 0; i < ring_buffers; i++)
304 double** FileThread::get_audio_buffer()
308 input_lock[current_buffer]->lock("FileThread::get_audio_buffer");
309 return audio_buffer[current_buffer];
312 VFrame*** FileThread::get_video_buffer()
316 input_lock[current_buffer]->lock("FileThread::get_video_buffer");
317 return video_buffer[current_buffer];
320 int FileThread::write_buffer(long size)
322 output_size[current_buffer] = size;
324 // unlock the output lock
325 output_lock[current_buffer]->unlock();
330 int FileThread::swap_buffer()
333 if(current_buffer >= ring_buffers) current_buffer = 0;