From f4dc6f65497a805dad971feac1bce0f36ddd4ce5 Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 26 May 2005 12:48:36 +0000 Subject: *** empty log message *** --- TODO | 26 ++++++++++---- etc/miav.conf | 4 +-- src/img_encoder.cc | 9 ++++- src/mov_encoder.cc | 9 +++-- src/mov_encoder_thread.cc | 9 +++-- src/mov_encoder_writer.cc | 90 ++++++++++++++++++++++++++++++++++++++++++----- src/mov_encoder_writer.h | 10 ++++++ src/server.cc | 33 +++++++++-------- 8 files changed, 151 insertions(+), 39 deletions(-) diff --git a/TODO b/TODO index 994e5e8..5b4a053 100644 --- a/TODO +++ b/TODO @@ -13,10 +13,6 @@ http://www.linuxmanpages.com/man3/fame_start_frame.3.php // YUV420 format specification http://encyclopedia.laborlawtalk.com/YUV_4:2:0 -- open med create unique -- libFame frames have no timecodes!!! - - ========================================================================== TASKS (client) ========================================================================== @@ -28,6 +24,11 @@ MessageBox: SplashScreen: [ ] - Make it. + [ ] - Make setProgress method, with text. + [ ] - Control it from mainwindow constructor. + 1) Create / Show it in the beginning. + 2) Call setProgress at key points in the code. + 3) Hide / Destroy it at the end. Mainwindow: [x] - Clean out mgui code. @@ -46,6 +47,10 @@ Mainwindow: [ ] - Clear / update taskbar. [ ] - Make new messagebox when asking to save movie. (Save, Delete, Cancel, Save in one week) + [ ] - Make "clear" button in mainwindow, to remove last patient, before + the next enters. + [ ] - Realscale all window components. + [ ] - Realscale all icons (use highresolution icons and scale them down) CPRQueryDialog: [x] - Make it! @@ -61,6 +66,7 @@ Encoder: [x] - Make all data sent before deleting network object. (flush) [x] - Remove ffmpeg code. [x] - Make use of 2.6 kernel (through raw1394) + [ ] - Crash bug, when network connection is broken, during transfer. Decoder: [ ] - Enable sound decoding for the network stream. @@ -82,6 +88,8 @@ Player: ImgEncoder: [x] - Make libjpeg calls work again. + [ ] - Save jpeg files in special cpr hierake 'encrypted'! + [ ] - Make save method configurable in options file. MovEncoder: [x] - Test Mpeg4. (no good) @@ -90,6 +98,9 @@ MovEncoder: [x] - Find good quality settings (Best quality less than 22mb/s realtime encoded) [x] - Multithread encoding, for multi cpu support. + [ ] - libFame frames have no timecodes!!! + [ ] - Files turning too big (>2gb) must automatically close and + conitnue in another file. Main: [ ] - Save movie signal handling. @@ -100,6 +111,7 @@ Main: [x] - Permissions on server file writing. Files: u+wr g+r a+x - Directories: u+wrx g+rx a+rx. [ ] - Permissions on server file writing to be read from config. + [ ] - Open med create unique ========================================================================== TASKS (common) @@ -131,9 +143,9 @@ ErrorObject: [x] - Maintain error string stack, instead of appending. [x] - Make it thread safe. [x] - Make pushError take any number parameters and parse them on to sprintf - [ ] - Make it a superclass. - [ ] - Create a textmode version subclass (for the server). - [ ] - Create a QT version subclass (callback to mainwindow with messagebox). + [x] - Make it a superclass. + [x] - Create a textmode version subclass (for the server). + [x] - Create a QT version subclass (callback to mainwindow with messagebox). [ ] - Append to log, whenever error occur. FFMpegWrapper: diff --git a/etc/miav.conf b/etc/miav.conf index 24b1eea..de58ac8 100644 --- a/etc/miav.conf +++ b/etc/miav.conf @@ -17,11 +17,11 @@ pixel_width = 1024 pixel_height = 768 # How and where to connect to the miav server? -server_addr = "192.168.0.10" +server_addr = "127.0.0.1" server_port = 18120 # Where top store the files recieved by the server -server_root = "/tmp/miav_files" +server_root = "/home/miav/miav_files" # Video output controls. A sequence of I and P, where I is keyframes # which is fast to create, but uses a lot of discspace. diff --git a/src/img_encoder.cc b/src/img_encoder.cc index 7aca367..c5cc58b 100644 --- a/src/img_encoder.cc +++ b/src/img_encoder.cc @@ -39,6 +39,9 @@ /* * $Log$ + * Revision 1.9 2005/05/26 12:48:36 deva + * *** empty log message *** + * * Revision 1.8 2005/05/07 10:25:34 deva * * Removed ffmpeg code from img_encoder and corrected decoding errors in mov_encoder @@ -71,10 +74,14 @@ void ImgEncoder::encode(Frame *dvframe, char *filename, int quality) { + // Append suffix.. + char fname[256]; + sprintf(fname, "%s.jpg", filename); + unsigned char rgb[720*576*4]; getRGB(dvframe, rgb); - writeJPEGFile(filename, quality, (JSAMPLE*)rgb, 720, 576); + writeJPEGFile(fname, quality, (JSAMPLE*)rgb, 720, 576); } /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc index e052893..c5aec9d 100644 --- a/src/mov_encoder.cc +++ b/src/mov_encoder.cc @@ -39,6 +39,9 @@ /* * $Log$ + * Revision 1.26 2005/05/26 12:48:36 deva + * *** empty log message *** + * * Revision 1.25 2005/05/25 15:36:05 deva * Added mpeg4 encoding to the encoders, controllable by the config file. * @@ -359,12 +362,12 @@ void MovEncoder::run() Frame *in_frame; Frame *out_frame; - fprintf(stderr, "\t\t\t\tEncoder Ready\n"); fflush(stderr); + // fprintf(stderr, "\t\t\t\tEncoder Ready\n"); fflush(stderr); while(running) { sem_wait(input_sem); - fprintf(stderr, "\t\t\t\tReading block\n"); fflush(stderr); + // fprintf(stderr, "\t\t\t\tReading block\n"); fflush(stderr); // Lock inout mutex pthread_mutex_lock(input_mutex); @@ -391,7 +394,7 @@ void MovEncoder::run() pthread_mutex_unlock(output_mutex); // Unlock output mutex - fprintf(stderr, "\t\t\t\tEncoded [%d] - pushed it for writing\n", in_frame->number); fflush(stderr); + // fprintf(stderr, "\t\t\t\tEncoded [%d] - pushed it for writing\n", in_frame->number); fflush(stderr); } delete item; diff --git a/src/mov_encoder_thread.cc b/src/mov_encoder_thread.cc index 422efca..2febb4f 100644 --- a/src/mov_encoder_thread.cc +++ b/src/mov_encoder_thread.cc @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.9 2005/05/26 12:48:36 deva + * *** empty log message *** + * * Revision 1.8 2005/05/23 17:59:49 deva * Fixed delete of NULL input queue * @@ -169,9 +172,9 @@ void MovEncoderThread::encode(Frame* frame) pthread_mutex_unlock(&input_mutex); // Unlock input mutex - fprintf(stderr, "Frame vector [%d-%d] pushed\n", - block->at(0)->number, - block->at(block->size() - 1)->number); + // fprintf(stderr, "Frame vector [%d-%d] pushed\n", + // block->at(0)->number, + // block->at(block->size() - 1)->number); fflush(stderr); // Kick encoders diff --git a/src/mov_encoder_writer.cc b/src/mov_encoder_writer.cc index 941ef85..89ddc3d 100644 --- a/src/mov_encoder_writer.cc +++ b/src/mov_encoder_writer.cc @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.2 2005/05/26 12:48:36 deva + * *** empty log message *** + * * Revision 1.1 2005/05/22 15:49:22 deva * Added multithreaded encoding support. * @@ -48,10 +51,16 @@ #include #include "mov_encoder_writer.h" -MovEncoderWriter::MovEncoderWriter(const char* filename, FramePriorityQueue *q, sem_t *s, pthread_mutex_t *m) +MovEncoderWriter::MovEncoderWriter(const char* fname, FramePriorityQueue *q, sem_t *s, pthread_mutex_t *m) { - file = open(filename, - O_CREAT | O_WRONLY, //| O_LARGEFILE + // Append suffix + char f[256]; + sprintf(f, "%s.mpg", fname); + + filename = string(fname); + + file = open(f, + O_CREAT | O_WRONLY | O_SYNC, //| O_LARGEFILE S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if(file == -1) { fprintf(stderr, "Could not open file for writing: %s\n", strerror(errno)); @@ -64,6 +73,8 @@ MovEncoderWriter::MovEncoderWriter(const char* filename, FramePriorityQueue *q, mutex = m; running = true; + + sequence_number = 0; } MovEncoderWriter::~MovEncoderWriter() @@ -71,9 +82,13 @@ MovEncoderWriter::~MovEncoderWriter() if(file != -1) close(file); } +//#define TEST_BIG_FILE 10*1024*1024 void MovEncoderWriter::run() { - fprintf(stderr, "\t\t\t\t\t\t\t\t\tFile Writer ready!\n"); fflush(stderr); +#ifdef TEST_BIG_FILE + char big_buf[TEST_BIG_FILE]; +#endif/* TEST_BIG_FILE*/ + // fprintf(stderr, "\t\t\t\t\t\t\t\t\tFile Writer ready!\n"); fflush(stderr); Frame *frame; @@ -96,14 +111,73 @@ void MovEncoderWriter::run() } */ - fprintf(stderr, "\t\t\t\t\t\t\t\t\tChecking frame [%d] against expected [%d]\n", - frame->number, frame_number); fflush(stderr); + // fprintf(stderr, "\t\t\t\t\t\t\t\t\tChecking frame [%d] against expected [%d]\n", + // frame->number, frame_number); fflush(stderr); while(frame->number == frame_number) { - write(file, frame->data, frame->size); + int ret; +#ifdef TEST_BIG_FILE + ret = write(file, big_buf, TEST_BIG_FILE); +#else /* TEST_BIG_FILE */ + ret = write(file, frame->data, frame->size); +#endif /* TEST_BIG_FILE */ + + if(ret == -1) { + fprintf(stderr, "Error in filewriter\n"); fflush(stderr); + switch(errno) { + case EAGAIN: // Non-blocking I/O has been selected using O_NONBLOCK and the write would block. + case EBADF: // fd is not a valid file descriptor or is not open for writing. + case EFAULT: // buf is outside your accessible address space. + case EINTR: // The call was interrupted by a signal before any data was written. + case EINVAL: // fd is attached to an object which is unsuitable for writing. + case EIO: // A low-level I/O error occurred while modifying the inode. + case ENOSPC: // The device containing the file referred to by fd has no room for the data. + case EPIPE: // fd is connected to a pipe or socket whose reading end is closed. When this hap- + // pens the writing process will also receive a SIGPIPE signal. (Thus, the write + // return value is seen only if the program catches, blocks or ignores this sig- + // nal.) + fprintf(stderr, "Could not write to file: %s\n", strerror(errno)); fflush(stderr); + return; + + case EFBIG: // An attempt was made to write a file that exceeds the implementation-defined max- + // imum file size or the process' file size limit, or to write at a position past + // than the maximum allowed offset. + fprintf(stderr, "Attempting to write to a new file\n"); fflush(stderr); + // Close current file + if(file != -1) close(file); + { + sequence_number++; + // Create new filename + char f[256]; + sprintf(f, "%s-%d.mpg", filename.c_str(), sequence_number); + + // Open new file + file = open(f, + O_CREAT | O_WRONLY | O_SYNC, //| O_LARGEFILE + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if(file == -1) { + fprintf(stderr, "Could not open file for writing: %s\n", strerror(errno)); fflush(stderr); + return; + } + } + // Do write again. +#ifdef TEST_BIG_FILE + ret = write(file, big_buf, TEST_BIG_FILE); +#else /* TEST_BIG_FILE */ + ret = write(file, frame->data, frame->size); +#endif /* TEST_BIG_FILE */ + if(ret == -1) { + fprintf(stderr, "Could not write to file: %s\n", strerror(errno)); fflush(stderr); + return; + } + fprintf(stderr, "Success\n"); fflush(stderr); + break; + } + } + delete frame; - fprintf(stderr, "\t\t\t\t\t\t\t\t\tWrite frame [%d]\n", frame->number); fflush(stderr); + // fprintf(stderr, "\t\t\t\t\t\t\t\t\tWrite frame [%d]\n", frame->number); fflush(stderr); frame_number++; diff --git a/src/mov_encoder_writer.h b/src/mov_encoder_writer.h index 44647a0..816abac 100644 --- a/src/mov_encoder_writer.h +++ b/src/mov_encoder_writer.h @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.2 2005/05/26 12:48:36 deva + * *** empty log message *** + * * Revision 1.1 2005/05/22 15:49:22 deva * Added multithreaded encoding support. * @@ -43,6 +46,9 @@ #include "frame.h" #include "thread.h" +#include +using namespace std; + class MovEncoderWriter : public Thread { public: MovEncoderWriter(const char* filename, FramePriorityQueue *q, sem_t *s, pthread_mutex_t *m); @@ -53,6 +59,10 @@ public: volatile bool running; private: + // for use when creating multiple files in one movie. + int sequence_number; + + string filename; int file; FramePriorityQueue *queue; diff --git a/src/server.cc b/src/server.cc index f13d8df..72df6b6 100644 --- a/src/server.cc +++ b/src/server.cc @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.20 2005/05/26 12:48:36 deva + * *** empty log message *** + * * Revision 1.19 2005/05/22 16:34:44 deva * * Fix: Connection is now taken down when taking a sanpshot without recording. @@ -117,8 +120,8 @@ void saveFrameAsImage(char* cpr, Frame *f) if(!fp) { int r = rand(); fprintf(stderr, "MIaV does not have write access to the server root [%s]\n", root->c_str()); - fprintf(stderr, "Redirecting output to [/tmp/miav-%d.mpg]\n", r); - sprintf(fname, "/tmp/miav-%d.mpg", r); + fprintf(stderr, "Redirecting output to [/tmp/miav-%d.jpg]\n", r); + sprintf(fname, "/tmp/miav-%d", r); imgenc.encode(f, fname, 100); // Quality is between 0...100, where 100 is best. return; } @@ -130,7 +133,7 @@ void saveFrameAsImage(char* cpr, Frame *f) int r = rand(); fprintf(stderr, "Illigal CPR, it must have length 11, it had length %d\n", strlen(cpr)); fprintf(stderr, "Redirecting output to [/tmp/miav-%d.jpg]\n", r); - sprintf(fname, "/tmp/miav-%d.mpg", r); + sprintf(fname, "/tmp/miav-%d", r); imgenc.encode(f, fname, 100); // Quality is between 0...100, where 100 is best. return; } @@ -146,7 +149,7 @@ void saveFrameAsImage(char* cpr, Frame *f) int r = rand(); fprintf(stderr, "Not possible to create subfolder %s\n", fname); fprintf(stderr, "Redirecting output to [/tmp/miav-%d.jpg]\n", r); - sprintf(fname, "/tmp/miav-%d.mpg", r); + sprintf(fname, "/tmp/miav-%d", r); imgenc.encode(f, fname, 100); // Quality is between 0...100, where 100 is best. return; } @@ -157,7 +160,7 @@ void saveFrameAsImage(char* cpr, Frame *f) int r = rand(); fprintf(stderr, "Not possible to create subfolder %s\n", fname); fprintf(stderr, "Redirecting output to [/tmp/miav-%d.jpg]\n", r); - sprintf(fname, "/tmp/miav-%d.mpg", r); + sprintf(fname, "/tmp/miav-%d", r); imgenc.encode(f, fname, 100); // Quality is between 0...100, where 100 is best. return; } @@ -170,18 +173,18 @@ void saveFrameAsImage(char* cpr, Frame *f) ltime->tm_mday); // Create filename: [serverroot]/[birthmonth]/[cpr]/[cpr]-[date]-[cnt].mpg - sprintf(fname, "%s/%s/%s/%s-%s-%.3d.jpg", root->c_str(), birthmonth, cpr, cpr, date, cnt); + sprintf(fname, "%s/%s/%s/%s-%s-%.3d", root->c_str(), birthmonth, cpr, cpr, date, cnt); // test filename-[cnt] for existamce cnt++ until not existing. fp = fopen(fname, "r"); while(fp) { fclose(fp); cnt++; - sprintf(fname, "%s/%s/%s/%s-%s-%.3d.jpg", root->c_str(), birthmonth, cpr, cpr, date, cnt); + sprintf(fname, "%s/%s/%s/%s-%s-%.3d", root->c_str(), birthmonth, cpr, cpr, date, cnt); fp = fopen(fname, "r"); } - fprintf(stderr, "Success - using filename: [%s]\n", fname); fflush(stderr); + fprintf(stderr, "Success - using filename: [%s.jpg]\n", fname); fflush(stderr); imgenc.encode(f, fname, 100); // Quality is between 0...100, where 100 is best. } /* @@ -219,7 +222,7 @@ MovEncoderThread *newMovEncoder(char* cpr) int r = rand(); fprintf(stderr, "MIaV does not have write access to the server root [%s]\n", root->c_str()); fprintf(stderr, "Redirecting output to [/tmp/miav-%d.mpg]\n", r); - sprintf(fname, "/tmp/miav-%d.mpg", r); + sprintf(fname, "/tmp/miav-%d", r); enc = new MovEncoderThread(fname); return enc; } @@ -231,7 +234,7 @@ MovEncoderThread *newMovEncoder(char* cpr) int r = rand(); fprintf(stderr, "Illigal CPR, it must have length 11, it had lentgh %d\n", strlen(cpr)); fprintf(stderr, "Redirecting output to [/tmp/miav-%d.mpg]\n", r); - sprintf(fname, "/tmp/miav-%d.mpg", r); + sprintf(fname, "/tmp/miav-%d", r); enc = new MovEncoderThread(fname); return enc; } @@ -247,7 +250,7 @@ MovEncoderThread *newMovEncoder(char* cpr) int r = rand(); fprintf(stderr, "Not possible to create subfolder %s\n", fname); fprintf(stderr, "Redirecting output to [/tmp/miav-%d.mpg]\n", r); - sprintf(fname, "/tmp/miav-%d.mpg", r); + sprintf(fname, "/tmp/miav-%d", r); enc = new MovEncoderThread(fname); return enc; } @@ -258,7 +261,7 @@ MovEncoderThread *newMovEncoder(char* cpr) int r = rand(); fprintf(stderr, "Not possible to create subfolder %s\n", fname); fprintf(stderr, "Redirecting output to [/tmp/miav-%d.mpg]\n", r); - sprintf(fname, "/tmp/miav-%d.mpg", r); + sprintf(fname, "/tmp/miav-%d", r); enc = new MovEncoderThread(fname); return enc; } @@ -271,18 +274,18 @@ MovEncoderThread *newMovEncoder(char* cpr) ltime->tm_mday); // Create filename: [serverroot]/[birthmonth]/[cpr]/[cpr]-[date]-[cnt].mpg - sprintf(fname, "%s/%s/%s/%s-%s-%.3d.mpg", root->c_str(), birthmonth, cpr, cpr, date, cnt); + sprintf(fname, "%s/%s/%s/%s-%s-%.3d", root->c_str(), birthmonth, cpr, cpr, date, cnt); // test filename-[cnt] for existamce cnt++ until not existing. fp = fopen(fname, "r"); while(fp) { fclose(fp); cnt++; - sprintf(fname, "%s/%s/%s/%s-%s-%.3d.mpg", root->c_str(), birthmonth, cpr, cpr, date, cnt); + sprintf(fname, "%s/%s/%s/%s-%s-%.3d", root->c_str(), birthmonth, cpr, cpr, date, cnt); fp = fopen(fname, "r"); } - fprintf(stderr, "Success - using filename: [%s]\n", fname); fflush(stderr); + fprintf(stderr, "Success - using filename: [%s.mpg]\n", fname); fflush(stderr); enc = new MovEncoderThread(fname); return enc; } -- cgit v1.2.3