summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/img_encoder.cc9
-rw-r--r--src/mov_encoder.cc9
-rw-r--r--src/mov_encoder_thread.cc9
-rw-r--r--src/mov_encoder_writer.cc90
-rw-r--r--src/mov_encoder_writer.h10
-rw-r--r--src/server.cc33
6 files changed, 130 insertions, 30 deletions
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 <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++;
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 <string>
+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;
}