summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordeva <deva>2005-05-17 14:30:56 +0000
committerdeva <deva>2005-05-17 14:30:56 +0000
commite3710646f6557a1592fbffa910ebed674cd9edf0 (patch)
tree6c1fe6ebdc9dad236685ec7cf09ce19ea976222a
parenta7f843c9ac8bd1e4bbb017bcbfb73d7c5b110792 (diff)
Added code, preparing threaded encoding.
-rw-r--r--TODO6
-rw-r--r--etc/miav.conf8
-rw-r--r--src/Makefile.am6
-rw-r--r--src/mov_encoder.cc35
-rw-r--r--src/mov_encoder.h13
-rw-r--r--src/mov_encoder_thread.cc68
-rw-r--r--src/mov_encoder_thread.h66
-rw-r--r--src/server.cc22
8 files changed, 193 insertions, 31 deletions
diff --git a/TODO b/TODO
index 482474f..0151357 100644
--- a/TODO
+++ b/TODO
@@ -13,6 +13,12 @@ http://www.linuxmanpages.com/man3/fame_start_frame.3.php
// YUV420 format specification
http://encyclopedia.laborlawtalk.com/YUV_4:2:0
+- file permissions
+- multithreded encoding
+- fopen med create unique
+
+
+
==========================================================================
TASKS (client)
==========================================================================
diff --git a/etc/miav.conf b/etc/miav.conf
index c146221..a0692a2 100644
--- a/etc/miav.conf
+++ b/etc/miav.conf
@@ -17,8 +17,8 @@ pixel_width = 1024
pixel_height = 768
# How and where to connect to the miav server?
-server_addr = "127.0.0.1"
-server_port = 30000
+server_addr = "10.3.20.232"
+server_port = 18120
# Where top store the files recieved by the server
server_root = "/tmp/miav_files"
@@ -27,7 +27,7 @@ server_root = "/tmp/miav_files"
# which is fast to create, but uses a lot of discspace.
# B uses changes since last frame, is more cpu intensive, but uses a
# lot less diskspace than I frames
-frame_sequence = "IPPPPPPPPPP"
+frame_sequence = "IIPIP"
# quality in % - 100% is best quality
-frame_quality = 90
+frame_quality = 80
diff --git a/src/Makefile.am b/src/Makefile.am
index 11f5416..2bdb4dc 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -31,7 +31,8 @@ miav_SOURCES = $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList cc; fi ) \
dv1394.cc \
server_status.cc \
info_gui.cc \
- info_console.cc
+ info_console.cc \
+ mov_encoder_thread.cc
EXTRA_DIST = \
aboutwindow.h \
@@ -61,7 +62,8 @@ EXTRA_DIST = \
server_status.h \
info.h \
info_gui.h \
- info_console.h
+ info_console.h \
+ mov_encoder_thread.h
miav_LDADD := $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList o; fi )
diff --git a/src/mov_encoder.cc b/src/mov_encoder.cc
index fed2c40..bb24c5a 100644
--- a/src/mov_encoder.cc
+++ b/src/mov_encoder.cc
@@ -39,6 +39,9 @@
/*
* $Log$
+ * Revision 1.21 2005/05/17 14:30:56 deva
+ * Added code, preparing threaded encoding.
+ *
* Revision 1.20 2005/05/16 16:00:57 deva
*
* Lots of stuff!
@@ -94,7 +97,7 @@
//av_alloc_format_context
//av_destruct_packet_nofree
-MovEncoder::MovEncoder(const char *filename)
+MovEncoder::MovEncoder()
{
// FIXME: Hmmm... should this be detected somewhere?!
static int w = 720;
@@ -116,14 +119,14 @@ MovEncoder::MovEncoder(const char *filename)
// Allocate the output buffer.
fame_buffer = new unsigned char [FAME_BUFFER_SIZE];
-
+ /*
// Open output file
f=fopen(filename, "wb");
if(!f) {
- fprintf(stderr, "Failed to open output file [%s] due to teh following error: %s", filename, strerror(errno));
+ fprintf(stderr, "Failed to open output file [%s] due to the following error: %s", filename, strerror(errno));
return;
}
-
+ */
// Open a new session of the fame library.
// (If initialization was successful, it returns a non-null context which
// can then be used for subsequent library calls.)
@@ -204,27 +207,29 @@ MovEncoder::MovEncoder(const char *filename)
MovEncoder::~MovEncoder()
{
+ /*
if(f) { // The file was opened.
int written = fame_close(fame_context);
fwrite(fame_buffer, written, 1, f);
fclose(f);
}
+ */
delete [] fame_buffer;
delete [] yuv.y;
delete [] yuv.u;
delete [] yuv.v;
}
-void MovEncoder::encode(Frame *dvframe)
+Frame *MovEncoder::encode(Frame *dvframe)
{
- encode_video(dvframe);
- encode_audio(dvframe);
+ return encode_video(dvframe);
+ // encode_audio(dvframe);
}
-void MovEncoder::encode_video(Frame *dvframe)
+Frame *MovEncoder::encode_video(Frame *dvframe)
{
- if(!f) return; // The file was not opened.
-
+ // if(!f) return; // The file was not opened.
+
// Decode DV Frame to YUV422
int w = 720;
int h = 576;
@@ -281,13 +286,21 @@ void MovEncoder::encode_video(Frame *dvframe)
}
}
+ // Allocate a new frame for the output
+ Frame *output = new Frame(NULL, FAME_BUFFER_SIZE);
+ unsigned int pt = (unsigned int)output->data;
+
// Encode YUV frame and write it to disk.
fame_start_frame(fame_context, &yuv, 0);
int written;
while((written = fame_encode_slice(fame_context))) {
- fwrite(fame_buffer, written, 1, f);
+ // fwrite(fame_buffer, written, 1, f);
+ memcpy((void *)pt, fame_buffer, written);
+ pt += written;
}
fame_end_frame(fame_context,0);
+
+ return output;
}
void MovEncoder::encode_audio(Frame *dvframe)
diff --git a/src/mov_encoder.h b/src/mov_encoder.h
index 457b577..24525f2 100644
--- a/src/mov_encoder.h
+++ b/src/mov_encoder.h
@@ -36,6 +36,9 @@
/*
* $Log$
+ * Revision 1.8 2005/05/17 14:30:56 deva
+ * Added code, preparing threaded encoding.
+ *
* Revision 1.7 2005/05/09 16:40:20 deva
*
* Added optimize yuv conversion code
@@ -71,16 +74,16 @@
#include "util.h"
// size specifies the length of the buffer.
-#define FAME_BUFFER_SIZE (2*1024*1024) // FIXME: One size fits all...
+#define FAME_BUFFER_SIZE (2*720*576*4) // FIXME: One size fits all...
class MovEncoder {
public:
- MovEncoder(const char *filename);
+ MovEncoder();
~MovEncoder();
- void encode(Frame *frame);
+ Frame* encode(Frame *frame);
private:
- void encode_video(Frame *frame);
+ Frame *encode_video(Frame *frame);
void encode_audio(Frame *frame);
// buffer is the buffer where encoded data will be written to. It must be large
@@ -94,7 +97,7 @@ class MovEncoder {
// libdv decoder
dv_decoder_t *dvdecoder;
- unsigned char rgb[720*576*4];
+ unsigned char rgb[FAME_BUFFER_SIZE];
};
#endif
diff --git a/src/mov_encoder_thread.cc b/src/mov_encoder_thread.cc
new file mode 100644
index 0000000..a913e7b
--- /dev/null
+++ b/src/mov_encoder_thread.cc
@@ -0,0 +1,68 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * mov_encoder_thread.cc
+ *
+ * Tue May 17 16:00:01 CEST 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of MIaV.
+ *
+ * MIaV is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MIaV is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MIaV; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+/*
+ * $Id$
+ */
+
+/*
+ * $Log$
+ * Revision 1.1 2005/05/17 14:30:56 deva
+ * Added code, preparing threaded encoding.
+ *
+ */
+
+#include <config.h>
+#include "mov_encoder_thread.h"
+
+MovEncoderThread::MovEncoderThread(const char *filename)
+{
+ file = open(filename, O_CREAT | O_EXCL);
+
+ threads = 4;
+
+ for(int cnt = 0; cnt < threads; cnt++) {
+ encs.push_back(new MovEncoder());
+ }
+}
+
+MovEncoderThread::~MovEncoderThread()
+{
+ for(int cnt = 0; cnt < threads; cnt++) {
+ delete encs[cnt];
+ }
+ if(file) close(file);
+}
+
+void MovEncoderThread::encode(Frame* frame)
+{
+ if(!file) return;
+ printf("Encoding frame!\n");
+ Frame *enc_frame = encs[0]->encode(frame);
+ write(file, enc_frame->data, enc_frame->size);
+
+}
diff --git a/src/mov_encoder_thread.h b/src/mov_encoder_thread.h
new file mode 100644
index 0000000..22fb78c
--- /dev/null
+++ b/src/mov_encoder_thread.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * mov_encoder_thread.h
+ *
+ * Tue May 17 16:00:01 CEST 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of MIaV.
+ *
+ * MIaV is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MIaV is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MIaV; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+/*
+ * $Id$
+ */
+
+/*
+ * $Log$
+ * Revision 1.1 2005/05/17 14:30:56 deva
+ * Added code, preparing threaded encoding.
+ *
+ */
+
+#include <config.h>
+#ifndef __MIAV_MOV_ENCODER_THREAD_H__
+#define __MIAV_MOV_ENCODER_THREAD_H__
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <vector>
+using namespace std;
+
+#include "mov_encoder.h"
+
+class MovEncoderThread {
+public:
+ MovEncoderThread(const char *filename);
+ ~MovEncoderThread();
+
+ void encode(Frame* frame);
+
+private:
+ int threads;
+ int file;
+ vector<MovEncoder*> encs;
+};
+
+#endif/*__MIAV_MOV_ENCODER_THREAD_H__*/
diff --git a/src/server.cc b/src/server.cc
index 370af2e..ee14132 100644
--- a/src/server.cc
+++ b/src/server.cc
@@ -31,6 +31,9 @@
/*
* $Log$
+ * Revision 1.15 2005/05/17 14:30:56 deva
+ * Added code, preparing threaded encoding.
+ *
* Revision 1.14 2005/05/16 16:00:57 deva
*
* Lots of stuff!
@@ -71,7 +74,8 @@
#include "miav_config.h"
-#include "mov_encoder.h"
+//#include "mov_encoder.h"
+#include "mov_encoder_thread.h"
#include "img_encoder.h"
#include "server_status.h"
@@ -181,9 +185,9 @@ struct tm
};
*/
-MovEncoder *newMovEncoder(char* cpr)
+MovEncoderThread *newMovEncoder(char* cpr)
{
- MovEncoder *enc;
+ MovEncoderThread *enc;
struct tm *ltime;
time_t t = time(NULL);
FILE *fp;
@@ -202,7 +206,7 @@ MovEncoder *newMovEncoder(char* cpr)
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);
- enc = new MovEncoder(fname);
+ enc = new MovEncoderThread(fname);
return enc;
}
fclose(fp);
@@ -214,7 +218,7 @@ MovEncoder *newMovEncoder(char* cpr)
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);
- enc = new MovEncoder(fname);
+ enc = new MovEncoderThread(fname);
return enc;
}
@@ -230,7 +234,7 @@ MovEncoder *newMovEncoder(char* cpr)
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);
- enc = new MovEncoder(fname);
+ enc = new MovEncoderThread(fname);
return enc;
}
@@ -241,7 +245,7 @@ MovEncoder *newMovEncoder(char* cpr)
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);
- enc = new MovEncoder(fname);
+ enc = new MovEncoderThread(fname);
return enc;
}
@@ -265,7 +269,7 @@ MovEncoder *newMovEncoder(char* cpr)
}
fprintf(stderr, "Success - using filename: [%s]\n", fname); fflush(stderr);
- enc = new MovEncoder(fname);
+ enc = new MovEncoderThread(fname);
return enc;
}
@@ -280,7 +284,7 @@ void newConnection(Socket *socket)
n_header h;
Frame *frame;
Frame *freeze_frame = NULL;
- MovEncoder *enc = NULL;
+ MovEncoderThread *enc = NULL;
// unsigned char dvbuf[DVPACKAGE_SIZE];
frame = new Frame(NULL, DVPACKAGE_SIZE);