diff options
Diffstat (limited to 'src/mov_encoder_thread.cc')
-rw-r--r-- | src/mov_encoder_thread.cc | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/mov_encoder_thread.cc b/src/mov_encoder_thread.cc index cfa6071..dc3581d 100644 --- a/src/mov_encoder_thread.cc +++ b/src/mov_encoder_thread.cc @@ -34,8 +34,16 @@ MovEncoderThread::MovEncoderThread(const char *cpr, Info *i) info = i; info->info("MovEncoderThread"); - outputqueue = new FramePriorityQueue(); + // Queues inputqueue = new FrameVectorQueue(); + video_outputqueue = new FramePriorityQueue(); + audio_outputqueue = new FramePriorityQueue(); + + // Queue mutexes + pthread_mutex_init (&input_mutex, NULL); + pthread_mutex_init (&video_output_mutex, NULL); + pthread_mutex_init (&audio_output_mutex, NULL); + block = new FrameVector(); num_frames_in_block = config->readString("frame_sequence")->length(); @@ -46,28 +54,26 @@ MovEncoderThread::MovEncoderThread(const char *cpr, Info *i) // Thread stuff sem_init(&in_sem, 0, 0); - sem_init(&out_sem, 0, 0); + sem_init(&video_out_sem, 0, 0); + sem_init(&audio_out_sem, 0, 0); sem_init(&read_sem, 0, 0); for(int cnt = 0; cnt < threads; cnt++) sem_post(&read_sem); - pthread_mutex_init (&input_mutex, NULL); - pthread_mutex_init (&output_mutex, NULL); - - writer = new MovEncoderWriter(cpr, outputqueue, &out_sem, &output_mutex, info); + writer = new MovEncoderWriter(cpr, + video_outputqueue, &video_output_mutex, &video_out_sem, + audio_outputqueue, &audio_output_mutex, &audio_out_sem, + info); writer->run(); - // writer_tid = new pthread_t; - //pthread_create (writer_tid, NULL, thread_run, writer); for(int cnt = 0; cnt < threads; cnt++) { MovEncoder *movenc = new MovEncoder(&read_sem, inputqueue, &in_sem, &input_mutex, - outputqueue, &out_sem, &output_mutex, + video_outputqueue, &video_output_mutex, &video_out_sem, + audio_outputqueue, &audio_output_mutex, &audio_out_sem, info); movenc->run(); encs.push_back(movenc); - // tids.push_back(new pthread_t); - // pthread_create (tids[cnt], NULL, thread_run, encs[cnt]); } frame_number = 0; @@ -80,9 +86,10 @@ MovEncoderThread::~MovEncoderThread() // These should not be deleted here... its done elsewhere. // inputqueue = NULL; - sem_post(&out_sem); + sem_post(&video_out_sem); + sem_post(&audio_out_sem); - // Stop the encoding threads. + // Tell the encoding threads to stop. for(int cnt = 0; cnt < threads; cnt++) { encs[cnt]->running = false; } @@ -94,27 +101,29 @@ MovEncoderThread::~MovEncoderThread() // They should be exited now, so we can delete them. for(int cnt = 0; cnt < threads; cnt++) { - // pthread_join(*tids[cnt], NULL); + // Wait for it to stop + encs[cnt]->wait_stop(); + // Delete it delete encs[cnt]; - // delete tids[cnt]; } // Tell the writer to stop writer->running = false; // Kick it to make it stop. - sem_post(&out_sem); + sem_post(&video_out_sem); + sem_post(&audio_out_sem); - // Destroy the thread - // pthread_join(*writer_tid, NULL); - // delete writer_tid; + // Wait for it to stop. + writer->wait_stop(); // delete the writer (end thereby close the file) delete writer; // Destroy the semaphores. sem_destroy(&in_sem); - sem_destroy(&out_sem); + sem_destroy(&video_out_sem); + sem_destroy(&audio_out_sem); sem_destroy(&read_sem); } @@ -157,5 +166,5 @@ void MovEncoderThread::encode(Frame* frame) block = new FrameVector; } - frame_number += 2; + frame_number ++; } |