/* -*- 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 #ifdef USE_GUI /* #include #include #include #include */ #include #include "dv1394.h" #include "dv.h" #include "decoder.h" #include "debug.h" Decoder::Decoder(Error* err, sem_t *gencode_sem, sem_t *gplayer_sem, Queue *gencode_queue, Queue *gplayer_queue, pthread_mutex_t *gmutex, volatile int *grunning) { errobj = err; encode_sem = gencode_sem; player_sem = gplayer_sem; encode_queue = gencode_queue; player_queue = gplayer_queue; mutex = gmutex; running = grunning; } Decoder::~Decoder() { } void Decoder::decode() { dv1394 dv_stream = dv1394(errobj); // Use default port and channel. while(*running) { uint8_t *ptr; int len; SDL_Event user_event; // Read a dvframe ptr = dv_stream.readFrame(); if(!ptr) return; // No frame read. (Due to firewire error) Frame *eframe = new Frame(ptr, DVPACKAGE_SIZE); Frame *pframe = new Frame(ptr, DVPACKAGE_SIZE); free(ptr); pthread_mutex_lock(mutex); encode_queue->push(eframe); player_queue->push(pframe); pthread_mutex_unlock(mutex); sem_post(encode_sem); // 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); } // Kick the others so they wake up with empty queues sem_post(encode_sem); } void Decoder::run() { decode(); fprintf(stderr, "Decoder thread stopped.\n"); fflush(sdterr); } #endif /*USE_GUI*/