/usr/include/pjmedia/stereo.h is in libpjproject-dev 2.1.0.0.ast20130823-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | /* $Id: stereo.h 3553 2011-05-05 06:14:19Z nanang $ */
/*
* Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
* Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __PJMEDIA_STEREO_H__
#define __PJMEDIA_STEREO_H__
/**
* @file stereo.h
* @brief Monochannel and multichannel converter.
*/
#include <pjmedia/errno.h>
#include <pjmedia/port.h>
#include <pjmedia/types.h>
#include <pj/assert.h>
/**
* @defgroup PJMEDIA_STEREO Monochannel and multichannel audio frame converter
* @ingroup PJMEDIA_FRAME_OP
* @brief Mono - multi-channels audio conversion
* @{
*
*/
PJ_BEGIN_DECL
/**
* Multichannel to monochannel conversion mixes samples from all channels
* into the monochannel.
*/
#define PJMEDIA_STEREO_MIX PJ_TRUE
/**
* Multichannel to monochannel conversion, it has two operation mode specified
* by param options, @see pjmedia_stereo_options. This function can work safely
* using the same buffer (in place conversion).
*
* @param mono Output buffer to store the mono frame extracted
* from the multichannels frame.
* @param multi Input frame containing multichannels audio.
* @param channel_count Number of channels in the input frame.
* @param samples_per_frame Number of samples in the input frame.
* @param mix If the value is PJ_TRUE then the input channels
* will be mixed to produce output frame, otherwise
* only frame from channel_src will be copied to the
* output frame.
* @param channel_src When mixing is disabled, the mono output frame
* will be copied from this channel number.
*
* @return PJ_SUCCESS on success;
*/
PJ_INLINE(pj_status_t) pjmedia_convert_channel_nto1(pj_int16_t mono[],
const pj_int16_t multi[],
unsigned channel_count,
unsigned samples_per_frame,
pj_bool_t mix,
unsigned channel_src)
{
unsigned i;
PJ_ASSERT_RETURN(mono && multi && channel_count && samples_per_frame &&
channel_src < channel_count, PJ_EINVAL);
if (mix==PJ_FALSE) {
for (i = channel_src; i < samples_per_frame; i += channel_count) {
*mono = multi[i];
++mono;
}
} else {
unsigned j;
for (i = 0; i < samples_per_frame; i += channel_count) {
int tmp = 0;
for(j = 0; j < channel_count; ++j)
tmp += multi[i+j];
if (tmp > 32767) tmp = 32767;
else if (tmp < -32768) tmp = -32768;
*mono = (pj_int16_t) tmp;
++mono;
}
}
return PJ_SUCCESS;
}
/**
* Monochannel to multichannel conversion, it will just duplicate the samples
* from monochannel frame to all channels in the multichannel frame.
* This function can work safely using the same buffer (in place conversion)
* as long as the buffer is big enough for the multichannel samples.
*
* @param multi Output buffer to store the multichannels frame
* mixed from the mono frame.
* @param mono The input monochannel audio frame.
* @param channel_count Desired number of channels in the output frame.
* @param samples_per_frame Number of samples in the input frame.
* @param options Options for conversion, currently must be zero.
*
* @return PJ_SUCCESS on success;
*/
PJ_INLINE(pj_status_t) pjmedia_convert_channel_1ton(pj_int16_t multi[],
const pj_int16_t mono[],
unsigned channel_count,
unsigned samples_per_frame,
unsigned options)
{
const pj_int16_t *src;
PJ_ASSERT_RETURN(mono && multi && channel_count && samples_per_frame,
PJ_EINVAL);
PJ_ASSERT_RETURN(options == 0, PJ_EINVAL);
PJ_UNUSED_ARG(options);
src = mono + samples_per_frame - 1;
samples_per_frame *= channel_count;
while (samples_per_frame) {
unsigned i;
for (i=1; i<=channel_count; ++i)
multi[samples_per_frame-i] = *src;
samples_per_frame -= channel_count;
--src;
}
return PJ_SUCCESS;
}
/**
* Options for channel converter port. The #pjmedia_stereo_options is also
* valid for this port options.
*/
typedef enum pjmedia_stereo_port_options
{
/**
* Specifies whether this port should not destroy downstream port when
* this port is destroyed.
*/
PJMEDIA_STEREO_DONT_DESTROY_DN = 4
} pjmedia_stereo_port_options;
/**
* Create a mono-multi channel converter port. This creates a converter session,
* which will adjust the samples of audio frame to a different channel count
* when the port's get_frame() and put_frame() is called.
*
* When the port's get_frame() is called, this port will get a frame from
* the downstream port and convert the frame to the target channel count before
* returning it to the caller.
*
* When the port's put_frame() is called, this port will convert the frame
* to the downstream port's channel count before giving the frame to the
* downstream port.
*
* @param pool Pool to allocate the structure and buffers.
* @param dn_port The downstream port, which channel count is to
* be converted to the target channel count.
* @param channel_count This port channel count.
* @param options Bitmask flags from #pjmedia_stereo_port_options
* and also application may add PJMEDIA_STEREO_MIX
* to mix channels.
* When this flag is zero, the default behavior
* is to use simple N-to-1 channel converter and
* to destroy downstream port when this port is
* destroyed.
* @param p_port Pointer to receive the stereo port instance.
*
* @return PJ_SUCCESS on success.
*/
PJ_DECL(pj_status_t) pjmedia_stereo_port_create( pj_pool_t *pool,
pjmedia_port *dn_port,
unsigned channel_count,
unsigned options,
pjmedia_port **p_port );
PJ_END_DECL
/**
* @}
*/
#endif /* __PJMEDIA_STEREO_H__ */
|