diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/decoder.cc | 44 | ||||
-rw-r--r-- | client/decoder.h | 5 | ||||
-rw-r--r-- | client/dv1394.cc | 7 | ||||
-rw-r--r-- | client/dv1394.h | 2 | ||||
-rw-r--r-- | client/dvfile.cc | 10 | ||||
-rw-r--r-- | client/dvfile.h | 2 | ||||
-rw-r--r-- | client/networksender.cc | 8 | ||||
-rw-r--r-- | client/networksender.h | 2 | ||||
-rw-r--r-- | client/player.cc | 14 | ||||
-rw-r--r-- | client/player.h | 5 |
10 files changed, 61 insertions, 38 deletions
diff --git a/client/decoder.cc b/client/decoder.cc index 11cee08..c7a5097 100644 --- a/client/decoder.cc +++ b/client/decoder.cc @@ -47,7 +47,7 @@ Decoder::Decoder() { running = true; - memset(pframe, 0, sizeof(pframe)); // Init an empty frame + pframe = NULL; qApp->installEventFilter(this); } @@ -68,16 +68,29 @@ void Decoder::run() reader.connect(); #endif/* READ_DV_FROM_FILE*/ + LibDVWrapper dvdecoder(DV::ColorBest, DV::PAL, DV::YUV_422); + while(running) { - char *frame = (char*)reader.readFrame(); - if(!frame) continue; // An empty frame + Frame *dvframe = reader.readFrame(); + if(!dvframe) continue; // An empty frame + + Frame *yuvframe = dvdecoder.decode(dvframe); // Decode the DV frame to YUV422 and PCM audio + if(!yuvframe) continue; // An error ocurred if(MIaV::control.isFrozen() == false) { - pmutex.lock(); - memcpy(pframe, frame, DVPACKAGE_SIZE); - pmutex.unlock(); + if(yuvframe->vformat != VF_YUV422) { + fprintf(stderr, "Wrong videoformat in Decoder, expected VF_YUV422, got %i\n", yuvframe->vformat); + } else { + if(!pframe) { + fprintf(stderr, "PFrame data not set!\n"); + } else { + pmutex.lock(); + memcpy(pframe, yuvframe->vframe, yuvframe->vframesize); + pmutex.unlock(); + } + } } - + if(MIaV::control.isRecording()) { if(newconnection) { NetworkSender *sender = new NetworkSender(MIaV::control.getCpr()); @@ -92,7 +105,7 @@ void Decoder::run() sendersmutex.lock(); if(senders.isEmpty() == false) - senders.back()->pushFrame(frame, + senders.back()->pushFrame(yuvframe, MIaV::control.getShot(), MIaV::control.getFreeze()); sendersmutex.unlock(); @@ -113,17 +126,24 @@ void Decoder::run() sendersmutex.unlock(); - free(frame); + // free(frame); newconnection = true; + } } // closesem.release(); // Unlock the shutdown process } -char *Decoder::pframeAcquire() +void Decoder::setPFrameData(char *pframe) +{ + pmutex.lock(); + this->pframe = pframe; + pmutex.unlock(); +} + +void Decoder::pframeAcquire() { pmutex.lock();; - return pframe; } void Decoder::pframeRelease() @@ -133,12 +153,14 @@ void Decoder::pframeRelease() void Decoder::snapshot(char *rgb) { + /* LibDVWrapper dv; dv.setOutputBuffer(rgb, DV::BGR0); pmutex.lock(); dv.decode(pframe); pmutex.unlock(); + */ } bool Decoder::eventFilter(QObject *o, QEvent *e) diff --git a/client/decoder.h b/client/decoder.h index 2f8d575..f156884 100644 --- a/client/decoder.h +++ b/client/decoder.h @@ -51,7 +51,8 @@ public: void snapshot(char *rgb); - char *pframeAcquire(); + void setPFrameData(char *pframe); + void pframeAcquire(); void pframeRelease(); Status status(); @@ -64,7 +65,7 @@ private: QSemaphore closesem; QMutex pmutex; - char pframe[DVPACKAGE_SIZE]; // Player frame + char *pframe; // Player frame QMutex mutex; diff --git a/client/dv1394.cc b/client/dv1394.cc index e463c54..7dac7b3 100644 --- a/client/dv1394.cc +++ b/client/dv1394.cc @@ -150,7 +150,7 @@ bool dv1394::connect() return true; } -unsigned char *dv1394::readFrame() +Frame *dv1394::readFrame() { // Firewire port not correctly opened. if(!handle) return NULL; @@ -164,6 +164,9 @@ unsigned char *dv1394::readFrame() break; } } - return ptr; + + Frame *frame = new Frame((char*)ptr, DVPACKAGE_SIZE, VF_DV, NULL, 0, AF_DV); + + return frame; } diff --git a/client/dv1394.h b/client/dv1394.h index 8485638..5f99199 100644 --- a/client/dv1394.h +++ b/client/dv1394.h @@ -39,7 +39,7 @@ public: bool connect(); - unsigned char *readFrame(); + Frame *readFrame(); private: raw1394handle_t handle; diff --git a/client/dvfile.cc b/client/dvfile.cc index 676d6b1..601c21d 100644 --- a/client/dvfile.cc +++ b/client/dvfile.cc @@ -42,19 +42,21 @@ dvfile::~dvfile() fclose(fp); } -unsigned char *dvfile::readFrame() +Frame *dvfile::readFrame() { - unsigned char *frame = new unsigned char[DVPACKAGE_SIZE]; + unsigned char *ptr = new unsigned char[DVPACKAGE_SIZE]; sleep_1_frame(); if(fp) { - while(fread(frame, DVPACKAGE_SIZE, 1, fp) == 0) { + while(fread(ptr, DVPACKAGE_SIZE, 1, fp) == 0) { fseek(fp, 0L, SEEK_SET); } } else { - memset(frame, 0, sizeof(frame)); + memset(ptr, 0, sizeof(ptr)); } + Frame *frame = new Frame((char*)ptr, DVPACKAGE_SIZE, VF_DV, NULL, 0, AF_DV); + return frame; } diff --git a/client/dvfile.h b/client/dvfile.h index 9eedd00..b65dc36 100644 --- a/client/dvfile.h +++ b/client/dvfile.h @@ -40,7 +40,7 @@ public: dvfile(); ~dvfile(); - unsigned char *readFrame(); + Frame *readFrame(); private: FILE* fp; diff --git a/client/networksender.cc b/client/networksender.cc index 11eb259..f8912f1 100644 --- a/client/networksender.cc +++ b/client/networksender.cc @@ -32,7 +32,7 @@ NetworkSender::NetworkSender(QString cpr) { - ip = "192.168.0.10"; + ip = "127.0.0.1"; port = 6666; // Connect @@ -60,11 +60,11 @@ NetworkSender::~NetworkSender() fprintf(stderr, "Disconnect [%p]\n", this); } -void NetworkSender::pushFrame(char* framedata, bool freeze, bool snapshot) +void NetworkSender::pushFrame(Frame* frame, bool freeze, bool snapshot) { printf("F: %d S %d\n", freeze, snapshot); - Frame *frame = new Frame((unsigned char*)framedata); + // Frame *frame = new Frame((unsigned char*)framedata); frame->freeze = freeze; frame->shoot = snapshot; @@ -104,6 +104,8 @@ void NetworkSender::run() sleep_1_frame(); sleep_1_frame(); sleep_1_frame(); + if(frame->vframe) delete frame->vframe; + if(frame->aframe) delete frame->aframe; delete frame; // TODO: Read status from network diff --git a/client/networksender.h b/client/networksender.h index e3beb5a..71ce7e7 100644 --- a/client/networksender.h +++ b/client/networksender.h @@ -43,7 +43,7 @@ public: NetworkSender(QString cpr); ~NetworkSender(); - void pushFrame(char* frame, bool freeze, bool snapshot); + void pushFrame(Frame* frame, bool freeze, bool snapshot); unsigned int queueSize(); void run(); diff --git a/client/player.cc b/client/player.cc index 44e9cc9..dc3002d 100644 --- a/client/player.cc +++ b/client/player.cc @@ -34,25 +34,21 @@ Player::Player(QWidget *w, Decoder *d) : { widget = w; decoder = d; - dvdecoder = new LibDVWrapper(DV::ColorBest, DV::PAL, DV::YUV_422); connect(this, SIGNAL(timeout()), this, SLOT(show_frame())); - - dvdecoder->setOutputBuffer(render.getDisplayData()); + decoder->setPFrameData(render.getDisplayData()); } Player::~Player() { - delete dvdecoder; + // delete dvdecoder; } void Player::show_frame() { - char *frame; + // char *frame; - frame = decoder->pframeAcquire(); // Acquire frame data - dvdecoder->decode(frame); // Decode the DV frame to YUV - decoder->pframeRelease(); // Release frame data + decoder->pframeAcquire(); // Acquire frame data // Scale the video in aspect: if((double)widget->width() / WIDTH < (double)widget->height() / HEIGHT) { @@ -65,4 +61,6 @@ void Player::show_frame() // Display the YUV frame render.display(WIDTH, HEIGHT); + + decoder->pframeRelease(); // Release frame data } diff --git a/client/player.h b/client/player.h index d56ae4b..edd7bcf 100644 --- a/client/player.h +++ b/client/player.h @@ -38,9 +38,6 @@ #include <X11/extensions/Xvlib.h> #include <QImage> - -#include "libdv_wrapper.h" - #include "xvaccelrenderer.h" class Player : public QTimer @@ -54,8 +51,6 @@ public slots: void show_frame(); private: - LibDVWrapper *dvdecoder; - Decoder *decoder; QWidget *widget; XvAccelRender render; |