diff options
Diffstat (limited to 'src')
| -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 | 
6 files changed, 130 insertions, 30 deletions
| 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;  } | 
