summaryrefslogtreecommitdiff
path: root/src/mov_encoder_writer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mov_encoder_writer.cc')
-rw-r--r--src/mov_encoder_writer.cc90
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++;