/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * mov_encoder.cc * * Sat Feb 19 14:13:19 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 "mov_encoder.h" #include // For nice #include #include "miav_config.h" #include "debug.h" MovEncoder::MovEncoder(sem_t *r_sem, FrameVectorQueue *in, sem_t *in_sem, pthread_mutex_t *in_mutex, FramePriorityQueue *out, sem_t *out_sem, pthread_mutex_t *out_mutex, Info *i) { info = i; info->info("MovEncoder"); running = true; inputqueue = in; outputqueue = out; input_sem = in_sem; output_sem = out_sem; read_sem = r_sem; input_mutex = in_mutex; output_mutex = out_mutex; } MovEncoder::~MovEncoder() { info->info("~MovEncoder"); } //#define COPY_DV 1 // this runs in a thread void MovEncoder::thread_main() { info->info("MovEncoder thread is running."); static volatile int test = 0; int outsize = 0; int insize = 0; // Run with slightly lower priority than MovEncoderWriter nice(1); FrameVector *item; Frame *in_frame; Frame *out_v_frame; Frame *out_a_frame; LibFAMEWrapper fame(info); // LibLAMEWrapper lame(info); while(running) { sem_wait(input_sem); // Make a new instance for every frame sequence (usually 5) to ensure no // frame dependencies are broken when running multithreaded. LibLAMEWrapper lame(info); // Lock inout mutex pthread_mutex_lock(input_mutex); item = inputqueue->front(); inputqueue->pop(); insize = inputqueue->size(); pthread_mutex_unlock(input_mutex); // Unlock input mutex if(item) { for(unsigned int cnt = 0; cnt < item->size(); cnt++) { in_frame = item->at(cnt); #ifdef COPY_DV // Encode video out_v_frame = new Frame(in_frame->data, in_frame->size); out_v_frame->number = in_frame->number; // Encode audio out_a_frame = new Frame(in_frame->data, in_frame->size); out_a_frame->number = in_frame->number + 1; #else /*COPY_DV*/ // Encode video out_v_frame = fame.encode(in_frame); out_v_frame->number = in_frame->number; // Encode audio out_a_frame = lame.encode(in_frame); out_a_frame->number = in_frame->number + 1; #endif /*COPY_DV*/ delete in_frame; // Lock output mutex pthread_mutex_lock(output_mutex); outputqueue->push(out_v_frame); outputqueue->push(out_a_frame); outsize = outputqueue->size(); pthread_mutex_unlock(output_mutex); // Unlock output mutex } delete item; test++; if(test % (25 * 24) == 0) info->info("Input pool size: %d, output pool size: %d", insize, outsize); // Kick frame writer sem_post(output_sem); // Kick reader sem_post(read_sem); } } info->info("MovEncoder thread has stopped."); }