diff options
Diffstat (limited to 'src/mov_encoder_writer.cc')
-rw-r--r-- | src/mov_encoder_writer.cc | 90 |
1 files changed, 82 insertions, 8 deletions
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++; |