diff options
-rw-r--r-- | etc/miav.conf | 2 | ||||
-rw-r--r-- | src/daemon.cc | 3 | ||||
-rw-r--r-- | src/file.cc | 41 | ||||
-rw-r--r-- | src/info_console.cc | 4 | ||||
-rw-r--r-- | src/mov_encoder.cc | 20 | ||||
-rw-r--r-- | src/mov_encoder_thread.cc | 12 | ||||
-rw-r--r-- | src/mov_encoder_writer.cc | 78 | ||||
-rw-r--r-- | src/server.cc | 17 |
8 files changed, 118 insertions, 59 deletions
diff --git a/etc/miav.conf b/etc/miav.conf index 51fda2f..39bf4f6 100644 --- a/etc/miav.conf +++ b/etc/miav.conf @@ -45,7 +45,7 @@ frame_quality = 85 # The number of threads started for parallel encoding on the server # (for multiprocessor systems) -encoding_threads = 2 +encoding_threads = 1 # Codec is one of the following: # "mpeg1" For use with mpeg1 encoding. diff --git a/src/daemon.cc b/src/daemon.cc index fc42ee7..678a8c9 100644 --- a/src/daemon.cc +++ b/src/daemon.cc @@ -48,9 +48,8 @@ int Daemon::run(uid_t uid, gid_t gid) f = fork(); switch(f) { case -1: // Fork error - fprintf(stderr, "fork() error!\n"); + perror("Fork in daemon.cc"); return 1; - break; case 0: // Forked child if(setgid(gid) != 0) { diff --git a/src/file.cc b/src/file.cc index 813a041..2224178 100644 --- a/src/file.cc +++ b/src/file.cc @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.4 2005/06/14 18:58:35 deva + * *** empty log message *** + * * Revision 1.3 2005/06/14 12:29:40 deva * Incorporated the use of the Info object everywhere... also using the log functionality. * @@ -111,11 +114,11 @@ int File::Open() } fd = open(fname, O_CREAT | O_WRONLY | O_SYNC | O_EXCL, //| O_LARGEFILE S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - num ++; + if(fd == -1) num ++; // If more than 1000 files are created in one day, something is terribly wrong! if(num > 1000) { - info->error("Something is wrong with the path [%s]!\n", fname); + info->error("Something is wrong with the path [%s]!", fname); exit(1); } @@ -123,7 +126,7 @@ int File::Open() seqnum ++; - info->log("Opened the file %s for output.", fname); + info->info("Outout file: %s", fname); return 0; } @@ -135,11 +138,11 @@ int File::Write(void* data, int size) w = write(fd, data, size); if(w != size) { - info->log("Wrapping file.\n"); + info->info("Wrapping file."); Open(); w = write(fd, data, size); if(w != size) { - info->error("Out of diskspace!\n"); + info->error("Out of diskspace!"); return -1; } } @@ -158,10 +161,10 @@ int File::createPath(char* path) subpath[strrchr(subpath, '/') - subpath] = '\0'; - info->info("Checking and/or generating directory: %s", path); - if(strlen(subpath) > 0) createPath(subpath); + info->info("Checking and/or generating directory: %s", path); + // stat(path, &stats); //if(!S_ISDIR(stats.st_mode) && S_ISREG(stats.st_mode)) mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH | S_IROTH); @@ -172,27 +175,3 @@ int File::createPath(char* path) return 0; } - -#ifdef FILE_TEST // Test -#define BLOCK_SIZE 1024*1024 -#define TIMES 4000 -int main() -{ - void *buf = malloc(BLOCK_SIZE); - - double b = BLOCK_SIZE; - double t = TIMES; - - double gb = b / (1024 * 1024 * 1024); - gb *= t; - - printf("Writing %f GB.\n", gb); - - File file("/tmp/filetest/folder1/folder2/file", "ext"); - for(int cnt = 0; cnt < TIMES; cnt++) { - file.Write(buf, BLOCK_SIZE); - } - - printf("Done.\n"); -} -#endif // Test diff --git a/src/info_console.cc b/src/info_console.cc index fc82de4..a860dd8 100644 --- a/src/info_console.cc +++ b/src/info_console.cc @@ -26,11 +26,11 @@ */ /* - * $Id:$ + * $Id$ */ /* - * $Log:$ + * $Log$ */ #include <config.h> diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc index 3945040..d422f87 100644 --- a/src/mov_encoder.cc +++ b/src/mov_encoder.cc @@ -39,6 +39,9 @@ /* * $Log$ + * Revision 1.29 2005/06/14 18:58:35 deva + * *** empty log message *** + * * Revision 1.28 2005/06/14 12:29:40 deva * Incorporated the use of the Info object everywhere... also using the log functionality. * @@ -119,6 +122,7 @@ MovEncoder::MovEncoder(sem_t *r_sem, Info *i) { info = i; + info->info("MovEncoder"); // FIXME: Hmmm... should this be detected somewhere?! int w = 720; @@ -260,6 +264,7 @@ MovEncoder::MovEncoder(sem_t *r_sem, MovEncoder::~MovEncoder() { + info->info("~MovEncoder"); /* if(f) { // The file was opened. int written = fame_close(fame_context); @@ -367,19 +372,22 @@ void MovEncoder::encode_audio(Frame *dvframe) // this runs in a thread void MovEncoder::run() { + info->info("MovEncoder::run"); + FrameVector *item; Frame *in_frame; Frame *out_frame; - // 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); - // Lock inout mutex pthread_mutex_lock(input_mutex); + if(inputqueue->size() == 0) { + info->error("Dammit... Empty queue in MovEncoder."); + pthread_mutex_unlock(input_mutex); + continue; + } item = inputqueue->front(); inputqueue->pop(); pthread_mutex_unlock(input_mutex); @@ -402,8 +410,6 @@ void MovEncoder::run() outputqueue->push(out_frame); 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); } delete item; @@ -411,4 +417,6 @@ void MovEncoder::run() sem_post(read_sem); sem_post(output_sem); } + + info->info("MovEncoder::stop"); } diff --git a/src/mov_encoder_thread.cc b/src/mov_encoder_thread.cc index c1d3e56..600a351 100644 --- a/src/mov_encoder_thread.cc +++ b/src/mov_encoder_thread.cc @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.11 2005/06/14 18:58:35 deva + * *** empty log message *** + * * Revision 1.10 2005/06/14 12:29:40 deva * Incorporated the use of the Info object everywhere... also using the log functionality. * @@ -44,7 +47,6 @@ * Added multithreaded encoding support. * * Revision 1.6 2005/05/19 14:10:22 deva - * * Multithreading rulez? * * Revision 1.5 2005/05/19 10:55:49 deva @@ -71,13 +73,15 @@ MovEncoderThread::MovEncoderThread(const char *cpr, Info *i) { info = i; + info->info("MovEncoderThread"); + outputqueue = new FramePriorityQueue(); inputqueue = new FrameVectorQueue(); block = new FrameVector(); num_frames_in_block = config->readString("frame_sequence")->length(); - info->log("Frame sequence length %d", num_frames_in_block); + info->info("Frame sequence length %d", num_frames_in_block); threads = config->readInt("encoding_threads"); @@ -110,6 +114,8 @@ MovEncoderThread::MovEncoderThread(const char *cpr, Info *i) MovEncoderThread::~MovEncoderThread() { + info->info("~MovEncoderThread"); + // These should not be deleted here... its done elsewhere. // inputqueue = NULL; @@ -154,7 +160,7 @@ MovEncoderThread::~MovEncoderThread() void MovEncoderThread::encode(Frame* frame) { if(frame == NULL) { - info->log("NULL frame detected, exiting."); + info->info("MovEncoderThread::encode - NULL frame detected."); // Terminate return; } diff --git a/src/mov_encoder_writer.cc b/src/mov_encoder_writer.cc index c3e4207..bd4fb56 100644 --- a/src/mov_encoder_writer.cc +++ b/src/mov_encoder_writer.cc @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.5 2005/06/14 18:58:35 deva + * *** empty log message *** + * * Revision 1.4 2005/06/14 12:29:40 deva * Incorporated the use of the Info object everywhere... also using the log functionality. * @@ -44,6 +47,9 @@ * Added multithreaded encoding support. * */ +#include <config.h> +#include "mov_encoder_writer.h" + #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> @@ -54,8 +60,12 @@ #include <errno.h> -#include <config.h> -#include "mov_encoder_writer.h" +#include <string> +using namespace std; + +#include "miav_config.h" + +#include <time.h> MovEncoderWriter::MovEncoderWriter(const char* cpr, FramePriorityQueue *q, @@ -64,10 +74,32 @@ MovEncoderWriter::MovEncoderWriter(const char* cpr, Info *i) { info = i; + info->info("MovEncoderWriter"); - // TODO: build filename from cpr and date + // Create path and filename char fname[256]; - sprintf(fname, "/tmp/somefile"); + string *server_root; + char birthmonth[3]; + char date[32]; + + // Get server root + server_root = config->readString("server_root"); + + // Copy the bytes representing the birth month from the cpr + // [dd][mm][yy]-[nn][nn] + strncpy(birthmonth, &cpr[2], 2); + birthmonth[2] = 0; + + // Create date (today) in [yyyy][mm][dd] + struct tm *ltime; + time_t t = time(NULL); + ltime = localtime(&t); + sprintf(date, "%.4d%.2d%.2d", + ltime->tm_year + 1900, + ltime->tm_mon, + ltime->tm_mday); + + sprintf(fname, "%s/%s/%s/%s-%s-", server_root->c_str(), birthmonth, cpr, cpr, date); file = new File(fname, "mpg", info); @@ -81,37 +113,69 @@ MovEncoderWriter::MovEncoderWriter(const char* cpr, MovEncoderWriter::~MovEncoderWriter() { + info->info("~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() { + info->info("MovEncoderWriter::run"); + +#ifdef TEST_SIZE + if(!buf) buf = malloc(BLOCK_SIZE); +#endif + Frame *frame; while(running) { sem_wait(sem); - if(queue->size() == 0) continue; pthread_mutex_lock(mutex); + if(queue->size() == 0) { + // info->warn("MovEncoderWriter::run() encountered an empty queue."); + pthread_mutex_unlock(mutex); + continue; + } frame = queue->top(); if(frame->number == frame_number) queue->pop(); pthread_mutex_unlock(mutex); while(frame->number == frame_number) { + 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 - int ret = file->Write(frame->data, frame->size); delete frame; if(ret == -1) return; frame_number++; + // Lock output mutex pthread_mutex_lock(mutex); + if(queue->size() == 0) { + //info->warn("MovEncoderWriter::run() encountered an empty queue."); + pthread_mutex_unlock(mutex); + break; + } frame = queue->top(); if(frame->number == frame_number) queue->pop(); pthread_mutex_unlock(mutex); - + // Unlock output mutex } } + + info->info("MovEncoderWriter::stop"); } diff --git a/src/server.cc b/src/server.cc index 5e3126b..fad79ae 100644 --- a/src/server.cc +++ b/src/server.cc @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.23 2005/06/14 18:58:35 deva + * *** empty log message *** + * * Revision 1.22 2005/06/14 12:29:40 deva * Incorporated the use of the Info object everywhere... also using the log functionality. * @@ -41,14 +44,12 @@ * *** 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. * * Revision 1.18 2005/05/22 15:49:22 deva * Added multithreaded encoding support. * * Revision 1.17 2005/05/17 19:16:26 deva - * * Made new mpeg writer work, with proper file permissions. * * Revision 1.16 2005/05/17 15:12:51 deva @@ -58,11 +59,9 @@ * Added code, preparing threaded encoding. * * Revision 1.14 2005/05/16 16:00:57 deva - * * Lots of stuff! * * Revision 1.13 2005/05/09 16:40:20 deva - * * Added optimize yuv conversion code * * Revision 1.12 2005/05/07 10:56:18 deva @@ -98,6 +97,10 @@ // For errno #include <errno.h> +// For inet_ntoa +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> #include "miav_config.h" @@ -317,7 +320,7 @@ void newConnection(Socket *socket, Info *info) frame = new Frame(NULL, DVPACKAGE_SIZE); - info->log("New connection"); + info->info("New connection (%s)", inet_ntoa(socket->socketaddr.sin_addr)); Network network = Network(socket, info); while(int ret = network.recvPackage(&h, frame->data, frame->size)) { @@ -372,10 +375,10 @@ void newConnection(Socket *socket, Info *info) // TODO: Use save state - info->log("Closing connection..."); + info->info("Closing connection..."); if(enc) delete enc; - info->log("Connection closed"); + info->info("Connection closed"); } |