summaryrefslogtreecommitdiff
path: root/src/audio_encoder.cc
blob: 6bebe0cd0abbf77b9e9dfc585c7f5f5f9cb351c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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");
}