summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2005-05-26 12:48:36 +0000
committerdeva <deva>2005-05-26 12:48:36 +0000
commitf4dc6f65497a805dad971feac1bce0f36ddd4ce5 (patch)
tree60348c5de5a3efb71c43ff0142f58e9bb7e82ae4
parentd4017394ba8868e5d44b5cc01a59c100cbaf953f (diff)
*** empty log message ***
-rw-r--r--TODO26
-rw-r--r--etc/miav.conf4
-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
8 files changed, 151 insertions, 39 deletions
diff --git a/TODO b/TODO
index 994e5e8..5b4a053 100644
--- a/TODO
+++ b/TODO
@@ -13,10 +13,6 @@ http://www.linuxmanpages.com/man3/fame_start_frame.3.php
// YUV420 format specification
http://encyclopedia.laborlawtalk.com/YUV_4:2:0
-- open med create unique
-- libFame frames have no timecodes!!!
-
-
==========================================================================
TASKS (client)
==========================================================================
@@ -28,6 +24,11 @@ MessageBox:
SplashScreen:
[ ] - Make it.
+ [ ] - Make setProgress method, with text.
+ [ ] - Control it from mainwindow constructor.
+ 1) Create / Show it in the beginning.
+ 2) Call setProgress at key points in the code.
+ 3) Hide / Destroy it at the end.
Mainwindow:
[x] - Clean out mgui code.
@@ -46,6 +47,10 @@ Mainwindow:
[ ] - Clear / update taskbar.
[ ] - Make new messagebox when asking to save movie.
(Save, Delete, Cancel, Save in one week)
+ [ ] - Make "clear" button in mainwindow, to remove last patient, before
+ the next enters.
+ [ ] - Realscale all window components.
+ [ ] - Realscale all icons (use highresolution icons and scale them down)
CPRQueryDialog:
[x] - Make it!
@@ -61,6 +66,7 @@ Encoder:
[x] - Make all data sent before deleting network object. (flush)
[x] - Remove ffmpeg code.
[x] - Make use of 2.6 kernel (through raw1394)
+ [ ] - Crash bug, when network connection is broken, during transfer.
Decoder:
[ ] - Enable sound decoding for the network stream.
@@ -82,6 +88,8 @@ Player:
ImgEncoder:
[x] - Make libjpeg calls work again.
+ [ ] - Save jpeg files in special cpr hierake 'encrypted'!
+ [ ] - Make save method configurable in options file.
MovEncoder:
[x] - Test Mpeg4. (no good)
@@ -90,6 +98,9 @@ MovEncoder:
[x] - Find good quality settings
(Best quality less than 22mb/s realtime encoded)
[x] - Multithread encoding, for multi cpu support.
+ [ ] - libFame frames have no timecodes!!!
+ [ ] - Files turning too big (>2gb) must automatically close and
+ conitnue in another file.
Main:
[ ] - Save movie signal handling.
@@ -100,6 +111,7 @@ Main:
[x] - Permissions on server file writing.
Files: u+wr g+r a+x - Directories: u+wrx g+rx a+rx.
[ ] - Permissions on server file writing to be read from config.
+ [ ] - Open med create unique
==========================================================================
TASKS (common)
@@ -131,9 +143,9 @@ ErrorObject:
[x] - Maintain error string stack, instead of appending.
[x] - Make it thread safe.
[x] - Make pushError take any number parameters and parse them on to sprintf
- [ ] - Make it a superclass.
- [ ] - Create a textmode version subclass (for the server).
- [ ] - Create a QT version subclass (callback to mainwindow with messagebox).
+ [x] - Make it a superclass.
+ [x] - Create a textmode version subclass (for the server).
+ [x] - Create a QT version subclass (callback to mainwindow with messagebox).
[ ] - Append to log, whenever error occur.
FFMpegWrapper:
diff --git a/etc/miav.conf b/etc/miav.conf
index 24b1eea..de58ac8 100644
--- a/etc/miav.conf
+++ b/etc/miav.conf
@@ -17,11 +17,11 @@ pixel_width = 1024
pixel_height = 768
# How and where to connect to the miav server?
-server_addr = "192.168.0.10"
+server_addr = "127.0.0.1"
server_port = 18120
# Where top store the files recieved by the server
-server_root = "/tmp/miav_files"
+server_root = "/home/miav/miav_files"
# Video output controls. A sequence of I and P, where I is keyframes
# which is fast to create, but uses a lot of discspace.
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;
}