diff options
author | deva <deva> | 2005-06-16 21:28:57 +0000 |
---|---|---|
committer | deva <deva> | 2005-06-16 21:28:57 +0000 |
commit | e0592745a40dae2e14e5b6d9226f41a293ababc9 (patch) | |
tree | b3640c07fd6af71aa01bed384613ffda6c03bf41 | |
parent | c397f2dcdc399b43cf150f8000e711fc20613deb (diff) |
Rewrote thread object
Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to
growing server queue)
-rw-r--r-- | src/camera.cc | 16 | ||||
-rw-r--r-- | src/camera.h | 7 | ||||
-rw-r--r-- | src/decoder.cc | 7 | ||||
-rw-r--r-- | src/decoder.h | 7 | ||||
-rw-r--r-- | src/encoder.cc | 7 | ||||
-rw-r--r-- | src/encoder.h | 10 | ||||
-rw-r--r-- | src/frame.cc | 9 | ||||
-rw-r--r-- | src/frame.h | 13 | ||||
-rw-r--r-- | src/mainwindow.cc | 53 | ||||
-rw-r--r-- | src/mainwindow.h | 11 | ||||
-rw-r--r-- | src/miav_daemon.cc | 8 | ||||
-rw-r--r-- | src/mov_encoder.cc | 75 | ||||
-rw-r--r-- | src/mov_encoder.h | 10 | ||||
-rw-r--r-- | src/mov_encoder_thread.cc | 32 | ||||
-rw-r--r-- | src/mov_encoder_thread.h | 13 | ||||
-rw-r--r-- | src/mov_encoder_writer.cc | 77 | ||||
-rw-r--r-- | src/mov_encoder_writer.h | 7 | ||||
-rw-r--r-- | src/player.cc | 7 | ||||
-rw-r--r-- | src/player.h | 9 | ||||
-rw-r--r-- | src/thread.cc | 20 | ||||
-rw-r--r-- | src/thread.h | 19 |
21 files changed, 326 insertions, 91 deletions
diff --git a/src/camera.cc b/src/camera.cc index 52fe0b8..a9a0982 100644 --- a/src/camera.cc +++ b/src/camera.cc @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.18 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.17 2005/05/25 13:11:42 deva * * Made unfreeze close connection, when no recording is done. @@ -133,21 +138,24 @@ void Camera::connect(const char *ip, const int port) } */ - pthread_create (&decodetid, NULL, thread_run, decoder); + // pthread_create (&decodetid, NULL, thread_run, decoder); + decoder->run(); /* if(errorstatus->hasError()) { errorstatus->pushError("Camera initialization failed (decoder thread)."); return; } */ - pthread_create (&encodetid, NULL, thread_run, encoder); + // pthread_create (&encodetid, NULL, thread_run, encoder); + encoder->run(); /* if(errorstatus->hasError()) { errorstatus->pushError("Camera initialization failed (encoder thread)."); return; } */ - pthread_create (&playertid, NULL, thread_run, player); + // pthread_create (&playertid, NULL, thread_run, player); + player->run(); /* if(errorstatus->hasError()) { errorstatus->pushError("Camera initialization failed (player thread)."); @@ -162,9 +170,11 @@ Camera::~Camera() // Signal to the threads to stop running = 0; + /* // FIXME: Add some way to stop a thread object pthread_join(decodetid, NULL); pthread_join(playertid, NULL); pthread_join(encodetid, NULL); + */ delete decoder; delete encoder; diff --git a/src/camera.h b/src/camera.h index a495149..0ffdc3a 100644 --- a/src/camera.h +++ b/src/camera.h @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.13 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.12 2005/05/16 16:00:56 deva * * Lots of stuff! @@ -104,9 +109,11 @@ private: Info *info; bool initialized; + /* // No need for these anymore pthread_t playertid; pthread_t decodetid; pthread_t encodetid; + */ volatile int running; Encoder *encoder; diff --git a/src/decoder.cc b/src/decoder.cc index 404fc5f..5704347 100644 --- a/src/decoder.cc +++ b/src/decoder.cc @@ -39,6 +39,11 @@ /* * $Log$ + * Revision 1.33 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.32 2005/06/09 11:00:03 deva * Added daemon code, and cleaned up using -Wall and -Werror * @@ -218,7 +223,7 @@ void Decoder::decode() sem_post(encode_sem); } -void Decoder::run() { +void Decoder::thread_main() { decode(); fprintf(stderr, "Decoder thread stopped.\n"); fflush(stderr); } diff --git a/src/decoder.h b/src/decoder.h index 247124a..8606880 100644 --- a/src/decoder.h +++ b/src/decoder.h @@ -38,6 +38,11 @@ /* * $Log$ + * Revision 1.15 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.14 2005/05/25 13:11:42 deva * * Made unfreeze close connection, when no recording is done. @@ -91,7 +96,7 @@ public: pthread_mutex_t *gmutex, volatile int *grunning); ~Decoder(); - void run(); + void thread_main(); void freeze(); void unfreeze(); diff --git a/src/encoder.cc b/src/encoder.cc index f16a754..9bc6b56 100644 --- a/src/encoder.cc +++ b/src/encoder.cc @@ -39,6 +39,11 @@ /* * $Log$ + * Revision 1.29 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.28 2005/05/25 13:11:42 deva * * Made unfreeze close connection, when no recording is done. @@ -240,7 +245,7 @@ void Encoder::shoot() } -void Encoder::run() { +void Encoder::thread_main() { encode(); if(s) { if(n) delete n; diff --git a/src/encoder.h b/src/encoder.h index 2054f92..7eb1c87 100644 --- a/src/encoder.h +++ b/src/encoder.h @@ -38,6 +38,11 @@ /* * $Log$ + * Revision 1.13 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.12 2005/05/03 08:31:59 deva * Removed the error object, and replaced it with a more generic info object. * @@ -63,6 +68,8 @@ #ifndef __RTVIDEOREC_ENCODER_H #define __RTVIDEOREC_ENCODER_H +#include "thread.h" + #include "info.h" #include <stdio.h> @@ -73,7 +80,6 @@ #include "miav.h" #include "util.h" #include "package.h" -#include "thread.h" #include "frame.h" #include "queue.h" @@ -104,7 +110,7 @@ public: void freeze(); void shoot(); - void run(); + void thread_main(); // AVFormatContext *fc; sem_t *sem; diff --git a/src/frame.cc b/src/frame.cc index c6a2848..e204a2b 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.9 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.8 2005/06/02 20:45:01 deva * * Added clear button @@ -56,7 +61,7 @@ Frame::Frame(unsigned char *d, int sz) { - if(sz) data = (unsigned char *)malloc(sz); + if(sz) data = new unsigned char[sz]; if(sz && d) memcpy(data, d, sz); size = sz; number = 0; @@ -64,7 +69,7 @@ Frame::Frame(unsigned char *d, int sz) Frame::~Frame() { - free(data); + delete data; data = NULL; size = 0; } diff --git a/src/frame.h b/src/frame.h index 8734924..3300fff 100644 --- a/src/frame.h +++ b/src/frame.h @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.8 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.7 2005/05/25 13:11:42 deva * * Made unfreeze close connection, when no recording is done. @@ -63,13 +68,6 @@ public: Frame(unsigned char *d, int sz); ~Frame(); - /* - // Smaller frame number is higher priority - bool operator<(const Frame& f) const { - return number > f.number; - } - */ - unsigned char *data; int size; @@ -82,6 +80,7 @@ public: #include <functional> +// Method for use, when comparing Frames in priority queue. template <typename T> struct frame_priority : std::binary_function<T, T, bool> { bool operator() (const T& a, const T& b) const { diff --git a/src/mainwindow.cc b/src/mainwindow.cc index 1493506..0b1343e 100644 --- a/src/mainwindow.cc +++ b/src/mainwindow.cc @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.33 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.32 2005/06/15 08:41:49 deva * *** empty log message *** * @@ -119,7 +124,7 @@ MainWindow::MainWindow(QApplication *qApp, QWidget* parent, const char* name ) { info = new InfoGui(qApp, this, config); - info->log("Starting MIaV."); + info->log("Starting MIaV v. %s.", VERSION); video_width = config->readInt("video_width"); video_height = config->readInt("video_height"); @@ -254,17 +259,17 @@ void MainWindow::createGui() btn_cpr->setPixmap(*pix_cpr); QObject::connect( btn_cpr, SIGNAL(clicked()), this, SLOT(cpr_clicked()) ); // Will also be connected in the MGUI code - g1->addWidget(btn_cpr, 1, 1); + g1->addWidget(btn_cpr, 1, 2); lbl_name = createLabel("", 18, 2); g1->addMultiCellWidget ( lbl_name, 2, 2, 0, 2); - +/* btn_clear = createButton("Clear", 8, 3); // btn_clear->setPixmap(*pix_clear); QObject::connect( btn_clear, SIGNAL(clicked()), this, SLOT(clear_clicked()) ); // Will also be connected in the MGUI code g1->addWidget(btn_clear, 1, 2); - +*/ // Rec + Shot + Freeze buttons btn_rec = createButton("", 8, 3); btn_rec->setPixmap(*pix_record); @@ -292,6 +297,16 @@ void MainWindow::createGui() // g2->addWidget(img_history[i]); } + // FIXME: Create button like the other buttons + btn_clear = new QPushButton("Clear", gb); + btn_clear->setFont( QFont( "Arial", (int)(unit * 3 / 2), QFont::Bold ) ); + btn_clear->setFixedHeight((int)(unit * 3)); + + // btn_clear->setPixmap(*pix_clear); + QObject::connect( btn_clear, SIGNAL(clicked()), this, SLOT(clear_clicked()) ); + // Will also be connected in the MGUI code + + // Statusbar status = new QStatusBar(this); status->setSizeGripEnabled(FALSE); @@ -378,21 +393,28 @@ void MainWindow::message(char *msg) info->log("Message: %s", msg); } -void MainWindow::clear_clicked() +void MainWindow::clear() { info->log("Clearing screen."); + // History widgets + QImage dummy_resized = pix_dummy->smoothScale(240, 192); + + for(int i = 0; i < NUM_HISTORY; i++) { + img_history[i]->setPixmap(dummy_resized); + } + + lbl_name->setText(""); + lbl_cpr->setText(""); +} + +void MainWindow::clear_clicked() +{ if(MessageBox(this, TXT_ASK_CLEAR_SCREEN_TITLE, TXT_ASK_CLEAR_SCREEN, TYPE_YES_NO, ICON_QUESTION).exec() == MSG_YES) { - - // History widgets - QImage dummy_resized = pix_dummy->smoothScale(240, 192); - - for(int i = 0; i < NUM_HISTORY; i++) { - img_history[i]->setPixmap(dummy_resized); - } + clear(); } } @@ -416,6 +438,8 @@ void MainWindow::cpr_clicked() strcpy(oldname, lbl_name->text().ascii()); strcpy(oldcpr, lbl_cpr->text().ascii()); + clear(); + // Create and call the CPRQueryDialog. CPRQueryDialog dlg(lbl_cpr, lbl_name, this, TXT_CPRDLG_TITLE, status); @@ -427,6 +451,11 @@ void MainWindow::cpr_clicked() } else { // Change CPR camera. info->log("New CPR %s (old %s).", (char*)lbl_cpr->text().ascii(), oldcpr); + strcpy(oldname, lbl_name->text().ascii()); + strcpy(oldcpr, lbl_cpr->text().ascii()); + clear(); + lbl_name->setText(oldname); + lbl_cpr->setText(oldcpr); camera->setCpr((char*)lbl_cpr->text().ascii()); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index 790097e..d4c4c5b 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.16 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.15 2005/06/02 20:45:01 deva * * Added clear button @@ -100,8 +105,8 @@ using namespace std; Optagelsen standses ved tryk på den røde cirkel med gul streg over." #define TXT_TIME "Tid:" #define TXT_QUEUELENGTH "Buffer størelse:" -#define TXT_ASK_CLEAR_SCREEN_TITLE "Tøm billedlisten" -#define TXT_ASK_CLEAR_SCREEN "Er du sikker på at du vil tømme billedlisten?" +#define TXT_ASK_CLEAR_SCREEN_TITLE "Fjerne data fra skærmen?" +#define TXT_ASK_CLEAR_SCREEN "Er du sikker på at du vil dataene fra skærmen (billeder, CPR nummer og navn)?" /** * Images @@ -138,6 +143,8 @@ public slots: void taskbar_update(); private: + void clear(); + Info *info; void createGui(); diff --git a/src/miav_daemon.cc b/src/miav_daemon.cc index d59d7ec..520a2fb 100644 --- a/src/miav_daemon.cc +++ b/src/miav_daemon.cc @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.4 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.3 2005/06/14 13:47:09 deva * *** empty log message *** * @@ -69,7 +74,8 @@ int MiavDaemon::daemon_main() signal(SIGCLD, SIG_IGN); // Ved SIGCHILD til IGNORE maa wait/waitpid ikke kaldes // (ellers kommer der kernel-brok) - info.log("Listening on port %d", port); + info.info("Starting MIaV server v. %s", VERSION); + info.info("Listening on port %d", port); Socket *socket = new Socket(port, &info); while(1) { diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc index d422f87..908e857 100644 --- a/src/mov_encoder.cc +++ b/src/mov_encoder.cc @@ -39,6 +39,11 @@ /* * $Log$ + * Revision 1.30 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.29 2005/06/14 18:58:35 deva * *** empty log message *** * @@ -143,7 +148,9 @@ MovEncoder::MovEncoder(sem_t *r_sem, /////////LIBFAME STUFF/////////// // Allocate the output buffer. - fame_buffer = new unsigned char [FAME_BUFFER_SIZE]; + +// fame_buffer = new unsigned char [FAME_BUFFER_SIZE]; + /* // Open output file f=fopen(filename, "wb"); @@ -272,7 +279,7 @@ MovEncoder::~MovEncoder() fclose(f); } */ - delete [] fame_buffer; + // delete [] fame_buffer; delete [] yuv.y; delete [] yuv.u; delete [] yuv.v; @@ -370,7 +377,54 @@ void MovEncoder::encode_audio(Frame *dvframe) } // this runs in a thread -void MovEncoder::run() +void MovEncoder::thread_main() +{ + info->info("MovEncoder::run"); + + FrameVector *item; + Frame *in_frame; + Frame *out_frame; + + while(running) { + sem_wait(input_sem); + + // Lock inout mutex + pthread_mutex_lock(input_mutex); + item = inputqueue->front(); + inputqueue->pop(); + pthread_mutex_unlock(input_mutex); + // Unlock input mutex + + if(item) { + for(unsigned int cnt = 0; cnt < item->size(); cnt++) { + in_frame = item->at(cnt); + out_frame = encode(in_frame); + out_frame->number = in_frame->number; + + delete in_frame; + + // Lock output mutex + pthread_mutex_lock(output_mutex); + outputqueue->push(out_frame); + pthread_mutex_unlock(output_mutex); + // Unlock output mutex + + // Kick frame writer + sem_post(output_sem); + } + + delete item; + + // Kick reader + sem_post(read_sem); + } + } + + info->info("MovEncoder::stop"); +} + +/* +void MovEncoder::thread_main() { info->info("MovEncoder::run"); @@ -384,8 +438,10 @@ void MovEncoder::run() // Lock inout mutex pthread_mutex_lock(input_mutex); if(inputqueue->size() == 0) { - info->error("Dammit... Empty queue in MovEncoder."); + info->warn("Empty queue in MovEncoder (This should not happen)."); pthread_mutex_unlock(input_mutex); + // Kick reader + sem_post(read_sem); continue; } item = inputqueue->front(); @@ -394,7 +450,9 @@ void MovEncoder::run() // Unlock input mutex if(!item) { - info->warn("Empty block detected."); + info->warn("Empty block detected (This should not happen)."); + // Kick reader + sem_post(read_sem); continue; } @@ -410,13 +468,18 @@ void MovEncoder::run() outputqueue->push(out_frame); pthread_mutex_unlock(output_mutex); // Unlock output mutex + + // Kick frame writer + sem_post(output_sem); } delete item; + // Kick reader sem_post(read_sem); - sem_post(output_sem); } info->info("MovEncoder::stop"); } + + */ diff --git a/src/mov_encoder.h b/src/mov_encoder.h index f006daa..918768b 100644 --- a/src/mov_encoder.h +++ b/src/mov_encoder.h @@ -36,6 +36,11 @@ /* * $Log$ + * Revision 1.12 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.11 2005/06/14 12:29:40 deva * Incorporated the use of the Info object everywhere... also using the log functionality. * @@ -100,7 +105,7 @@ public: ~MovEncoder(); Frame* encode(Frame *frame); - void run(); + void thread_main(); volatile bool running; @@ -124,10 +129,11 @@ private: void encode_audio(Frame *frame); // libFAME encoder - unsigned char *fame_buffer; + // unsigned char *fame_buffer; fame_parameters_t fame_par; fame_context_t *fame_context; fame_yuv_t yuv; + unsigned char fame_buffer[FAME_BUFFER_SIZE]; // libdv decoder dv_decoder_t *dvdecoder; diff --git a/src/mov_encoder_thread.cc b/src/mov_encoder_thread.cc index 600a351..49ba24c 100644 --- a/src/mov_encoder_thread.cc +++ b/src/mov_encoder_thread.cc @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.12 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.11 2005/06/14 18:58:35 deva * *** empty log message *** * @@ -96,19 +101,21 @@ MovEncoderThread::MovEncoderThread(const char *cpr, Info *i) pthread_mutex_init (&output_mutex, NULL); writer = new MovEncoderWriter(cpr, outputqueue, &out_sem, &output_mutex, info); - writer_tid = new pthread_t; - pthread_create (writer_tid, NULL, thread_run, writer); + writer->run(); + // writer_tid = new pthread_t; + //pthread_create (writer_tid, NULL, thread_run, writer); for(int cnt = 0; cnt < threads; cnt++) { - encs.push_back(new MovEncoder(&read_sem, + MovEncoder *movenc = new MovEncoder(&read_sem, inputqueue, &in_sem, &input_mutex, outputqueue, &out_sem, &output_mutex, - info)); - tids.push_back(new pthread_t); - pthread_create (tids[cnt], NULL, thread_run, encs[cnt]); + info); + movenc->run(); + encs.push_back(movenc); + // tids.push_back(new pthread_t); + // pthread_create (tids[cnt], NULL, thread_run, encs[cnt]); } - current_frame = 0; frame_number = 0; } @@ -133,11 +140,11 @@ MovEncoderThread::~MovEncoderThread() // They should be exited now, so we can delete them. for(int cnt = 0; cnt < threads; cnt++) { - pthread_join(*tids[cnt], NULL); + // pthread_join(*tids[cnt], NULL); delete encs[cnt]; - delete tids[cnt]; + // delete tids[cnt]; } - + // Tell the writer to stop writer->running = false; @@ -145,8 +152,8 @@ MovEncoderThread::~MovEncoderThread() sem_post(&out_sem); // Destroy the thread - pthread_join(*writer_tid, NULL); - delete writer_tid; + // pthread_join(*writer_tid, NULL); + // delete writer_tid; // delete the writer (end thereby close the file) delete writer; @@ -193,7 +200,6 @@ void MovEncoderThread::encode(Frame* frame) sem_post(&in_sem); // Start new block - current_frame = 0; block = new FrameVector; } diff --git a/src/mov_encoder_thread.h b/src/mov_encoder_thread.h index 330e6e6..a4d334d 100644 --- a/src/mov_encoder_thread.h +++ b/src/mov_encoder_thread.h @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.8 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.7 2005/06/14 12:29:40 deva * Incorporated the use of the Info object everywhere... also using the log functionality. * @@ -64,9 +69,6 @@ #include <fcntl.h> #include <unistd.h> -#include <pthread.h> -#include <semaphore.h> - #include <vector> using namespace std; @@ -99,17 +101,16 @@ private: pthread_mutex_t output_mutex; // Used for encoder switching - int current_frame; unsigned int frame_number; unsigned int num_frames_in_block; MovEncoderWriter *writer; - pthread_t* writer_tid; + // pthread_t* writer_tid; int threads; vector<MovEncoder*> encs; - vector<pthread_t*> tids; + // vector<pthread_t*> tids; }; #endif/*__MIAV_MOV_ENCODER_THREAD_H__*/ diff --git a/src/mov_encoder_writer.cc b/src/mov_encoder_writer.cc index bd4fb56..a10d671 100644 --- a/src/mov_encoder_writer.cc +++ b/src/mov_encoder_writer.cc @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.6 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.5 2005/06/14 18:58:35 deva * *** empty log message *** * @@ -117,45 +122,76 @@ MovEncoderWriter::~MovEncoderWriter() delete file; } -//#define TEST_SIZE -#ifdef TEST_SIZE - #define BLOCK_SIZE 1024*1024 - #define TIMES 10 - static void *buf = NULL; -#endif - -void MovEncoderWriter::run() +void MovEncoderWriter::thread_main() { info->info("MovEncoderWriter::run"); -#ifdef TEST_SIZE - if(!buf) buf = malloc(BLOCK_SIZE); -#endif - Frame *frame; while(running) { sem_wait(sem); + // Lock output mutex + pthread_mutex_lock(mutex); + frame = queue->top(); + if(frame && frame->number == frame_number) queue->pop(); + pthread_mutex_unlock(mutex); + // Unlock output mutex + + while(frame && (frame->number == frame_number)) { + int ret; + + ret = file->Write(frame->data, frame->size); + + delete frame; + + if(ret == -1) return; + + frame_number++; + + // Lock output mutex + pthread_mutex_lock(mutex); + frame = queue->top(); + if(frame && frame->number == frame_number) queue->pop(); + pthread_mutex_unlock(mutex); + // Unlock output mutex + } + } + + info->info("MovEncoderWriter::stop"); +} + +/* +void MovEncoderWriter::thread_main() +{ + unsigned int howdeep = 0; + info->info("MovEncoderWriter::run"); + + Frame *frame; + + while(running) { + sem_wait(sem); + howdeep++; + + // Lock output mutex pthread_mutex_lock(mutex); if(queue->size() == 0) { - // info->warn("MovEncoderWriter::run() encountered an empty queue."); + info->warn("1MovEncoderWriter encountered an empty queue (This shouldn't happen)."); + // Unlock output mutex pthread_mutex_unlock(mutex); continue; } frame = queue->top(); if(frame->number == frame_number) queue->pop(); pthread_mutex_unlock(mutex); + // Unlock output mutex - while(frame->number == frame_number) { + while((frame->number == frame_number) && howdeep) { + howdeep--; int ret; -#ifdef TEST_SIZE - for(int cnt = 0; cnt < TIMES; cnt++) ret = file->Write(buf, BLOCK_SIZE); -#else ret = file->Write(frame->data, frame->size); -#endif delete frame; @@ -166,9 +202,9 @@ void MovEncoderWriter::run() // Lock output mutex pthread_mutex_lock(mutex); if(queue->size() == 0) { - //info->warn("MovEncoderWriter::run() encountered an empty queue."); + info->warn("2MovEncoderWriter encountered an empty queue (This shouldn't happen)."); pthread_mutex_unlock(mutex); - break; + continue; } frame = queue->top(); if(frame->number == frame_number) queue->pop(); @@ -179,3 +215,4 @@ void MovEncoderWriter::run() info->info("MovEncoderWriter::stop"); } +*/ diff --git a/src/mov_encoder_writer.h b/src/mov_encoder_writer.h index 4ed144f..6419b25 100644 --- a/src/mov_encoder_writer.h +++ b/src/mov_encoder_writer.h @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.4 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.3 2005/06/14 12:29:40 deva * Incorporated the use of the Info object everywhere... also using the log functionality. * @@ -63,7 +68,7 @@ public: Info *info); ~MovEncoderWriter(); - void run(); + void thread_main(); volatile bool running; diff --git a/src/player.cc b/src/player.cc index 051c910..8e39fa5 100644 --- a/src/player.cc +++ b/src/player.cc @@ -39,6 +39,11 @@ /* * $Log$ + * Revision 1.25 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.24 2005/06/09 11:00:03 deva * Added daemon code, and cleaned up using -Wall and -Werror * @@ -207,7 +212,7 @@ void Player::player() if(frame) delete frame; } -void Player::run() +void Player::thread_main() { player(); fprintf(stderr, "Player thread stopped.\n"); fflush(stderr); diff --git a/src/player.h b/src/player.h index e516a33..fb7d9c9 100644 --- a/src/player.h +++ b/src/player.h @@ -39,6 +39,11 @@ /* * $Log$ + * Revision 1.8 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.7 2005/05/03 08:31:59 deva * Removed the error object, and replaced it with a more generic info object. * @@ -56,8 +61,6 @@ #include <stdio.h> #include <stdlib.h> -#include <semaphore.h> -#include <pthread.h> #include <SDL/SDL.h> //#include <avformat.h> @@ -88,7 +91,7 @@ public: void start(); void stop(); - void run(); + void thread_main(); private: Info *info; diff --git a/src/thread.cc b/src/thread.cc index 1d59f74..e38774e 100644 --- a/src/thread.cc +++ b/src/thread.cc @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.4 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.3 2005/05/03 08:31:59 deva * Removed the error object, and replaced it with a more generic info object. * @@ -43,8 +48,19 @@ #include "thread.h" #include <stdio.h> -void* thread_run(void *data) { +static void* thread_run(void *data) { Thread *t = (Thread*)data; - t->run(); + t->thread_main(); return NULL; } + +Thread::Thread() +{} + +Thread::~Thread() +{} + +void Thread::run() +{ + pthread_create (&tid, NULL, thread_run, this); +} diff --git a/src/thread.h b/src/thread.h index 8f7bd41..b7f3f98 100644 --- a/src/thread.h +++ b/src/thread.h @@ -31,6 +31,11 @@ /* * $Log$ + * Revision 1.4 2005/06/16 21:28:57 deva + * Rewrote thread object + * Fixed bug in mov_encoder (pushed read_sem too many times, whihc lead to + * growing server queue) + * * Revision 1.3 2005/05/03 08:31:59 deva * Removed the error object, and replaced it with a more generic info object. * @@ -48,11 +53,15 @@ class Thread { public: - Thread() {} - virtual ~Thread() {} - virtual void run() = 0; -}; + Thread(); + virtual ~Thread(); + + void run(); -void* thread_run(void *data); + virtual void thread_main() = 0; + +private: + pthread_t tid; +}; #endif/*__THREAD_H__*/ |