diff options
Diffstat (limited to 'src/encoder.cc')
-rw-r--r-- | src/encoder.cc | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/encoder.cc b/src/encoder.cc new file mode 100644 index 0000000..3da7443 --- /dev/null +++ b/src/encoder.cc @@ -0,0 +1,158 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * RTVideoRec Realtime video recoder and encoder for Linux + * + * Copyright (C) 2004 Bent Bisballe + * Copyright (C) 2004 B. Stultiens + * Copyright (C) 2004 Koen Otter and Glenn van der Meyden + * + * 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 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 "encoder.h" + +Encoder::Encoder(const char *gip, + const int gport, + sem_t *gsem, + Queue<DVFrame> *gqueue, + pthread_mutex_t *gmutex, + volatile int *grunning) +{ + sprintf(ip, gip); + port = gport; + memset(cpr, 0, sizeof(cpr)); + + printf("[ip: %s]\n", ip); + printf("[port: %d]\n", port); + + sem = gsem; + queue = gqueue; + mutex = gmutex; + running = grunning; + + record = 0; + + sem_init(&record_sem, 0, 0); + + s = NULL; + n = NULL; + + shoot_request = 0; + shoot_value = 0; + freeze_request = 0; + freeze_value = 0; + +} + +Encoder::~Encoder() +{ + if(n) delete n; + if(s) delete s; +} + + +void Encoder::setCpr(char *newcpr) +{ + sprintf(cpr, newcpr); +} + + +void Encoder::encode() +{ + DVFrame *f; + + while(*running) { + sem_wait(sem); + + /* + pthread_mutex_lock(mutex); + while((f = queue->pop())) delete f; + pthread_mutex_unlock(mutex); + + while(record) { + sem_wait(sem); + */ + + pthread_mutex_lock(mutex); + f = queue->pop(); + pthread_mutex_unlock(mutex); + + if((f && record) || (freeze_request != freeze_value) || (shoot_request != shoot_value)) { + fprintf(stderr, "Rec!\n"); + n_header h; + + h.header_type = DATA_HEADER; + sprintf(h.header.h_data.cpr, cpr); + h.header.h_data.freeze = (freeze_request != freeze_value); + h.header.h_data.snapshot = (shoot_request != shoot_value); + h.header.h_data.record = record; + + if(freeze_request != freeze_value) freeze_value = freeze_request; + if(shoot_request != shoot_value) shoot_value = shoot_request; + + n->sendPackage(&h, f->frame, sizeof(f->frame)); + } + + if(f) delete f; + //} + } + pthread_exit(NULL); +} + +void Encoder::freeze() +{ + if(!s) { + s = new Socket(port); + s->sconnect(ip); + n = new Network(s); + } + freeze_request = 1 - freeze_request; +} + +void Encoder::shoot() +{ + if(!s) { + s = new Socket(port); + s->sconnect(ip); + n = new Network(s); + } + shoot_request = 1 - shoot_request; +} + +void Encoder::run() { + encode(); +} + +void Encoder::start() { + printf("GO!\n"); + if(!s) { + s = new Socket(port); + s->sconnect(ip); + n = new Network(s); + } + record = 1; +} + +void Encoder::stop() { + printf("STOP!\n"); + if(s) { + if(n) delete n; + delete s; + s = NULL; + n = NULL; + } + record = 0; +} |