diff options
author | deva <deva> | 2006-03-06 19:14:16 +0000 |
---|---|---|
committer | deva <deva> | 2006-03-06 19:14:16 +0000 |
commit | 8daee5ab8d878fb1819ba6b615e6ee96a4a11742 (patch) | |
tree | 9ba9d5bbb1ffec8e4689f2dcf14092692a5b33d3 | |
parent | bbc621fdb9ad7cebba643145e7d923a0998bf59f (diff) |
*** empty log message ***
-rw-r--r-- | client/Makefile.am | 6 | ||||
-rw-r--r-- | client/aboutwindow.cc | 4 | ||||
-rw-r--r-- | client/camera.cc | 182 | ||||
-rw-r--r-- | client/camera.h | 109 | ||||
-rw-r--r-- | client/decoder.cc | 286 | ||||
-rw-r--r-- | client/decoder.h | 99 | ||||
-rw-r--r-- | client/encoder.cc | 273 | ||||
-rw-r--r-- | client/encoder.h | 118 | ||||
-rw-r--r-- | client/mainwindow.cc | 14 | ||||
-rw-r--r-- | client/player.cc | 322 | ||||
-rw-r--r-- | client/player.h | 142 |
11 files changed, 12 insertions, 1543 deletions
diff --git a/client/Makefile.am b/client/Makefile.am index 4a86c37..001916c 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -9,13 +9,12 @@ bin_PROGRAMS = miav_client miav_client_SOURCES = $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList cc; fi ) \ miav_client.cc \ aboutwindow.cc \ - camera.cc \ cprlisten.cc \ cprquerydialog.cc \ decoder.cc \ dv1394.cc \ dvfile.cc \ - encoder.cc \ + networksender.cc \ historywidget.cc \ info_gui.cc \ mainwindow.cc \ @@ -26,7 +25,6 @@ miav_client_SOURCES = $(shell if [ $QT_CXXFLAGS ] ; then ../tools/MocList cc; f EXTRA_DIST = \ aboutwindow.h \ - camera.h \ config.h \ cprlisten.h \ cprquerydialog.h \ @@ -34,7 +32,7 @@ EXTRA_DIST = \ decoder.h \ dv1394.h \ dvfile.h \ - encoder.h \ + networksender.h \ historywidget.h \ info_gui.h \ mainwindow.h \ diff --git a/client/aboutwindow.cc b/client/aboutwindow.cc index 849608d..9be7c32 100644 --- a/client/aboutwindow.cc +++ b/client/aboutwindow.cc @@ -44,7 +44,9 @@ AboutWindow::AboutWindow( QWidget* parent) resize(pix_about->width(), pix_about->height()); - // setBackgroundColor(QColor(200,200,200)); + QPalette palette; + palette.setColor(backgroundRole(), QColor(200,200,200)); + setPalette(palette); btn_ok = new QPushButton(this); btn_ok->setText("OK"); diff --git a/client/camera.cc b/client/camera.cc deleted file mode 100644 index 5dbec13..0000000 --- a/client/camera.cc +++ /dev/null @@ -1,182 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * camera.cc - * - * Fri Oct 29 12:46:38 CEST 2004 - * Copyright 2004 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. - */ -#include <config.h> -#ifdef USE_GUI - -#include "camera.h" - -Camera::Camera(Info *ginfo) -{ - info = ginfo; -} - -void Camera::connect(const char *ip, const int port, int width, int height) -{ - initialized = false; - - pthread_mutex_init (&mutex, NULL); - //mutex = PTHREAD_MUTEX_INITIALIZER; - - running = 1; - - encode_queue = new Queue<Frame>(); // infinite size - player_queue = new Queue<Frame>(1); // fixed size of 1 - - sem_init(&encode_sem, 0, 0); - sem_init(&player_sem, 0, 0); - - decoder = new Decoder(info, - &encode_sem, - &player_sem, - encode_queue, - player_queue, - &mutex, - &running); - - encoder = new Encoder(info, - ip, port, - &encode_sem, - encode_queue, - &mutex, - &running); - - player = new Player(info, - width, height, - &running, - &player_sem, - player_queue, - &mutex); - - decoder->run(); - encoder->run(); - player->run(); - - initialized = true; -} - -Camera::~Camera() -{ - // Signal to the threads to stop - running = 0; - - // Wait for the threads to stop - decoder->wait_stop(); - encoder->wait_stop(); - player->wait_stop(); - - delete decoder; - delete encoder; - delete player; - - sem_destroy(&encode_sem); - sem_destroy(&player_sem); - - delete player_queue; - delete encode_queue; -} - -void Camera::setCpr(char *newcpr, char* name) -{ - - if(initialized) { - encoder->setCpr(newcpr); - player->setCpr(newcpr, name); // For the text overlay - } else { - info->error("Camera not initialized."); - } -} - - -void Camera::start() -{ - if(initialized) { - player->startrecord(); // For the text overlay - encoder->start(); - decoder->start(); - } else { - info->error("Camera not initialized."); - } -} - -void Camera::stop(n_savestate save) -{ - if(initialized) { - player->stoprecord(); // For the textoverlay - encoder->stop(save); - decoder->stop(save); - } else { - info->error("Camera not initialized."); - } -} - -void Camera::freeze() -{ - if(initialized) { - player->stop(); - decoder->freeze(); - } else { - info->error("Camera not initialized."); - } -} - -void Camera::unfreeze() -{ - if(initialized) { - player->start(); - decoder->unfreeze(); - } else { - info->error("Camera not initialized."); - } -} - -void Camera::snapshot(unsigned char *rgb) -{ - if(initialized) { - decoder->shoot(rgb); - encoder->shoot(); - } else { - info->error("Camera not initialized."); - } -} - -int Camera::getQueueLength() -{ - return encode_queue->length(); -} - -void Camera::resize(int w, int h, bool s) -{ - player->resize(w,h,s); -} - -void Camera::setMute(bool mute) -{ - decoder->setMute(mute); - player->setMute(mute); -} - -#endif/* USE_GUI */ diff --git a/client/camera.h b/client/camera.h deleted file mode 100644 index 410b9f5..0000000 --- a/client/camera.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * camera.h - * - * Fri Oct 29 12:46:38 CEST 2004 - * Copyright 2004 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. - */ -#include "config.h" -#ifdef USE_GUI - -#ifndef __CAMERA_H__ -#define __CAMERA_H__ - -#include <string> -using namespace std; -#include "info.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <getopt.h> -//#include <avformat.h> - -#include "util.h" -#include "queue.h" -#include "decoder.h" -#include "encoder.h" -#include "player.h" -#include "package.h" - -#include "thread.h" -#include "frame.h" - -#include <QWidget> - -/** - * This class represents the symbolic representation of the camera and - * the network functionality. - */ -class Camera { -public: - Camera(Info *ginfo); - ~Camera(); - void connect(const char *ip, - const int port, - int width, int height); - - void setCpr(char *newcpr, char* name); - - // Camera actions - void start(); - void stop(n_savestate save); - void freeze(); - void unfreeze(); - void snapshot(unsigned char *rgb); - - int getQueueLength(); - - // Indirect call to player->resize - void resize(int width, int height, bool showtext); - - void setMute(bool mute); - -private: - // Info object passed to all sub objects. - Info *info; - bool initialized; - - /* // No need for these anymore - pthread_t playertid; - pthread_t decodetid; - pthread_t encodetid; - */ - volatile int running; - - Encoder *encoder; - Decoder *decoder; - Player *player; - - Queue<Frame> *encode_queue; - Queue<Frame> *player_queue; - sem_t encode_sem; - sem_t player_sem; - pthread_mutex_t mutex;// = PTHREAD_MUTEX_INITIALIZER; -}; - - -#endif/*__CAMERA_H__*/ - -#endif/* USE_GUI */ diff --git a/client/decoder.cc b/client/decoder.cc deleted file mode 100644 index 0d56aca..0000000 --- a/client/decoder.cc +++ /dev/null @@ -1,286 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * decoder.cc - * - * Sat Feb 19 17:05:43 CET 2005 - * Copyright 2005 Bent Bisballe - * deva@aasimon.org - ****************************************************************************/ - -/* - * Originally from: - * RTVideoRec Realtime video recoder and encoder for Linux - * - * Copyright (C) 2004 B. Stultiens - * Copyright (C) 2004 Koen Otter and Glenn van der Meyden - */ - -/* - * 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 <config.h> -#ifdef USE_GUI - -#include "frame_stream.h" - -#include "miav_config.h" - -#include <time.h> - -// Use libdv -#include <libdv/dv.h> -#include <libdv/dv_types.h> - -#include <SDL/SDL.h> - -#include "dv.h" -#include "dvfile.h" -#include "dv1394.h" - -#include "decoder.h" -#include "debug.h" - -Decoder::Decoder(Info *ginfo, - sem_t *gencode_sem, - sem_t *gplayer_sem, - Queue<Frame> *gencode_queue, - Queue<Frame> *gplayer_queue, - pthread_mutex_t *gmutex, - volatile int *grunning) -{ - info = ginfo; - - encode_sem = gencode_sem; - player_sem = gplayer_sem; - encode_queue = gencode_queue; - player_queue = gplayer_queue; - mutex = gmutex; - running = grunning; - - b_shoot = false; - b_freeze = false; - b_record = false; // Initially no recording is done. - - pthread_mutex_init (&shot_mutex, NULL); - shot = NULL; - - mute = false; -} - -Decoder::~Decoder() -{ - pthread_mutex_destroy(&shot_mutex); -} - -void Decoder::decode() -{ - frame_stream *dvstream; - - bool local_shoot; - int local_freeze; - bool local_record = false; - bool old_record; - - bool skip_frames = config->readInt("player_skip_frames"); - - dv1394 dv1394_stream = dv1394(info); // Use default port and channel. - dvfile dvfile_stream = dvfile(info); - if(dv1394_stream.connect()) { - // Use the dv1394 stream for input. - dvstream = &dv1394_stream; - } else { - // Use the fallback dv filereader for input. - dvstream = &dvfile_stream; - } - - while(*running) { - uint8_t *ptr; - SDL_Event user_event; - - // Read a dvframe - ptr = dvstream->readFrame(); - if(!ptr) return; // No frame read. (Due to dv read error) - - old_record = local_record; - local_shoot = b_shoot; - b_shoot = false; - local_freeze = b_freeze; - b_freeze = false; - local_record = b_record; - - if(local_shoot) { - pthread_mutex_lock(&shot_mutex); - if(!shot) shot = new Frame(ptr, DVPACKAGE_SIZE); - pthread_mutex_unlock(&shot_mutex); - } - - if(local_freeze == 1) { - pthread_mutex_lock(&shot_mutex); - if(shot) delete shot; - shot = new Frame(ptr, DVPACKAGE_SIZE); - pthread_mutex_unlock(&shot_mutex); - } - - static int showframe = 1; - if(skip_frames != 0) showframe = 1 - showframe; - if(showframe) { - Frame *pframe = new Frame(ptr, DVPACKAGE_SIZE); - - pframe->shoot = local_shoot; - pframe->freeze = local_freeze; - pframe->record = local_record; - - player_queue->push(pframe); - - // Create and send SDL event. - user_event.type = SDL_USEREVENT; - user_event.user.code = 0; - user_event.user.data1 = NULL; - user_event.user.data2 = NULL; - SDL_PushEvent(&user_event); - } - - if(local_record | (local_record != old_record) | local_shoot | local_freeze) { - Frame *eframe = new Frame(NULL, 0); - eframe->data = ptr; - eframe->size = DVPACKAGE_SIZE; - - eframe->shoot = local_shoot; - eframe->freeze = local_freeze; - eframe->record = local_record; - eframe->mute = mute; - - encode_queue->push(eframe); - - sem_post(encode_sem); - } else { - free(ptr); - } - } - - // Kick the others so they wake up with empty queues - sem_post(encode_sem); -} - -void Decoder::thread_main() { - decode(); - fprintf(stderr, "Decoder thread stopped.\n"); fflush(stderr); -} - -/* - * Set freeze bit on current frame. - */ -void Decoder::freeze() -{ - b_freeze = 1; -} - -/* - * Remove frozen frame. - */ -void Decoder::unfreeze() -{ - b_freeze = -1; - - pthread_mutex_lock(&shot_mutex); - delete shot; - shot = NULL; - pthread_mutex_unlock(&shot_mutex); -} - -/* - * Set shoot bit on current frame. - */ -void Decoder::shoot(unsigned char *rgb) -{ - struct timespec ts; - - b_shoot = true; - - // Wait for shot to be taken - while(1) { - pthread_mutex_lock(&shot_mutex); - if(shot) { - getScreenshot(shot, rgb); - delete shot; - shot = NULL; - pthread_mutex_unlock(&shot_mutex); - return; - } - pthread_mutex_unlock(&shot_mutex); - - ts.tv_sec = 0; - ts.tv_nsec = 100000000L; // 100ms - nanosleep(&ts, NULL); - } -} - -/* - * Set the record bit to true in all following frames. - */ -void Decoder::start() -{ - b_record = true; -} - -/* - * Set the record bit to false in all following frames. - */ -void Decoder::stop(n_savestate save) -{ - b_record = false; -} - -void Decoder::getScreenshot(Frame *frame, unsigned char *rgb) -{ - unsigned char *pixels[3]; - int pitches[3]; - - pixels[ 0 ] = rgb; - pixels[ 1 ] = NULL; - pixels[ 2 ] = NULL; - - pitches[ 0 ] = 720 * 4; - pitches[ 1 ] = 0; - pitches[ 2 ] = 0; - - dv_decoder_t *decoder = dv_decoder_new(FALSE/*this value is unused*/, FALSE, FALSE); - decoder->quality = DV_QUALITY_BEST; - - dv_parse_header(decoder, frame->data); - - decoder->system = e_dv_system_625_50; // PAL lines, PAL framerate - decoder->sampling = e_dv_sample_422; // 4 bytes y, 2 bytes u, 2 bytes v - decoder->std = e_dv_std_iec_61834; - decoder->num_dif_seqs = 12; - - // libdv img decode to rgb - dv_decode_full_frame(decoder, - frame->data, - e_dv_color_bgr0, - pixels, - pitches); - - dv_decoder_free(decoder); -} - -void Decoder::setMute(bool m) -{ - mute = m; -} - -#endif /*USE_GUI*/ diff --git a/client/decoder.h b/client/decoder.h deleted file mode 100644 index 20878c7..0000000 --- a/client/decoder.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * decoder.h - * - * Sat Feb 19 17:05:42 CET 2005 - * Copyright 2005 Bent Bisballe - * deva@aasimon.org - ****************************************************************************/ - -/* - * Originally from: - * RTVideoRec Realtime video recoder and encoder for Linux - * - * Copyright (C) 2004 B. Stultiens - */ - -/* - * 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 "config.h" -#ifdef USE_GUI - -#ifndef __RTVIDEOREC_DECODER_H -#define __RTVIDEOREC_DECODER_H - -#include "info.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "queue.h" -#include "encoder.h" -#include "player.h" - -#include "thread.h" -#include "frame.h" - -class Decoder : public Thread { -public: - Decoder(Info *ginfo, - sem_t *gencode_sem, - sem_t *gplayer_sem, - Queue<Frame> *gencode_queue, - Queue<Frame> *gplayer_queue, - pthread_mutex_t *gmutex, - volatile int *grunning); - ~Decoder(); - void thread_main(); - - void freeze(); - void unfreeze(); - void shoot(unsigned char *rgb); - void start(); - void stop(n_savestate save); - void setMute(bool mute); - -private: - volatile bool mute; - - void getScreenshot(Frame *frame, unsigned char *rgb); - - pthread_mutex_t shot_mutex; - Frame* shot; - - volatile int b_freeze; - volatile bool b_shoot; - volatile bool b_record; - - Info *info; - // AVCodecContext dvcodec; - - sem_t *encode_sem; - sem_t *player_sem; - Queue<Frame> *encode_queue; - Queue<Frame> *player_queue; - pthread_mutex_t *mutex; - volatile int *running; - - void decode(); -}; - -#endif/* __RTVIDEOREC_DECODER_H*/ - -#endif/*USE_GUI*/ diff --git a/client/encoder.cc b/client/encoder.cc deleted file mode 100644 index e7b79bf..0000000 --- a/client/encoder.cc +++ /dev/null @@ -1,273 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * encoder.cc - * - * Tue Apr 19 12:10:34 CEST 2005 - * Copyright 2005 Bent Bisballe - * deva@aasimon.org - ****************************************************************************/ - -/* - * Originally from: - * RTVideoRec Realtime video recoder and encoder for Linux - * - * Copyright (C) 2004 B. Stultiens - * Copyright (C) 2004 Koen Otter and Glenn van der Meyden - */ - -/* - * 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 <config.h> -#ifdef USE_GUI - -#include "util.h" -#include "encoder.h" - -Encoder::Encoder(Info *ginfo, - const char *gip, - const int gport, - sem_t *gsem, - Queue<Frame> *gqueue, - pthread_mutex_t *gmutex, - volatile int *grunning) -{ - info = ginfo; - - strcpy(ip, gip); - port = gport; - memset(cpr, 0, sizeof(cpr)); - - sem = gsem; - queue = gqueue; - mutex = gmutex; - running = grunning; - - // record = 0; - - sem_init(&record_sem, 0, 0); - - s = NULL; - n = NULL; - - frozen = false; - - savestate_sent = false; - savestate = NO_CHANGE; - - // shoot_request = 0; - // shoot_value = 0; - // freeze_request = 0; - // freeze_value = 0; -} - - -Encoder::~Encoder() -{ - // If a hanging connection exists, we better close it. - /* // Already deleted in thread_main - if(s) { - if(n) delete n; - delete s; - s = NULL; - n = NULL; - } - */ -} - - -void Encoder::encode() -{ - Frame *frame; - - while(*running) { - sem_wait(sem); - - frame = queue->pop(); - - if(frame) { - if(frame->freeze == 1) frozen = true; - if(frame->freeze == -1) frozen = false; - if(frame->shoot) frozen = false; - - if(frame->record || - (frame->freeze == 1) || - frame->shoot) { - - // If no connection is present, make a new one - if(!s) { - s = new Socket(port, info); - s->sconnect(ip); - n = new Network(s, info); - } - - n_header h; - - if(savestate != NO_CHANGE) savestate_sent = true; - - h.header_type = DATA_HEADER; - sprintf(h.header.h_data.cpr, cpr); - h.header.h_data.freeze = frame->freeze; - h.header.h_data.snapshot = frame->shoot; - h.header.h_data.record = frame->record; - h.header.h_data.savestate = savestate;//NO_CHANGE; - h.header.h_data.mute = frame->mute; - - savestate = NO_CHANGE; // only transmit once! - - // if(freeze_request != freeze_value) freeze_value = freeze_request; - // if(shoot_request != shoot_value) shoot_value = shoot_request; - - n->sendPackage(&h, frame->data, frame->size); - } else { - // When frozen we need to preserve the connection in order to - // remember the frozen frame on the server side. - if(!frozen) { - // No data is to be sent, if we have a connection, destroy it. - if(s) { - if(n) delete n; - delete s; - s = NULL; - n = NULL; - } - } - } - - if(frame->shoot && !frozen && !frame->record) { - // FIXME: This is ugly! - // Bugfix... connection not cleared, when an 'unfrozen' snapshot is taken, - // and no recording is done. - if(s) { - if(n) delete n; - delete s; - s = NULL; - n = NULL; - } - } - - if(frame) delete frame; - } - } -} - - -void Encoder::setCpr(char *newcpr) -{ - strcpy(cpr, newcpr); -} - - -void Encoder::freeze() -{ - /* - if(!s) { - s = new Socket(port, errobj); - s->sconnect(ip); - n = new Network(s, errobj); - } - */ - // if(!errobj->hasError()) freeze_request = 1 - freeze_request; -} - - -/* - * shoot - * Set the shoot bit in the network header on the current frame. - * return the decodet (rgba) version af that frame, for thumbnail show. - */ -void Encoder::shoot() -{ - /* - if(!s) { - s = new Socket(port, errobj); - s->sconnect(ip); - n = new Network(s, errobj); - } - */ - // if(!errobj->hasError()) shoot_request = 1 - shoot_request; - // getScreenshot(rgb); -} - - -void Encoder::thread_main() -{ - encode(); - if(s) { - if(n) delete n; - delete s; - s = NULL; - n = NULL; - } - fprintf(stderr, "Encoder thread stopped.\n"); fflush(stderr); -} - - -void Encoder::start() -{ - savestate = NO_CHANGE; - savestate_sent = false; - /* - if(!s) { - s = new Socket(port, errobj); - s->sconnect(ip); - n = new Network(s, errobj); - } - */ - // if(!errobj->hasError()) record = 1; -} - - -void Encoder::stop(n_savestate save) -{ - savestate = save; - // Don't return until we are sure the savestate has been sent. - while(savestate_sent == false) { - // Just wait a while (in a while!) - sleep_0_2_frame(); - } -/* - struct timespec ts; - // TODO: set save state in package header. - - // Lock the queue and wait until all elements are sent on the network. - queue->lock(); - fprintf(stderr, "Emptying queue"); fflush(stderr); - while(queue->peek()) { - // Remove any late buffer - // We don't care, the encoder finishes them all - ts.tv_sec = 0; - ts.tv_nsec = 500000000L; // 100ms - fprintf(stderr, "."); fflush(stderr); - nanosleep(&ts, NULL); - } - fprintf(stderr, "done!\n"); fflush(stderr); - - record = 0; - - queue->unlock(); -*/ -/* - if(s) { - if(n) delete n; - delete s; - s = NULL; - n = NULL; - } -*/ -} - -#endif /*USE_GUI*/ diff --git a/client/encoder.h b/client/encoder.h deleted file mode 100644 index de29646..0000000 --- a/client/encoder.h +++ /dev/null @@ -1,118 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * encoder.h - * - * Thu Apr 14 19:29:55 CEST 2005 - * Copyright 2005 Bent Bisballe - * deva@aasimon.org - ****************************************************************************/ - -/* - * Originally from: - * RTVideoRec Realtime video recoder and encoder for Linux - * - * Copyright (C) 2004 B. Stultiens - */ - -/* - * 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 "config.h" -#ifdef USE_GUI - -#ifndef __RTVIDEOREC_ENCODER_H -#define __RTVIDEOREC_ENCODER_H - -#include "thread.h" - -#include "info.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -//#include <avformat.h> - -#include "miav_client.h" -#include "util.h" -#include "package.h" -#include "frame.h" -#include "queue.h" - -// FIXME: One size fits all... -#define VIDEO_BUFFER_SIZE (1024*1024) - - -/** - * This class contains code for sending the video stream and the snapshots - * over the network, to the MIaV server. - */ -class Encoder : public Thread { -public: - Encoder(Info* ginfo, - const char *gip, - const int gport, - sem_t *gsem, - Queue<Frame> *gqueue, - pthread_mutex_t *gmutex, - volatile int *grunning); - ~Encoder(); - - void setCpr(char *newcpr); - - void start(); - void stop(n_savestate save); - - void freeze(); - void shoot(); - - void thread_main(); - - // AVFormatContext *fc; - sem_t *sem; - Queue<Frame> *queue; - pthread_mutex_t *mutex; - volatile int *running; - -private: - Info *info; - - int port; - char ip[32]; - char cpr[32]; - - bool frozen; - - // volatile int record; - - // volatile int shoot_request; - // int shoot_value; - // volatile int freeze_request; - // int freeze_value; - - volatile bool savestate_sent; - volatile n_savestate savestate; - - sem_t record_sem; - void encode(); - - Socket *s; - Network *n; -}; - -#endif - -#endif /*USE_GUI*/ diff --git a/client/mainwindow.cc b/client/mainwindow.cc index 0978120..e813d00 100644 --- a/client/mainwindow.cc +++ b/client/mainwindow.cc @@ -186,7 +186,7 @@ void MainWindow::createGui() QGridLayout *g1 = new QGridLayout(); g0->addLayout(g1, 0, 0); - QGroupBox *gb = new QGroupBox(this); + QGroupBox *gb = new QGroupBox(); /* gb->setColumns(1); gb->setInsideMargin(HISTORY_LIST_MARGIN); @@ -209,7 +209,7 @@ void MainWindow::createGui() g1->margin() * 5 - g0->margin() * 3; - img_recedge = new QLabel(this); + img_recedge = new QLabel(); QPalette palette; palette.setColor(img_recedge->backgroundRole(), QColor(160,160,160)); img_recedge->setPalette(palette); @@ -218,11 +218,11 @@ void MainWindow::createGui() img_live = new VideoWidget(img_recedge, camera); img_live->setFixedSize(output_width - 20, output_height - 20); img_live->move(10,10); - g1->addWidget( img_recedge, 0, 0, 0, 3, Qt::AlignHCenter); + g1->addWidget( img_recedge, 0, 0, 1, 3, Qt::AlignHCenter); // CPR/NAME LABEL + CPR button lbl_cpr = createLabel("", output_width - (int)(BUTTON_WIDTH * unit), BUTTON_HEIGHT); - g1->addWidget( lbl_cpr, 1, 1, 0, 2); + g1->addWidget( lbl_cpr, 1, 0, 1, 2); btn_cpr = createButton(""); btn_cpr->setFocus(); @@ -233,7 +233,7 @@ void MainWindow::createGui() g1->addWidget(btn_cpr, 1, 3); lbl_name = createLabel("", output_width, (int)(BUTTON_HEIGHT * 0.8f)); - g1->addWidget( lbl_name, 2, 2, 0, 3); + g1->addWidget( lbl_name, 2, 0, 1, 2); /* btn_clear = createButton(""); btn_clear->setPixmap(*img_clear); @@ -292,7 +292,7 @@ void MainWindow::createGui() status = new QStatusBar(this); status->setSizeGripEnabled(FALSE); // status->setFont(QFont( "Sans Serif", (int)(unit * height / 3), QFont::Normal )); - g0->addWidget(status, 4, 4, 0, 1); + g0->addWidget(status, 4, 0, 4, 1); lbl_recordtime = createLabel("", BUTTON_WIDTH, 1); lbl_recordtime->setFixedWidth((int)(BUTTON_WIDTH * unit) + @@ -302,7 +302,7 @@ void MainWindow::createGui() status->addWidget(lbl_recordtime, 0); // About button - btn_about = new QPushButton("", this); + btn_about = new QPushButton(); btn_about->setFixedHeight((int)unit); pixmap.fromImage(*img_logo); btn_about->setIcon(pixmap); diff --git a/client/player.cc b/client/player.cc deleted file mode 100644 index e57211d..0000000 --- a/client/player.cc +++ /dev/null @@ -1,322 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * plsyer.cc - * - * Wed Nov 3 21:23:14 CET 2004 - * Copyright 2004 Bent Bisballe - * deva@aasimon.org - ****************************************************************************/ - -/* - * Originally from: - * RTVideoRec Realtime video recoder and encoder for Linux - * - * Copyright (C) 2004 B. Stultiens - * Copyright (C) 2004 Koen Otter and Glenn van der Meyden - */ - -/* - * 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 <config.h> -#ifdef USE_GUI - -#include "player.h" - -// Use libdv -#include <libdv/dv.h> -#include <libdv/dv_types.h> - -#include <time.h> - -// For sleep -#include <unistd.h> - -Player::Player(Info *ginfo, - int w, int h, - volatile int *grunning, - sem_t *gsem, - Queue<Frame> *gqueue, - pthread_mutex_t *gmutex) -{ - // No errors has ocurred... yet! - noErrors = true; - - yuv_draw = new YUVDraw(); - - width = w; - height = h; - - info = ginfo; - - running = grunning; - sem = gsem; - queue = gqueue; - mutex = gmutex; - - sem_init(&play_sem, 0, 1); - - initSDL(); - - bypass = false; - - // Do not show the text - showtext = false; - recording = false; - recording_prev = !recording; - cprchanged = false; - - muted = false; - muted_prev = !muted; -} - -Player::~Player() -{ - deinitSDL(); - if(yuv_draw) delete yuv_draw; -} - -void Player::reinitSDL() -{ - deinitSDL(); - initSDL(); -} - -void Player::deinitSDL() -{ - SDL_FreeYUVOverlay(overlay); - SDL_Quit(); -} - -void Player::initSDL() -{ - if(SDL_Init(SDL_INIT_VIDEO) < 0) { - info->error("Unable to init SDL: %s.", SDL_GetError()); - noErrors = false; - printf("failed!\n"); - return; - } - - screen = SDL_SetVideoMode(width, - height, - 0, // 0 bpp means 'use current display depth' - SDL_HWSURFACE | - SDL_ANYFORMAT | - SDL_HWACCEL ); - - if(!screen) { - info->error("Unable to set %dx%d video: %s.", - 720, 576, SDL_GetError()); - noErrors = false; - printf("failed!\n"); - return; - } - - overlay = SDL_CreateYUVOverlay(720, - 576, - SDL_YUY2_OVERLAY, // Match for the libdv decoder output - screen); - if(!overlay) { - info->error("Unable to create SDL overlay: %s.", SDL_GetError()); - noErrors = false; - printf("failed!\n"); - return; - } - - // Setup the displayarea. - rect.x = 0; - rect.y = 0; - rect.w = width; - rect.h = height; - - yuv_draw->setOverlay(overlay); -} - -void Player::player() -{ - SDL_Event event; - Frame *frame; - - int pitches[3]; - - if(!noErrors) return; // FIXME: Gracefully exit... - - bool first = true; - dv_decoder_t *decoder = dv_decoder_new(FALSE/*this value is unused*/, FALSE, FALSE); - decoder->quality = DV_QUALITY_BEST; - - while(*running) { - // Wait for the semaphore to be free... then run - sem_wait(&play_sem); - sem_post(&play_sem); - - if(bypass) continue; - - if(!SDL_WaitEvent(&event)) break; // FIXME: Gracefully exit... - - switch(event.type) { - case SDL_KEYDOWN: - switch(event.key.keysym.sym) { - case SDLK_q: - case SDLK_ESCAPE: - goto quitit; - default: - break; - } - break; - - case SDL_USEREVENT: - frame = queue->pop(); - if(!frame) break; - - if(first) { - pitches[0] = overlay->pitches[0]; - pitches[1] = overlay->pitches[1]; - pitches[2] = overlay->pitches[2]; - - dv_parse_header(decoder, frame->data); - //dv_parse_packs(decoder, frame->data); // Not needed anyway! - - decoder->system = e_dv_system_625_50; // PAL lines, PAL framerate - decoder->sampling = e_dv_sample_422; // 4 bytes y, 2 bytes u, 2 bytes v - decoder->std = e_dv_std_iec_61834; - decoder->num_dif_seqs = 12; - first = false; - } - - if(SDL_LockYUVOverlay(overlay) == -1) info->error("SDL_LockYUVOverlay failed."); - - // libdv img decode to yuv - dv_decode_full_frame(decoder, - frame->data, - e_dv_color_yuv, - overlay->pixels, - pitches); - - // Set status text - // if(muted != muted_prev) { - yuv_draw->mute(muted); - // muted_prev = muted; - // } - if(recording != recording_prev) { - if(recording) yuv_draw->setTopText(TEXT_RECORDING); - else yuv_draw->setTopText(TEXT_STOPPED); - recording_prev = recording; - } - - // Draw overlaytext (if enabled) - if(showtext) { - if(cprchanged) { - yuv_draw->setBottomText(cpr); - cprchanged = false; - } - yuv_draw->draw(); - } - - SDL_UnlockYUVOverlay(overlay); - SDL_DisplayYUVOverlay(overlay, &rect); - delete frame; - break; - - case SDL_QUIT: - quitit: - *running = 0; - break; - - default: - break; - } - } - if(decoder) dv_decoder_free(decoder); - - struct timespec ts; - - /* Remove any late buffer */ - /* We don't care, the encoder finishes them all */ - ts.tv_sec = 0; - ts.tv_nsec = 100000000L; // 100ms - nanosleep(&ts, NULL); - - frame = queue->pop(); - if(frame) delete frame; -} - -void Player::thread_main() -{ - player(); - fprintf(stderr, "Player thread stopped.\n"); fflush(stderr); -} - -void Player::start() -{ - sem_post(&play_sem); -} - -void Player::stop() -{ - sem_wait(&play_sem); -} - -// FIXME: Worst case genario: the loop takes more than 1 second -// to stop displaying => crash, due to deinitialization -// of SDL, while calling it.! -void Player::resize(int w, int h, bool s) -{ - // Tell loop to stop - bypass = true; - - // Wait to ensure the current frame is done being displayed - sleep(1); - - // Deinitialize SDL - deinitSDL(); - - // Set new size - width = w; - height = h; - - // Initialize SDL - initSDL(); - - // Tell loop to go on. - bypass = false; - - showtext = s; -} - -void Player::setCpr(char *newcpr, char* name) -{ - sprintf(cpr, "ID: %s - %s", newcpr, name); - cprchanged = true; -} - -void Player::startrecord() -{ - recording = true; -} - -void Player::stoprecord() -{ - recording = false; -} - -void Player::setMute(bool m) -{ - muted = m; -} - -#endif /* USE_GUI */ diff --git a/client/player.h b/client/player.h deleted file mode 100644 index 4e826ad..0000000 --- a/client/player.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * player.h - * - * Fri Feb 25 20:23:19 CET 2005 - * Copyright 2005 Bent Bisballe - * deva@aasimon.org - ****************************************************************************/ - -/* - * Originally from: - * RTVideoRec Realtime video recoder and encoder for Linux - * - * Copyright (C) 2004 Bent Bisballe - * - */ - -/* - * 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 "config.h" -#ifdef USE_GUI - -#ifndef __RTVIDEOREC_PLAYER_H -#define __RTVIDEOREC_PLAYER_H - -#include "info.h" - -#include <stdio.h> -#include <stdlib.h> -#include <SDL/SDL.h> -//#include <avformat.h> - -#include "util.h" -#include "queue.h" - -#include "thread.h" -#include "frame.h" - -#include <QWidget> - -#include "yuv_draw.h" - -#define TEXT_RECORDING "Optager" -#define TEXT_STOPPED "Stoppet" - -//#define DISPLAYWIDTH 720 // FIXME: These numbers suck! -//#define DISPLAYHEIGHT 576 - -/** - * This class contains the SDL code, for displaying the movie frames - * in the widget, using hardware overlay. - */ -class Player : public Thread { -public: - Player(Info *ginfo, - int width, int height, - volatile int *grunning, - sem_t *gsem, - Queue<Frame> *gqueue, - pthread_mutex_t *gmutex); - ~Player(); - - // These functions are used to set the overlay text. - void setCpr(char *newcpr, char* name); - void startrecord(); - void stoprecord(); - - // Start and stop runnning video (freeze/unfreeze) - void start(); - void stop(); - - // Used to reinitialize the SDL output width a new size - void resize(int width, int height, bool showtext); - - void thread_main(); - - void setMute(bool mute); - -private: - - void initSDL(); - void deinitSDL(); - void reinitSDL(); - - // Output dimensions (overlay) - volatile int width; - volatile int height; - - SDL_Rect rect; - - // Set to true, whenever a resize is requested. - volatile bool bypass; - - // Vars for the text overlay - volatile bool showtext; - volatile bool recording; - bool recording_prev; - - volatile bool muted; - bool muted_prev; - - volatile bool cprchanged; - char cpr[256]; - - Info *info; - - void player(); - - // Used to verify if errors ha ocurred previously. - bool noErrors; - - volatile int *running; - sem_t *sem; - Queue<Frame> *queue; - pthread_mutex_t *mutex; - - sem_t play_sem; - - SDL_Surface *screen; - SDL_Overlay *overlay; - - YUVDraw *yuv_draw; -}; - -#endif/*__RTVIDEOREC_PLAYER_H*/ - -#endif /* USE_GUI */ |