diff options
| -rw-r--r-- | TODO | 26 | ||||
| -rw-r--r-- | etc/miav.conf | 4 | ||||
| -rw-r--r-- | src/img_encoder.cc | 9 | ||||
| -rw-r--r-- | src/mov_encoder.cc | 9 | ||||
| -rw-r--r-- | src/mov_encoder_thread.cc | 9 | ||||
| -rw-r--r-- | src/mov_encoder_writer.cc | 90 | ||||
| -rw-r--r-- | src/mov_encoder_writer.h | 10 | ||||
| -rw-r--r-- | src/server.cc | 33 | 
8 files changed, 151 insertions, 39 deletions
| @@ -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 <config.h>  #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 <string> +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;  } | 
