diff options
author | deva <deva> | 2005-09-20 19:39:49 +0000 |
---|---|---|
committer | deva <deva> | 2005-09-20 19:39:49 +0000 |
commit | 48b768db44cb9e00adfead71b973074685cec417 (patch) | |
tree | e606f6f93b5fee42335b6f4f3cfaf7b3dc487cae /src/audio_encoder.cc | |
parent | 5298cdacd41efbf2ffd0282b14e401734b31d90a (diff) |
*** empty log message ***R0_2_8
Diffstat (limited to 'src/audio_encoder.cc')
-rw-r--r-- | src/audio_encoder.cc | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/audio_encoder.cc b/src/audio_encoder.cc new file mode 100644 index 0000000..6bebe0c --- /dev/null +++ b/src/audio_encoder.cc @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * audio_encoder.cc + * + * Sat Sep 17 18:38:45 CEST 2005 + * Copyright 2005 Bent Bisballe Nyeng + * 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" +#include "audio_encoder.h" +#include "util.h" + +AudioEncoder::AudioEncoder(FramePriorityQueue *in, pthread_mutex_t *in_mutex, sem_t *in_sem, + FramePriorityQueue *out, pthread_mutex_t *out_mutex, sem_t *out_sem, + Info *i) +{ + info = i; + info->info("AudioEncoder"); + + running = true; + + // Queues + inputqueue = in; + outputqueue = out; + + // Queue mutexes + input_mutex = in_mutex; + output_mutex = out_mutex; + + input_sem = in_sem; + output_sem = out_sem; + + frame_number = 0; +} + +AudioEncoder::~AudioEncoder() +{ +} + +void AudioEncoder::thread_main() +{ + info->info("AudioEncoder::run"); + + unsigned int queuesize = 0; + + // Run with slightly lower priority than MovEncoderWriter + nice(2); + + Frame *in_frame = NULL; + Frame *out_frame = NULL; + Frame *tmpframe; + + LibLAMEWrapper lame(info); + + while(running) { + sem_wait(input_sem); + + // If no frame is in the buffer, get one from the queue + while( in_frame == NULL ) { + + // sem_wait(input_sem); + + // Lock output mutex + pthread_mutex_lock( input_mutex ); + tmpframe = inputqueue->top(); + + if(tmpframe && tmpframe->number == frame_number) { + inputqueue->pop(); + queuesize = inputqueue->size(); + in_frame = tmpframe; + frame_number++; + } + + pthread_mutex_unlock( input_mutex ); + // Unlock output mutex + + sleep_1_frame(); + } + + // Check for end of stream + if(in_frame->endOfFrameStream == true) { + info->info("endOfFrameStream in AudioEncoder"); + running = false; + out_frame = lame.close(); + } else { + // Encode audio + out_frame = lame.encode(in_frame); + } + out_frame->number = in_frame->number; + out_frame->endOfFrameStream = in_frame->endOfFrameStream; + + delete in_frame; + in_frame = NULL; + + // Lock output mutex + pthread_mutex_lock(output_mutex); + outputqueue->push(out_frame); + pthread_mutex_unlock(output_mutex); + // Unlock output mutex + + // Kick multiplexer (audio) + sem_post(output_sem); + } + + // Kick multiplexer (audio) + sem_post(output_sem); + + info->info("AudioEncoder::stop"); +} |