/* -*- 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 *v_out, pthread_mutex_t *v_out_mutex, sem_t *v_out_sem, FramePriorityQueue *a_out, pthread_mutex_t *a_out_mutex, sem_t *a_out_sem, Info *i) { info = i; info->info("MovEncoder"); running = true; // Queues inputqueue = in; video_outputqueue = v_out; audio_outputqueue = a_out; // Queue mutexes input_mutex = in_mutex; video_output_mutex = v_out_mutex; audio_output_mutex = a_out_mutex; input_sem = in_sem; video_output_sem = v_out_sem; audio_output_sem = a_out_sem; read_sem = r_sem; } MovEncoder::~MovEncoder() { info->info("~MovEncoder"); } // this runs in a thread void MovEncoder::thread_main() { info->info("MovEncoder thread is running."); static volatile int test = 0; int v_outsize = 0; int a_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); // Encode video out_v_frame = new Frame(in_frame->data, in_frame->size); out_v_frame->number = in_frame->number; out_v_frame = fame.encode(in_frame); 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; out_a_frame = lame.encode(in_frame); out_a_frame->number = in_frame->number; delete in_frame; // Lock output mutex pthread_mutex_lock(video_output_mutex); video_outputqueue->push(out_v_frame); v_outsize = video_outputqueue->size(); pthread_mutex_unlock(video_output_mutex); // Unlock output mutex // Kick multiplexer (video) sem_post(video_output_sem); // Lock output mutex pthread_mutex_lock(audio_output_mutex); audio_outputqueue->push(out_a_frame); a_outsize = audio_outputqueue->size(); pthread_mutex_unlock(audio_output_mutex); // Unlock output mutex // Kick multiplexer (audio) sem_post(audio_output_sem); } delete item; test++; if(test % (25 * 24) == 0) info->info("Input pool size: %d, video output pool size: %d, audio output pool size: %d", insize, v_outsize, a_outsize); // Kick reader sem_post(read_sem); } } // Kick multiplexer (audio) sem_post(audio_output_sem); // Kick multiplexer (video) sem_post(video_output_sem); info->info("MovEncoder thread has stopped."); }