diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/Makefile.am | 2 | ||||
-rw-r--r-- | client/control.cc | 112 | ||||
-rw-r--r-- | client/control.h | 67 | ||||
-rw-r--r-- | client/decoder.cc | 15 | ||||
-rw-r--r-- | client/mainwindow.cc | 14 | ||||
-rw-r--r-- | client/mainwindow.h | 2 | ||||
-rw-r--r-- | client/player.cc | 32 | ||||
-rw-r--r-- | client/player.h | 4 | ||||
-rw-r--r-- | client/videowidget.cc | 50 | ||||
-rw-r--r-- | client/videowidget.h | 9 |
10 files changed, 231 insertions, 76 deletions
diff --git a/client/Makefile.am b/client/Makefile.am index 0767a22..73019c4 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -9,6 +9,7 @@ bin_PROGRAMS = miav_client miav_client_SOURCES = $(shell ../tools/MocList cc ) \ miav_client.cc \ aboutwindow.cc \ + control.cc \ cprlisten.cc \ cprquerydialog.cc \ decoder.cc \ @@ -29,6 +30,7 @@ miav_client_SOURCES = $(shell ../tools/MocList cc ) \ EXTRA_DIST = \ aboutwindow.h \ config.h \ + control.h \ cprlisten.h \ cprquerydialog.h \ decoder.h \ diff --git a/client/control.cc b/client/control.cc new file mode 100644 index 0000000..143e11c --- /dev/null +++ b/client/control.cc @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * control.cc + * + * Wed Apr 12 11:54:19 CEST 2006 + * Copyright 2006 Bent Bisballe Nyeng + * 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. + */ +#include "control.h" + +Control::Control() +{ + // Initialize control state + frozen = false; + recording = false; + cpr = ""; +} + +Control::~Control() +{ +} + +void Control::setCpr(QString cpr) +{ + mutex.lock(); + Control::cpr = cpr; + mutex.unlock(); +} + +void Control::getCpr(QString *cpr) +{ + mutex.lock(); + *cpr = Control::cpr; + mutex.unlock(); +} + +void Control::freeze() +{ + mutex.lock(); + frozen = true; + mutex.unlock(); +} + +void Control::unfreeze() +{ + mutex.lock(); + frozen = false; + mutex.unlock(); +} + +void Control::shoot() +{ + mutex.lock(); + frozen = false; + mutex.unlock(); +} + +void Control::record() +{ + mutex.lock(); + recording = true; + mutex.unlock(); +} + +void Control::stop() +{ + mutex.lock(); + recording = false; + mutex.unlock(); +} + +bool Control::isFrozen() +{ + bool isfrozen; + mutex.lock(); + isfrozen = frozen; + mutex.unlock(); + return isfrozen; +} + +bool Control::isRecording() +{ + bool isrecording; + mutex.lock(); + isrecording = recording; + mutex.unlock(); + return isrecording; +} + + +// Global control object +Control MIaV::control; + + diff --git a/client/control.h b/client/control.h new file mode 100644 index 0000000..5f28f0a --- /dev/null +++ b/client/control.h @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * control.h + * + * Wed Apr 12 11:54:19 CEST 2006 + * Copyright 2006 Bent Bisballe Nyeng + * 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. + */ +#ifndef __MIAV_CONTROL_H__ +#define __MIAV_CONTROL_H__ + +#include <QMutex> +#include <QString> +#include <QImage> + +/** + * Class for the global control object. + */ +class Control { +public: + Control(); + ~Control(); + + void setCpr(QString cpr); + void getCpr(QString *cpr); + + void freeze(); + void unfreeze(); + void shoot(); + + void record(); + void stop(); + + bool isFrozen(); + bool isRecording(); + +private: + bool frozen; + bool recording; + + QMutex mutex; + QString cpr; +}; + +namespace MIaV { + extern Control control; +}; + +#endif/*__MIAV_CONTROL_H__*/ diff --git a/client/decoder.cc b/client/decoder.cc index 5c2cce5..ea67d68 100644 --- a/client/decoder.cc +++ b/client/decoder.cc @@ -40,6 +40,8 @@ #include <QEvent> #include <QApplication> +#include "control.h" + Decoder::Decoder(): semaphore(1) { frame = NULL; @@ -63,10 +65,15 @@ void Decoder::run() while(running) { char *tmp = (char*)reader.readFrame(); - mutex.lock(); - if(frame) free(frame); - frame = tmp; - mutex.unlock(); + + if(MIaV::control.isFrozen() == false) { + mutex.lock(); + if(frame) free(frame); + frame = tmp; + mutex.unlock(); + } else { + free(tmp); + } } semaphore.release(); // Unlock the shutdown process } diff --git a/client/mainwindow.cc b/client/mainwindow.cc index c3d29ba..239e10f 100644 --- a/client/mainwindow.cc +++ b/client/mainwindow.cc @@ -37,6 +37,8 @@ #include <QX11Info> #include <QMoveEvent> +#include "control.h" + QPushButton *MainWindow::createButton(char* icon) { QPixmap pixmap(icon); @@ -158,20 +160,20 @@ void MainWindow::record_clicked() void MainWindow::snapshot_clicked() { + MIaV::control.shoot(); history->addHistoryItem(new HistoryWidget(new QPixmap(PIXMAP_LOGO_SMALL))); } void MainWindow::freeze_clicked() { + if(MIaV::control.isFrozen()) { + MIaV::control.unfreeze(); + } else { + MIaV::control.freeze(); + } } void MainWindow::mute_clicked() { } -// A hack to ensure we draw the video in the right place -void MainWindow::moveEvent(QMoveEvent *event) -{ - QMoveEvent evt(video->pos(),video->pos()); - video->moveEvent(&evt); -} diff --git a/client/mainwindow.h b/client/mainwindow.h index 4698a2c..e3a4411 100644 --- a/client/mainwindow.h +++ b/client/mainwindow.h @@ -61,8 +61,6 @@ public: QWidget *getVideoWidget() { return video; } - void moveEvent(QMoveEvent *event); - public slots: void cpr_clicked(); void clear_clicked(); diff --git a/client/player.cc b/client/player.cc index a8f6152..5ee0ccd 100644 --- a/client/player.cc +++ b/client/player.cc @@ -54,13 +54,35 @@ void Player::show_frame() fprintf(stderr, "Frame!%d\n", num++); frame = decoder->getFrame(); - if(!frame) return; - - dvdecoder.decode(frame); - free(frame); + if(frame) { + dvdecoder.decode(frame); + free(frame); + } render.width = widget->width(); render.height = widget->height(); render.display(WIDTH, HEIGHT); - } + +//Hmm ... is this how it should work? +void Player::getScreenShot(QImage *image) +{ + double R, G, B; + double Y, U, V; + + char *yuv = render.getDisplayData(); + + for(int x = 0; x < WIDTH; x++) { + for(int y = 0; y < HEIGHT; y++) { + Y = yuv[(x + y * WIDTH)]; + U = yuv[(x + y * WIDTH)]; + V = yuv[(x + y * WIDTH)]; + + R = Y + 1.4075 * (V - 128); + G = Y - (0.3455 * (U - 128)) - (0.7169 * (V - 128)); + B = Y + 1.7790 * (U - 128); + // QRgb qRgb((unsigned int)R,(unsigned int)G,(unsigned int)B); + image->setPixel(x, y, qRgb((unsigned int)R,(unsigned int)G,(unsigned int)B)); + } + } + } diff --git a/client/player.h b/client/player.h index 723fc33..84c2674 100644 --- a/client/player.h +++ b/client/player.h @@ -37,6 +37,8 @@ #include <X11/Xlib.h> #include <X11/extensions/Xvlib.h> +#include <QImage> + #include "libdv_wrapper.h" #include "xvaccelrenderer.h" @@ -48,6 +50,8 @@ public: Player(QWidget *widget, Decoder *decoder); ~Player(); + void getScreenShot(QImage *image); + public slots: void show_frame(); diff --git a/client/videowidget.cc b/client/videowidget.cc index f6fc430..f679a3a 100644 --- a/client/videowidget.cc +++ b/client/videowidget.cc @@ -85,53 +85,3 @@ void VideoWidget::mouseReleaseEvent(QMouseEvent *event) } */ } - -void VideoWidget::moveEvent(QMoveEvent *event) -{ - mutex.lock(); - myposition = mapToGlobal(event->pos()); - mutex.unlock(); -} - -void VideoWidget::resizeEvent(QResizeEvent *event) -{ - mutex.lock(); - mysize = event->size(); - mutex.unlock(); -} - -int VideoWidget::getX() -{ - int val; - mutex.lock(); - val = myposition.x(); - mutex.unlock(); - return val; -} - -int VideoWidget::getY() -{ - int val; - mutex.lock(); - val = myposition.y(); - mutex.unlock(); - return val; -} - -int VideoWidget::getWidth() -{ - int val; - mutex.lock(); - val = mysize.width();//>720?720:mysize.width(); - mutex.unlock(); - return val; -} - -int VideoWidget::getHeight() -{ - int val; - mutex.lock(); - val = mysize.height();//>576?576:mysize.height(); - mutex.unlock(); - return val; -} diff --git a/client/videowidget.h b/client/videowidget.h index d5e77bc..5590d9b 100644 --- a/client/videowidget.h +++ b/client/videowidget.h @@ -39,18 +39,9 @@ public: VideoWidget(); ~VideoWidget(); - int getX(); - int getY(); - int getWidth(); - int getHeight(); - void mouseReleaseEvent(QMouseEvent *event); - void moveEvent(QMoveEvent *event); - void resizeEvent(QResizeEvent *event); private: - QSize mysize; - QPoint myposition; QMutex mutex; }; |