diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/control.cc | 8 | ||||
-rw-r--r-- | client/control.h | 6 | ||||
-rw-r--r-- | client/decoder.cc | 70 | ||||
-rw-r--r-- | client/decoder.h | 11 | ||||
-rw-r--r-- | client/player.cc | 14 | ||||
-rw-r--r-- | client/xvaccelrenderer.cc | 9 |
6 files changed, 53 insertions, 65 deletions
diff --git a/client/control.cc b/client/control.cc index 92bd74c..6dd4b4b 100644 --- a/client/control.cc +++ b/client/control.cc @@ -86,14 +86,14 @@ void Control::stop() recording = false; mutex.unlock(); } - +/* void Control::takeScreenshot() { mutex.lock(); screenshot = true; mutex.unlock(); } - +*/ bool Control::isFrozen() { bool isfrozen; @@ -111,7 +111,7 @@ bool Control::isRecording() mutex.unlock(); return isrecording; } - +/* bool Control::isScreenshot() { bool isscreenshot; @@ -121,7 +121,7 @@ bool Control::isScreenshot() mutex.unlock(); return isscreenshot; } - +*/ // Global control object Control MIaV::control; diff --git a/client/control.h b/client/control.h index a72ed82..1563f3d 100644 --- a/client/control.h +++ b/client/control.h @@ -51,13 +51,13 @@ public: bool isFrozen(); bool isRecording(); - bool isScreenshot(); - void takeScreenshot(); + // bool isScreenshot(); + // void takeScreenshot(); private: bool frozen; bool recording; - bool screenshot; + // bool screenshot; QMutex mutex; QString cpr; diff --git a/client/decoder.cc b/client/decoder.cc index 1193710..48dc67d 100644 --- a/client/decoder.cc +++ b/client/decoder.cc @@ -28,7 +28,7 @@ #include "info.h" -#define READ_DV_FROM_FILE +//#define READ_DV_FROM_FILE #include "dv.h" #ifdef READ_DV_FROM_FILE @@ -44,12 +44,11 @@ #include "libdv_wrapper.h" -Decoder::Decoder(): semaphore(1), screenshotsemaphore(1) +Decoder::Decoder(): closesem(1) { - frame = NULL; running = true; + memset(pframe, 0, sizeof(pframe)); // Init an empty frame qApp->installEventFilter(this); - screenshotsemaphore.acquire(); // Lock the screenshot method } Decoder::~Decoder() @@ -58,7 +57,7 @@ Decoder::~Decoder() void Decoder::run() { - semaphore.acquire(); // Lock the shutdown process + closesem.acquire(); // Lock the shutdown process #ifdef READ_DV_FROM_FILE dvfile reader; @@ -67,38 +66,40 @@ void Decoder::run() reader.connect(); #endif/* READ_DV_FROM_FILE*/ - fprintf(stderr, "init done\n"); - while(running) { - char *tmp = (char*)reader.readFrame(); - - if(MIaV::control.isScreenshot()) { - memcpy(screenshotframe, tmp, DVPACKAGE_SIZE); - screenshotsemaphore.release(); - } + char *frame = (char*)reader.readFrame(); + if(!frame) continue; // An empty frame if(MIaV::control.isFrozen() == false) { - mutex.lock(); - if(frame) free(frame); - frame = tmp; - mutex.unlock(); - } else { - free(tmp); + pmutex.lock(); + memcpy(pframe, frame, DVPACKAGE_SIZE); + pmutex.unlock(); } + + free(frame); } - semaphore.release(); // Unlock the shutdown process + closesem.release(); // Unlock the shutdown process } -char *Decoder::getFrame() +char *Decoder::pframeAcquire() { - char *tmp; + pmutex.lock(); + return pframe; +} - mutex.lock(); - tmp = frame; - frame = NULL; - mutex.unlock(); +void Decoder::pframeRelease() +{ + pmutex.unlock(); +} - return tmp; +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) @@ -107,21 +108,10 @@ bool Decoder::eventFilter(QObject *o, QEvent *e) // printf("QUIT from: %p, this: %p, testing: %p\n", o, this, qApp->activeWindow()); if(qApp->activeWindow() == (QWidget*)o) { // Ignore close events from non top level widgets running = false; // Tell the thread to stop. - semaphore.acquire(); // Wait for the thread to stop. + closesem.acquire(); // Wait for the thread to stop. } } - + // standard event processing return false; } - - -void Decoder::snapshot(char *rgb) -{ - LibDVWrapper dv; - dv.setOutputBuffer(rgb, DV::BGR0); - - MIaV::control.takeScreenshot(); - screenshotsemaphore.acquire(); // Wait for screenshot - dv.decode(screenshotframe); -} diff --git a/client/decoder.h b/client/decoder.h index 0913858..6cb6a22 100644 --- a/client/decoder.h +++ b/client/decoder.h @@ -46,16 +46,19 @@ public: void snapshot(char *rgb); + char *pframeAcquire(); + void pframeRelease(); + protected: bool eventFilter(QObject *o, QEvent *e); private: volatile bool running; - char *frame; - QSemaphore semaphore; + QSemaphore closesem; + + QMutex pmutex; + char pframe[DVPACKAGE_SIZE]; // Player frame - char screenshotframe[DVPACKAGE_SIZE]; - QSemaphore screenshotsemaphore; QMutex mutex; }; diff --git a/client/player.cc b/client/player.cc index ba2250f..608d53d 100644 --- a/client/player.cc +++ b/client/player.cc @@ -29,9 +29,8 @@ #define WIDTH 720 #define HEIGHT 576 -static int num = 0; - -Player::Player(QWidget *w, Decoder *d) +Player::Player(QWidget *w, Decoder *d) : + dvdecoder(DV::ColorBest) { widget = w; decoder = d; @@ -51,13 +50,10 @@ Player::~Player() void Player::show_frame() { char *frame; - fprintf(stderr, "Frame!%d\n", num++); - frame = decoder->getFrame(); - if(frame) { - dvdecoder.decode(frame); - // free(frame); - } + frame = decoder->pframeAcquire(); // Acquire frame data + dvdecoder.decode(frame); + decoder->pframeRelease(); // Release frame data render.width = widget->width(); render.height = widget->height(); diff --git a/client/xvaccelrenderer.cc b/client/xvaccelrenderer.cc index 7de4510..4ba8a9f 100644 --- a/client/xvaccelrenderer.cc +++ b/client/xvaccelrenderer.cc @@ -191,8 +191,8 @@ uint8_t XvAccelRender::GUI_XvInit(QWidget * window, uint32_t w, uint32_t h) printf("\n Adaptator : %d", i); printf("\n Base ID : %ld", curai->base_id); printf("\n Nb Port : %lu", curai->num_ports); - printf("\n Type : %d,", - curai->type); + printf("\n Type : %d,", curai->type); + #define CHECK(x) if(curai->type & x) printf("|"#x); CHECK(XvInputMask); CHECK(XvOutputMask); @@ -200,8 +200,7 @@ uint8_t XvAccelRender::GUI_XvInit(QWidget * window, uint32_t w, uint32_t h) CHECK(XvStillMask); CHECK(XvImageMask); - printf("\n Name : %s", - curai->name); + printf("\n Name : %s", curai->name); printf("\n Num Adap : %lu", curai->num_adaptors); printf("\n Num fmt : %lu", curai->num_formats); #endif @@ -213,7 +212,7 @@ uint8_t XvAccelRender::GUI_XvInit(QWidget * window, uint32_t w, uint32_t h) for (k = 0; (k < curai->num_ports) && !port; k++) { if (GUI_XvList(WDN, k + curai->base_id, &xv_format)) - port = k + curai->base_id; + port = k + curai->base_id + 1; // FIXME: TODO: HACK: It works when +1 is applied! But why!? } |