| /* $Id$ */ |
| /* |
| * 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_RESAMPLE_H__ |
| #define __PJMEDIA_RESAMPLE_H__ |
| |
| |
| |
| /** |
| * @file resample.h |
| * @brief Sample rate converter. |
| */ |
| #include <pjmedia/types.h> |
| #include <pjmedia/port.h> |
| |
| /** |
| * @defgroup PJMEDIA_RESAMPLE Resampling Algorithm |
| * @ingroup PJMEDIA_FRAME_OP |
| * @brief Sample rate conversion algorithm |
| * @{ |
| * |
| * This section describes the base resampling functions. In addition to this, |
| * application can use the @ref PJMEDIA_RESAMPLE_PORT which provides |
| * media port abstraction for the base resampling algorithm. |
| */ |
| |
| PJ_BEGIN_DECL |
| |
| /* |
| * This file declares two types of API: |
| * |
| * Application can use #pjmedia_resample_create() and #pjmedia_resample_run() |
| * to convert a frame from source rate to destination rate. The inpuit frame |
| * must have a constant length. |
| * |
| * Alternatively, application can create a resampling port with |
| * #pjmedia_resample_port_create() and connect the port to other ports to |
| * change the sampling rate of the samples. |
| */ |
| |
| |
| /** |
| * Opaque resample session. |
| */ |
| typedef struct pjmedia_resample pjmedia_resample; |
| |
| /** |
| * Create a frame based resample session. |
| * |
| * @param pool Pool to allocate the structure and buffers. |
| * @param high_quality If true, then high quality conversion will be |
| * used, at the expense of more CPU and memory, |
| * because temporary buffer needs to be created. |
| * @param large_filter If true, large filter size will be used. |
| * @param channel_count Number of channels. |
| * @param rate_in Clock rate of the input samples. |
| * @param rate_out Clock rate of the output samples. |
| * @param samples_per_frame Number of samples per frame in the input. |
| * @param p_resample Pointer to receive the resample session. |
| * |
| * @return PJ_SUCCESS on success. |
| */ |
| PJ_DECL(pj_status_t) pjmedia_resample_create(pj_pool_t *pool, |
| pj_bool_t high_quality, |
| pj_bool_t large_filter, |
| unsigned channel_count, |
| unsigned rate_in, |
| unsigned rate_out, |
| unsigned samples_per_frame, |
| pjmedia_resample **p_resample); |
| |
| |
| /** |
| * Use the resample session to resample a frame. The frame must have the |
| * same size and settings as the resample session, or otherwise the |
| * behavior is undefined. |
| * |
| * @param resample The resample session. |
| * @param input Buffer containing the input samples. |
| * @param output Buffer to store the output samples. |
| */ |
| PJ_DECL(void) pjmedia_resample_run( pjmedia_resample *resample, |
| const pj_int16_t *input, |
| pj_int16_t *output ); |
| |
| |
| /** |
| * Get the input frame size of a resample session. |
| * |
| * @param resample The resample session. |
| * |
| * @return The frame size, in number of samples. |
| */ |
| PJ_DECL(unsigned) pjmedia_resample_get_input_size(pjmedia_resample *resample); |
| |
| |
| /** |
| * Destroy the resample. |
| * |
| * @param resample The resample session. |
| */ |
| PJ_DECL(void) pjmedia_resample_destroy(pjmedia_resample *resample); |
| |
| /** |
| * @} |
| */ |
| |
| /** |
| * @defgroup PJMEDIA_RESAMPLE_PORT Resample Port |
| * @ingroup PJMEDIA_PORT |
| * @brief Audio sample rate conversion |
| * @{ |
| * |
| * This section describes media port abstraction for @ref PJMEDIA_RESAMPLE. |
| */ |
| |
| |
| /** |
| * Option flags that can be specified when creating resample port. |
| */ |
| enum pjmedia_resample_port_options |
| { |
| /** |
| * Do not use high quality resampling algorithm, but use linear |
| * algorithm instead. |
| */ |
| PJMEDIA_RESAMPLE_USE_LINEAR = 1, |
| |
| /** |
| * Use small filter workspace when high quality resampling is |
| * used. |
| */ |
| PJMEDIA_RESAMPLE_USE_SMALL_FILTER = 2, |
| |
| /** |
| * Do not destroy downstream port when resample port is destroyed. |
| */ |
| PJMEDIA_RESAMPLE_DONT_DESTROY_DN = 4 |
| }; |
| |
| |
| |
| /** |
| * Create a resample port. This creates a bidirectional resample session, |
| * which will resample frames when the port's get_frame() and put_frame() |
| * is called. |
| * |
| * When the resample port's get_frame() is called, this port will get |
| * a frame from the downstream port and resample the frame to the target |
| * clock rate before returning it to the caller. |
| * |
| * When the resample port's put_frame() is called, this port will resample |
| * the frame to the downstream port's clock rate before giving the frame |
| * to the downstream port. |
| * |
| * @param pool Pool to allocate the structure and buffers. |
| * @param dn_port The downstream port, which clock rate is to |
| * be converted to the target clock rate. |
| * @param clock_rate Target clock rate. |
| * @param options Flags from #pjmedia_resample_port_options. |
| * When this flag is zero, the default behavior |
| * is to use high quality resampling with |
| * large filter, and to destroy downstream port |
| * when resample port is destroyed. |
| * @param p_port Pointer to receive the resample port instance. |
| * |
| * @return PJ_SUCCESS on success. |
| */ |
| PJ_DECL(pj_status_t) pjmedia_resample_port_create( pj_pool_t *pool, |
| pjmedia_port *dn_port, |
| unsigned clock_rate, |
| unsigned options, |
| pjmedia_port **p_port ); |
| |
| |
| PJ_END_DECL |
| |
| /** |
| * @} |
| */ |
| |
| |
| #endif /* __PJMEDIA_RESAMPLE_H__ */ |
| |