summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO51
-rw-r--r--src/Makefile.am4
-rw-r--r--src/camera.cc36
-rw-r--r--src/camera.h23
-rw-r--r--src/decoder.cc21
-rw-r--r--src/decoder.h9
-rw-r--r--src/encoder.cc7
-rw-r--r--src/encoder.h14
-rw-r--r--src/error.cc73
-rw-r--r--src/error.h53
-rw-r--r--src/mainwindow.cc26
-rw-r--r--src/player.cc16
-rw-r--r--src/player.h11
-rwxr-xr-xtools/MIaVAdd1
14 files changed, 294 insertions, 51 deletions
diff --git a/TODO b/TODO
index 264c7d6..b11ff3f 100644
--- a/TODO
+++ b/TODO
@@ -1,27 +1,52 @@
==========================================================================
- TASKS
+ TASKS (client)
==========================================================================
MessageBox:
- [x] - Make it!
+ [x] - Make it.
[/] - Make icons.
[ ] - Test it.
+SplashScreen:
+ [ ] - Make it.
+
Mainwindow:
[x] - Clean out mgui code.
[x] - Make generic gui layout code.
[/] - Make icons.
+ [x] - Make statusbar.
+ [ ] - Show network connection in statusbar.
+ [ ] - Show camera connection in statusbar.
[ ] - Test it.
CPRQueryDialog:
[x] - Make it!
[ ] - Clean out unnessecary code.
+ [ ] - Make cancel posibility (return code 0 should do something useful)
+ [ ] - Make icons.
[ ] - Test it.
-MiavConfig:
- [x] - Integrate file parser.
- [ ] - Make code for input validity test.
+Decoder:
+ [ ] - Enable sound decoding for the network stream.
+
+Camera:
+ [ ] - Add initialize method (constructor should do nothing).
+ [ ] - Add getStatus methods.
+
+==========================================================================
+ TASKS (server)
+==========================================================================
+
+ImgEncoder:
+ [x] - Make libjpeg calls work again.
+
+MovEncoder:
+ [ ] - Enable sound.
+
+==========================================================================
+ TASKS (common)
+==========================================================================
Makesystem:
[x] - "Port" to automake/autoconf
@@ -30,17 +55,17 @@ Makesystem:
[ ] - Make ffmpeg detection in configure script
[x] - Make server standalone compilable (through flag to configure)
-ImgEncoder:
- [x] - Make libjpeg call agains work
-
-MovEncoder:
- [ ] - Enable sound.
+MiavConfig:
+ [x] - Integrate file parser.
+ [ ] - Make code for input validity test.
-Decoder:
- [ ] - Enable sound decoding for the network stream.
+ErrorObject:
+ [x] - Make it.
+ [ ] - Maintain error string stack, instead of appending.
+ [ ] - Make thread safe.
FFMpegWrapper:
- [ ] - Make it
+ [ ] - Make it.
==========================================================================
diff --git a/src/Makefile.am b/src/Makefile.am
index 75e6f85..9d574e4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,3 +1,4 @@
+#frekin' wierd
## TODO: Move ffmpeg, libxml and libsdl into configure.in
AM_CXXFLAGS := $(CXXFLAGS) $(EXTRA_CXXFLAGS) -I../include $(QT_CXXFLAGS) \
@@ -26,7 +27,8 @@ miav_SOURCES = $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList cc; fi ) \
miav_config.cc \
mov_encoder.cc \
img_encoder.cc \
- server.cc
+ server.cc \
+ error.cc
miav_LDADD := $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList o; fi ) \
-lavcodec -lavformat
diff --git a/src/camera.cc b/src/camera.cc
index 574caf3..ac23fc9 100644
--- a/src/camera.cc
+++ b/src/camera.cc
@@ -27,8 +27,14 @@
#include "camera.h"
-Camera::Camera(const char *ip, const int port)
+Camera::Camera()
{
+}
+
+void Camera::connect(const char *ip, const int port)
+{
+ errorstatus = new Error();
+
pthread_mutex_init (&mutex, NULL);
//mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -48,7 +54,8 @@ Camera::Camera(const char *ip, const int port)
sem_init(&encode_sem, 0, 0);
sem_init(&player_sem, 0, 0);
- decoder = new Decoder(device,
+ decoder = new Decoder(errorstatus,
+ device,
channel,
&encode_sem,
&player_sem,
@@ -59,14 +66,16 @@ Camera::Camera(const char *ip, const int port)
// ifmtctx = decoder->fc;
if(!decoder->fc) return;
- encoder = new Encoder(ip, port,
+ encoder = new Encoder(errorstatus,
+ ip, port,
&encode_sem,
encode_queue,
&mutex,
&running);
ofmtctx = encoder->fc;
- player = new Player(&running,
+ player = new Player(errorstatus,
+ &running,
&player_sem,
player_queue,
&mutex);
@@ -94,26 +103,31 @@ Camera::~Camera()
delete player_queue;
delete encode_queue;
+
+ delete errorstatus;
}
void Camera::setCpr(char *newcpr)
{
+
encoder->setCpr(newcpr);
}
void Camera::start()
{
- encoder->stop();
+ encoder->start();
}
void Camera::stop()
{
- encoder->start();
+ encoder->stop();
}
void Camera::freeze()
{
+ // FIXME: Ensure they freeze the same frame, i.e. the player
+ // shows the same frame that is actually fronzen on the server.
player->stop();
encoder->freeze();
}
@@ -128,4 +142,14 @@ void Camera::snapshot()
encoder->shoot();
}
+bool Camera::hasError()
+{
+ return errorstatus->hasError();
+}
+
+string Camera::getErrorString()
+{
+ return errorstatus->getErrorString();
+}
+
#endif/* USE_GUI */
diff --git a/src/camera.h b/src/camera.h
index 5190954..44901aa 100644
--- a/src/camera.h
+++ b/src/camera.h
@@ -28,6 +28,10 @@
#ifndef __CAMERA_H__
#define __CAMERA_H__
+#include <string>
+using namespace std;
+#include "error.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -46,19 +50,34 @@
#include <qwidget.h>
+/**
+ * This class represents the symbolic representation of the camera and
+ * the network functionality.
+ */
class Camera {
public:
- Camera(const char *ip,
- const int port);
+ Camera();
~Camera();
+ void connect(const char *ip,
+ const int port);
+
void setCpr(char *newcpr);
+
+ // Camera actions
void start();
void stop();
void freeze();
void unfreeze();
void snapshot();
+ // Status methods
+ bool hasError();
+ string getErrorString();
+
private:
+ // Error object passed to all sub objects.
+ Error *errorstatus;
+
pthread_t playertid;
pthread_t decodetid;
pthread_t encodetid;
diff --git a/src/decoder.cc b/src/decoder.cc
index 3c5a4e8..eae0f76 100644
--- a/src/decoder.cc
+++ b/src/decoder.cc
@@ -24,7 +24,8 @@
#include "decoder.h"
-Decoder::Decoder(char *device,
+Decoder::Decoder(Error* err,
+ char *device,
int channel,
sem_t *gencode_sem,
sem_t *gplayer_sem,
@@ -33,6 +34,8 @@ Decoder::Decoder(char *device,
pthread_mutex_t *gmutex,
volatile int *grunning)
{
+ errobj = err;
+
encode_sem = gencode_sem;
player_sem = gplayer_sem;
encode_queue = gencode_queue;
@@ -48,7 +51,7 @@ Decoder::Decoder(char *device,
memset(&dvpars, 0, sizeof(dvpars));
if(!(iformat = av_find_input_format("dv1394"))) {
- fprintf(stderr, "Failed to get input format dv1394\n");
+ errobj->setError("Failed to get input format dv1394");
exit(1);
}
@@ -57,23 +60,23 @@ Decoder::Decoder(char *device,
dvpars.standard = "pal";
if(av_open_input_file(&ifc, "", iformat, 0, &dvpars) < 0) {
- fprintf(stderr, "Device is in use\n");
+ errobj->setError("Device is in use.");
fc = NULL; return;
}
if(av_find_stream_info(ifc) < 0) {
- fprintf (stderr, "Could not find enough parameters\n");
+ errobj->setError("Could not find enough parameters.");
fc = NULL; return;
}
dump_format(ifc, 1, "", 0);
if(!(dec_codec = avcodec_find_decoder(ifc->streams[0]->codec.codec_id))) {
- printf("Unsupported codec for input stream \n");
+ errobj->setError("Unsupported codec for input stream ");
fc = NULL; return;
}
if(avcodec_open(&ifc->streams[0]->codec, dec_codec) < 0) {
- printf("Error while opening codec for input stream\n");
+ errobj->setError("Error while opening codec for input stream");
fc = NULL; return;
}
@@ -89,7 +92,7 @@ Decoder::~Decoder()
void Decoder::decode()
{
if(fc == NULL) {
- printf("Decoder not initialized.\n");
+ errobj->setError("Decoder not initialized.");
return;
}
@@ -116,13 +119,13 @@ void Decoder::decode()
memcpy(dvf->frame, ptr, len);
- // fprintf(stderr, "DVBufferSize: [%d]bytes\n", len);
+ //printf("DVBufferSize: [%d]bytes\n", len);
ret = avcodec_decode_video(&fc->streams[0]->codec,
fff->frame, &got_picture, ptr, len);
if(ret < 0) {
- fprintf(stderr, "Error while decoding stream\n");
+ errobj->setError("Error while decoding stream");
exit(1);
}
diff --git a/src/decoder.h b/src/decoder.h
index ad323b1..846ac26 100644
--- a/src/decoder.h
+++ b/src/decoder.h
@@ -23,6 +23,8 @@
#ifndef __RTVIDEOREC_DECODER_H
#define __RTVIDEOREC_DECODER_H
+#include "error.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -38,8 +40,9 @@
#include <dvframe.h>
class Decoder : public Thread {
- public:
- Decoder(char *device,
+public:
+ Decoder(Error* err,
+ char *device,
int channel,
sem_t *gencode_sem,
sem_t *gplayer_sem,
@@ -59,6 +62,8 @@ class Decoder : public Thread {
volatile int *running;
private:
+ Error *errobj;
+
void decode();
};
diff --git a/src/encoder.cc b/src/encoder.cc
index 3da7443..ee60a8f 100644
--- a/src/encoder.cc
+++ b/src/encoder.cc
@@ -24,13 +24,16 @@
#include <config.h>
#include "encoder.h"
-Encoder::Encoder(const char *gip,
+Encoder::Encoder(Error* err,
+ const char *gip,
const int gport,
sem_t *gsem,
Queue<DVFrame> *gqueue,
pthread_mutex_t *gmutex,
volatile int *grunning)
{
+ errobj = err;
+
sprintf(ip, gip);
port = gport;
memset(cpr, 0, sizeof(cpr));
@@ -54,9 +57,9 @@ Encoder::Encoder(const char *gip,
shoot_value = 0;
freeze_request = 0;
freeze_value = 0;
-
}
+
Encoder::~Encoder()
{
if(n) delete n;
diff --git a/src/encoder.h b/src/encoder.h
index d517ff5..1b459b9 100644
--- a/src/encoder.h
+++ b/src/encoder.h
@@ -23,6 +23,8 @@
#ifndef __RTVIDEOREC_ENCODER_H
#define __RTVIDEOREC_ENCODER_H
+#include "error.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -36,13 +38,15 @@
#include "thread.h"
#include <dvframe.h>
-#define VIDEO_BUFFER_SIZE (1024*1024) /* FIXME: One size fits all... */
+// FIXME: One size fits all...
+#define VIDEO_BUFFER_SIZE (1024*1024)
class Encoder : public Thread {
- public:
- Encoder(const char *gip,
+public:
+ Encoder(Error* err,
+ const char *gip,
const int gport,
sem_t *gsem,
Queue<DVFrame> *gqueue,
@@ -66,7 +70,9 @@ class Encoder : public Thread {
pthread_mutex_t *mutex;
volatile int *running;
- private:
+private:
+ Error *errobj;
+
int port;
char ip[32];
char cpr[32];
diff --git a/src/error.cc b/src/error.cc
new file mode 100644
index 0000000..4056aa9
--- /dev/null
+++ b/src/error.cc
@@ -0,0 +1,73 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * error.cc
+ *
+ * Sat Mar 26 10:57:07 CET 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program 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.
+ *
+ * This program 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 Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include "error.h"
+
+Error::Error()
+{
+ // Initialize
+ removeError();
+}
+
+Error::~Error()
+{
+}
+
+bool Error::hasError()
+{
+ return error;
+}
+
+string Error::getErrorString()
+{
+ string le = lastError;
+ removeError();
+ return le;
+}
+
+void Error::setError(char* errstr)
+{
+ printf("New Error: [%s]\n", errstr);
+
+ error = true;
+ lastError.append(errstr);
+ lastError.append("\n");
+
+ printf("All Errors: [%s]\n", lastError.c_str());
+}
+
+void Error::setError(string &errstr)
+{
+ error = true;
+ lastError.append(errstr);
+ lastError.append("\n");
+}
+
+void Error::removeError()
+{
+ error = false;
+ lastError = string("");
+}
diff --git a/src/error.h b/src/error.h
new file mode 100644
index 0000000..09cfbb9
--- /dev/null
+++ b/src/error.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * error.h
+ *
+ * Sat Mar 26 10:57:07 CET 2005
+ * Copyright 2005 Bent Bisballe
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This program 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.
+ *
+ * This program 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 Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#ifndef __MIAV_ERROR_H__
+#define __MIAV_ERROR_H__
+
+#include <string>
+using namespace std;
+
+class Error {
+public:
+ Error();
+ ~Error();
+
+ // Status methods
+ bool hasError();
+ string getErrorString();
+
+ // Set methods
+ void setError(char* errstr);
+ void setError(string &errstr);
+ void removeError();
+
+private:
+ // Used to save the state of the network and camera connections.
+ bool error;
+ string lastError;
+};
+
+#endif/*__MIAV_ERROR_H__*/
diff --git a/src/mainwindow.cc b/src/mainwindow.cc
index b26d6ce..869d5c3 100644
--- a/src/mainwindow.cc
+++ b/src/mainwindow.cc
@@ -90,7 +90,13 @@ MainWindow::MainWindow( QWidget* parent, const char* name )
createGui();
show();
- camera = new Camera(cfg.readString("server_addr")->c_str(), cfg.readInt("server_port"));
+ camera = new Camera();
+ camera->connect(cfg.readString("server_addr")->c_str(),
+ cfg.readInt("server_port"));
+
+ if(camera->hasError()) {
+ MessageBox(this, "", camera->getErrorString().c_str(), TYPE_OK, ICON_ERROR).exec();
+ }
recording = false;
frozen = false;
@@ -242,8 +248,20 @@ void MainWindow::logo_clicked()
void MainWindow::cpr_clicked()
{
+ {
+ // TODO: Save CPR and name, from the labels.
+ }
+
+ // Create and call the CPRQueryDialog.
CPRQueryDialog dlg(lbl_cpr, lbl_name, this, "CPRQueryDialog");
- printf("Cpr Dialog returned: %d\n", dlg.exec());
+
+ if(dlg.exec() == 0) {
+ printf("Cancel!\n");
+ // TODO: Restore old CPR and name, in the labels.
+ } else {
+ printf("CPR changed\n");
+ // TODO: Change CPR camera.
+ }
}
void MainWindow::rec_clicked()
@@ -252,11 +270,11 @@ void MainWindow::rec_clicked()
if(recording) {
img_recedge->setBackgroundColor(red);
btn_rec->setPixmap(*pix_stop);
- camera->stop();
+ camera->start();
} else {
img_recedge->setBackgroundColor(QColor(160,160,160));
btn_rec->setPixmap(*pix_record);
- camera->start();
+ camera->stop();
}
}
diff --git a/src/player.cc b/src/player.cc
index a860afa..9a697f9 100644
--- a/src/player.cc
+++ b/src/player.cc
@@ -25,11 +25,15 @@
#include "player.h"
-Player::Player(volatile int *grunning,
+Player::Player(Error *err,
+ volatile int *grunning,
sem_t *gsem,
Queue<FFFrame> *gqueue,
pthread_mutex_t *gmutex)
{
+ char errbuf[256];
+ errobj = err;
+
running = grunning;
sem = gsem;
queue = gqueue;
@@ -38,17 +42,19 @@ Player::Player(volatile int *grunning,
sem_init(&play_sem, 0, 1);
if(SDL_Init(SDL_INIT_VIDEO) < 0) {
- fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
- exit(1);
+ sprintf(errbuf, "Unable to init SDL: %s\n", SDL_GetError());
+ errobj->setError(errbuf);
+ return;
}
screen = SDL_SetVideoMode(DISPLAYWIDTH,
DISPLAYHEIGHT,
16,
SDL_HWSURFACE|SDL_ANYFORMAT|SDL_HWACCEL);
if(!screen) {
- fprintf(stderr, "Unable to set %dx%d video: %s\n",
+ sprintf(errbuf, "Unable to set %dx%d video: %s\n",
DISPLAYWIDTH, DISPLAYHEIGHT, SDL_GetError());
- exit(1);
+ errobj->setError(errbuf);
+ return;
}
overlay = SDL_CreateYUVOverlay(DISPLAYWIDTH, DISPLAYHEIGHT, SDL_IYUV_OVERLAY, screen);
diff --git a/src/player.h b/src/player.h
index e33c4e7..3e7efb6 100644
--- a/src/player.h
+++ b/src/player.h
@@ -26,6 +26,8 @@
#ifndef __RTVIDEOREC_PLAYER_H
#define __RTVIDEOREC_PLAYER_H
+#include "error.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
@@ -46,8 +48,9 @@
#define DISPLAYHEIGHT 576
class Player : public Thread {
- public:
- Player(volatile int *grunning,
+public:
+ Player(Error* err,
+ volatile int *grunning,
sem_t *gsem,
Queue<FFFrame> *gqueue,
pthread_mutex_t *gmutex);
@@ -58,7 +61,9 @@ class Player : public Thread {
void run();
- private:
+private:
+ Error *errobj;
+
void player();
volatile int *running;
diff --git a/tools/MIaVAdd b/tools/MIaVAdd
index 8a5ca1a..8a62377 100755
--- a/tools/MIaVAdd
+++ b/tools/MIaVAdd
@@ -26,6 +26,7 @@ function allfile() {
echo " * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." >> $1;
echo " */" >> $1;
echo "" >> $1;
+ echo "#include <config.h>" >> $1;
}
function ccfile() {