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.cc78
1 files changed, 71 insertions, 7 deletions
diff --git a/src/mov_encoder_writer.cc b/src/mov_encoder_writer.cc
index c3e4207..bd4fb56 100644
--- a/src/mov_encoder_writer.cc
+++ b/src/mov_encoder_writer.cc
@@ -31,6 +31,9 @@
/*
* $Log$
+ * Revision 1.5 2005/06/14 18:58:35 deva
+ * *** empty log message ***
+ *
* Revision 1.4 2005/06/14 12:29:40 deva
* Incorporated the use of the Info object everywhere... also using the log functionality.
*
@@ -44,6 +47,9 @@
* Added multithreaded encoding support.
*
*/
+#include <config.h>
+#include "mov_encoder_writer.h"
+
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -54,8 +60,12 @@
#include <errno.h>
-#include <config.h>
-#include "mov_encoder_writer.h"
+#include <string>
+using namespace std;
+
+#include "miav_config.h"
+
+#include <time.h>
MovEncoderWriter::MovEncoderWriter(const char* cpr,
FramePriorityQueue *q,
@@ -64,10 +74,32 @@ MovEncoderWriter::MovEncoderWriter(const char* cpr,
Info *i)
{
info = i;
+ info->info("MovEncoderWriter");
- // TODO: build filename from cpr and date
+ // Create path and filename
char fname[256];
- sprintf(fname, "/tmp/somefile");
+ string *server_root;
+ char birthmonth[3];
+ char date[32];
+
+ // Get server root
+ server_root = config->readString("server_root");
+
+ // Copy the bytes representing the birth month from the cpr
+ // [dd][mm][yy]-[nn][nn]
+ strncpy(birthmonth, &cpr[2], 2);
+ birthmonth[2] = 0;
+
+ // Create date (today) in [yyyy][mm][dd]
+ struct tm *ltime;
+ time_t t = time(NULL);
+ ltime = localtime(&t);
+ sprintf(date, "%.4d%.2d%.2d",
+ ltime->tm_year + 1900,
+ ltime->tm_mon,
+ ltime->tm_mday);
+
+ sprintf(fname, "%s/%s/%s/%s-%s-", server_root->c_str(), birthmonth, cpr, cpr, date);
file = new File(fname, "mpg", info);
@@ -81,37 +113,69 @@ MovEncoderWriter::MovEncoderWriter(const char* cpr,
MovEncoderWriter::~MovEncoderWriter()
{
+ info->info("~MovEncoderWriter");
delete file;
}
+//#define TEST_SIZE
+#ifdef TEST_SIZE
+ #define BLOCK_SIZE 1024*1024
+ #define TIMES 10
+ static void *buf = NULL;
+#endif
+
void MovEncoderWriter::run()
{
+ info->info("MovEncoderWriter::run");
+
+#ifdef TEST_SIZE
+ if(!buf) buf = malloc(BLOCK_SIZE);
+#endif
+
Frame *frame;
while(running) {
sem_wait(sem);
- if(queue->size() == 0) continue;
pthread_mutex_lock(mutex);
+ if(queue->size() == 0) {
+ // info->warn("MovEncoderWriter::run() encountered an empty queue.");
+ pthread_mutex_unlock(mutex);
+ continue;
+ }
frame = queue->top();
if(frame->number == frame_number) queue->pop();
pthread_mutex_unlock(mutex);
while(frame->number == frame_number) {
+ int ret;
+
+#ifdef TEST_SIZE
+ for(int cnt = 0; cnt < TIMES; cnt++) ret = file->Write(buf, BLOCK_SIZE);
+#else
+ ret = file->Write(frame->data, frame->size);
+#endif
- int ret = file->Write(frame->data, frame->size);
delete frame;
if(ret == -1) return;
frame_number++;
+ // Lock output mutex
pthread_mutex_lock(mutex);
+ if(queue->size() == 0) {
+ //info->warn("MovEncoderWriter::run() encountered an empty queue.");
+ pthread_mutex_unlock(mutex);
+ break;
+ }
frame = queue->top();
if(frame->number == frame_number) queue->pop();
pthread_mutex_unlock(mutex);
-
+ // Unlock output mutex
}
}
+
+ info->info("MovEncoderWriter::stop");
}