blob: c573ed496081b80f987e277e56eaf70b1d4a8f5d [file] [log] [blame]
/* $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__ */