2
* The contents of this file are subject to the Mozilla Public
3
* License Version 1.1 (the "License"); you may not use this file
4
* except in compliance with the License. You may obtain a copy of
5
* the License at http://www.mozilla.org/MPL/
7
* Software distributed under the License is distributed on an "AS
8
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9
* implied. See the License for the specific language governing
10
* rights and limitations under the License.
12
* The Original Code is MPEG4IP.
14
* The Initial Developer of the Original Code is Cisco Systems Inc.
15
* Portions created by Cisco Systems Inc. are
16
* Copyright (C) Cisco Systems Inc. 2000-2002. All Rights Reserved.
19
* Dave Mackie dmackie@cisco.com
22
#ifndef __AUDIO_ENCODER_H__
23
#define __AUDIO_ENCODER_H__
25
#include "media_codec.h"
26
#include "media_frame.h"
29
#include "profile_audio.h"
31
#include "encoder_gui_options.h"
33
class CAudioEncoder : public CMediaCodec {
35
CAudioEncoder(CAudioProfile *profile,
38
u_int32_t srcSampleRate,
40
bool realTime = true);
42
virtual u_int32_t GetSamplesPerFrame() = 0;
44
virtual bool Init(void) = 0;
46
void AddRtpDestination(CMediaStream *stream,
47
bool disable_ts_offset,
49
in_port_t srcPort = 0);
53
static bool InterleaveStereoSamples(
55
int16_t* pRightBuffer,
56
u_int32_t numSamplesPerChannel,
57
int16_t** ppDstBuffer);
59
static bool DeinterleaveStereoSamples(
61
u_int32_t numSamplesPerChannel,
62
int16_t** ppLeftBuffer,
63
int16_t** ppRightBuffer);
64
CAudioEncoder *GetNext(void) {
65
return (CAudioEncoder *)CMediaCodec::GetNext();
69
CAudioProfile *Profile(void) { return (CAudioProfile *)m_pConfig; } ;
71
void Initialize(void);
72
virtual bool EncodeSamples(
74
u_int32_t numSamplesPerChannel,
75
u_int8_t numChannels) = 0;
77
virtual bool GetEncodedFrame(
79
u_int32_t* pBufferLength,
80
u_int32_t* pNumSamplesPerChannel) = 0;
82
CRtpTransmitter *CreateRtpTransmitter(bool disable_ts) {
83
return new CAudioRtpTransmitter(Profile(), m_mtu, disable_ts);
86
void ProcessAudioFrame(CMediaFrame *frame);
89
const u_int8_t* frameData,
90
u_int32_t frameDataLength);
92
void ForwardEncodedAudioFrames(void);
96
// audio utility routines
98
inline Duration SrcSamplesToTicks(u_int64_t numSamples) {
99
return (numSamples * TimestampTicks) / m_audioSrcSampleRate;
102
inline Duration DstSamplesToTicks(u_int64_t numSamples) {
103
return (numSamples * TimestampTicks) / m_audioDstSampleRate;
106
inline u_int32_t SrcTicksToSamples(Duration duration) {
107
return (duration * m_audioSrcSampleRate) / TimestampTicks;
110
inline u_int32_t DstTicksToSamples(Duration duration) {
111
return (duration * m_audioDstSampleRate) / TimestampTicks;
114
inline u_int32_t SrcSamplesToBytes(u_int64_t numSamples) {
115
return (numSamples * m_audioSrcChannels * sizeof(u_int16_t));
118
inline u_int32_t DstSamplesToBytes(u_int64_t numSamples) {
119
return (numSamples * m_audioDstChannels * sizeof(u_int16_t));
122
inline u_int64_t SrcBytesToSamples(u_int32_t numBytes) {
123
return (numBytes / (m_audioSrcChannels * sizeof(u_int16_t)));
126
inline u_int64_t DstBytesToSamples(u_int32_t numBytes) {
127
return (numBytes / (m_audioDstChannels * sizeof(u_int16_t)));
131
void AddSilenceFrame(void);
133
// Audio encoding variables (timing, etc)
134
u_int8_t m_audioSrcChannels;
135
u_int32_t m_audioSrcSampleRate;
136
u_int32_t m_audioSrcFrameNumber;
138
// audio resampling info
139
resample_t *m_audioResample;
141
// audio destination info
142
MediaType m_audioDstType;
143
u_int8_t m_audioDstChannels;
144
u_int32_t m_audioDstSampleRate;
145
u_int16_t m_audioDstSamplesPerFrame;
146
u_int64_t m_audioDstSampleNumber;
147
u_int32_t m_audioDstFrameNumber;
149
// audio encoding info
150
u_int8_t* m_audioPreEncodingBuffer;
151
u_int32_t m_audioPreEncodingBufferLength;
152
u_int32_t m_audioPreEncodingBufferMaxLength;
155
Timestamp m_audioStartTimestamp;
156
Timestamp m_audioEncodingStartTimestamp;
157
Duration m_audioSrcElapsedDuration;
158
Duration m_audioDstElapsedDuration;
161
void AudioProfileCheck(CAudioProfile *ap);
163
CAudioEncoder* AudioEncoderCreate(CAudioProfile *ap,
165
u_int8_t srcChannels,
166
u_int32_t srcSampleRate,
168
bool realTime = true);
169
media_desc_t *create_audio_sdp(CAudioProfile *pConfig,
171
bool *isma_compliant,
173
uint8_t *audioProfile,
174
uint8_t **audioConfig,
175
uint32_t *audioConfigLen);
177
MediaType get_audio_mp4_fileinfo(CAudioProfile *pConfig,
179
bool *isma_compliant,
180
uint8_t *audioProfile,
181
uint8_t **audioConfig,
182
uint32_t *audioConfigLen,
183
uint8_t *mp4_audio_type);
185
void create_mp4_audio_hint_track(CAudioProfile *pConfig,
186
MP4FileHandle mp4file,
191
bool get_audio_rtp_info (CAudioProfile *pConfig,
192
MediaType *audioFrameType,
193
uint32_t *audioTimeScale,
194
uint8_t *audioPayloadNumber,
195
uint8_t *audioPayloadBytesPerPacket,
196
uint8_t *audioPayloadBytesPerFrame,
197
uint8_t *audioQueueMaxCount,
198
uint8_t *audioiovMaxCount,
199
audio_queue_frame_f *audio_queue_frame,
200
audio_set_rtp_payload_f *audio_set_rtp_payload,
201
audio_set_rtp_header_f *audio_set_header,
202
audio_set_rtp_jumbo_frame_f *audio_set_jumbo_frame,
205
void AudioProfileCheckBase(CAudioProfile *ap);
207
CAudioEncoder* AudioEncoderBaseCreate(CAudioProfile *ap,
209
u_int8_t srcChannels,
210
u_int32_t srcSampleRate,
212
bool realTime = true);
214
media_desc_t *create_base_audio_sdp(CAudioProfile *pConfig,
216
bool *isma_compliant,
218
uint8_t *audioProfile,
219
uint8_t **audioConfig,
220
uint32_t *audioConfigLen);
222
MediaType get_base_audio_mp4_fileinfo(CAudioProfile *pConfig,
224
bool *isma_compliant,
225
uint8_t *audioProfile,
226
uint8_t **audioConfig,
227
uint32_t *audioConfigLen,
228
uint8_t *mp4_audio_type);
230
void create_base_mp4_audio_hint_track(CAudioProfile *pConfig,
231
MP4FileHandle mp4file,
236
bool get_base_audio_rtp_info (CAudioProfile *pConfig,
237
MediaType *audioFrameType,
238
uint32_t *audioTimeScale,
239
uint8_t *audioPayloadNumber,
240
uint8_t *audioPayloadBytesPerPacket,
241
uint8_t *audioPayloadBytesPerFrame,
242
uint8_t *audioQueueMaxCount,
243
uint8_t *audioiovMaxCount,
244
audio_queue_frame_f * audio_queue_frame,
245
audio_set_rtp_payload_f *audio_set_rtp_payload,
246
audio_set_rtp_header_f *audio_set_header,
247
audio_set_rtp_jumbo_frame_f *audio_set_jumbo_frame,
250
typedef uint32_t *(*bitrates_for_samplerate_f)(uint32_t samplerate, uint8_t chans, uint32_t *ret_size);
252
typedef struct audio_encoder_table_t {
253
char *dialog_selection_name;
255
char *audio_encoding;
256
const uint32_t *sample_rates;
257
uint32_t num_sample_rates;
258
bitrates_for_samplerate_f bitrates_for_samplerate;
259
uint32_t max_channels;
260
get_gui_options_list_f get_gui_options;
261
} audio_encoder_table_t;
263
void InitAudioEncoders(void);
265
void AddAudioEncoderTable(audio_encoder_table_t *new_table);
267
extern audio_encoder_table_t **audio_encoder_table;
268
extern uint32_t audio_encoder_table_size;
269
extern const uint32_t allSampleRateTable[13];
270
extern const uint32_t allSampleRateTableSize;
272
#endif /* __AUDIO_ENCODER_H__ */