From f4dc6f65497a805dad971feac1bce0f36ddd4ce5 Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 26 May 2005 12:48:36 +0000 Subject: *** empty log message *** --- 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 +++++++++-------- 6 files changed, 130 insertions(+), 30 deletions(-) (limited to 'src') 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