diff options
Diffstat (limited to 'src/mov_encoder_writer.cc')
-rw-r--r-- | src/mov_encoder_writer.cc | 103 |
1 files changed, 19 insertions, 84 deletions
diff --git a/src/mov_encoder_writer.cc b/src/mov_encoder_writer.cc index 2ed6879..c3e4207 100644 --- a/src/mov_encoder_writer.cc +++ b/src/mov_encoder_writer.cc @@ -31,6 +31,9 @@ /* * $Log$ + * Revision 1.4 2005/06/14 12:29:40 deva + * Incorporated the use of the Info object everywhere... also using the log functionality. + * * Revision 1.3 2005/05/26 21:32:39 deva * *** empty log message *** * @@ -54,21 +57,19 @@ #include <config.h> #include "mov_encoder_writer.h" -MovEncoderWriter::MovEncoderWriter(const char* fname, FramePriorityQueue *q, sem_t *s, pthread_mutex_t *m) +MovEncoderWriter::MovEncoderWriter(const char* cpr, + FramePriorityQueue *q, + sem_t *s, + pthread_mutex_t *m, + Info *i) { - // 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)); - return; - } + info = i; + + // TODO: build filename from cpr and date + char fname[256]; + sprintf(fname, "/tmp/somefile"); + + file = new File(fname, "mpg", info); sem = s; queue = q; @@ -76,23 +77,17 @@ MovEncoderWriter::MovEncoderWriter(const char* fname, FramePriorityQueue *q, sem mutex = m; running = true; - - sequence_number = 0; } MovEncoderWriter::~MovEncoderWriter() { - if(file != -1) close(file); + delete file; } void MovEncoderWriter::run() { - // fprintf(stderr, "\t\t\t\t\t\t\t\t\tFile Writer ready!\n"); fflush(stderr); - Frame *frame; - if(file == -1) return; - while(running) { sem_wait(sem); @@ -103,73 +98,13 @@ void MovEncoderWriter::run() if(frame->number == frame_number) queue->pop(); pthread_mutex_unlock(mutex); - /* - if(!frame) { - fprintf(stderr, "\t\t\t\t\t\t\t\t\tNULL frame detected"); - continue; - } - */ - - // 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) { - int ret; - - ret = write(file, frame->data, frame->size); - if(ret != frame->size) { - 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. - ret = write(file, frame->data, frame->size); - if(ret == -1) { - fprintf(stderr, "Could not write to file: %s\n", strerror(errno)); fflush(stderr); - return; - } - fprintf(stderr, "Success\n"); fflush(stderr); - break; - } - } - + int ret = file->Write(frame->data, frame->size); delete frame; - - // fprintf(stderr, "\t\t\t\t\t\t\t\t\tWrite frame [%d]\n", frame->number); fflush(stderr); + if(ret == -1) return; + frame_number++; pthread_mutex_lock(mutex); |