# HG changeset patch # User pross # Date 1217598798 0 # Node ID 283eeda6218400ff677678716c6dfc7a79153b5b # Parent eb63aa50bf85666875c60b91e0c9d6c67f779398 Modify av_audio_convert() to use AVAudioConvert context struct; add av_audio_convert_alloc() and av_audio_convert_free() support functions. diff -r eb63aa50bf85 -r 283eeda62184 audioconvert.c --- a/audioconvert.c Fri Aug 01 11:26:22 2008 +0000 +++ b/audioconvert.c Fri Aug 01 13:53:18 2008 +0000 @@ -70,27 +70,51 @@ } } -int av_audio_convert(void *maybe_dspcontext_or_something_av_convert_specific, - void *out[6], int out_stride[6], enum SampleFormat out_fmt, - void * in[6], int in_stride[6], enum SampleFormat in_fmt, int len){ +struct AVAudioConvert { + int in_channels, out_channels; + int fmt_pair; +}; + +AVAudioConvert *av_audio_convert_alloc(enum SampleFormat out_fmt, int out_channels, + enum SampleFormat in_fmt, int in_channels, + const const float *matrix, int flags) +{ + AVAudioConvert *ctx; + if (in_channels!=out_channels) + return NULL; /* FIXME: not supported */ + ctx = av_malloc(sizeof(AVAudioConvert)); + if (!ctx) + return NULL; + ctx->in_channels = in_channels; + ctx->out_channels = out_channels; + ctx->fmt_pair = out_fmt + SAMPLE_FMT_NB*in_fmt; + return ctx; +} + +void av_audio_convert_free(AVAudioConvert *ctx) +{ + av_free(ctx); +} + +int av_audio_convert(AVAudioConvert *ctx, + void * const out[6], const int out_stride[6], + const void * const in[6], const int in_stride[6], int len) +{ int ch; - const int isize= FFMIN( in_fmt+1, 4); - const int osize= FFMIN(out_fmt+1, 4); - const int fmt_pair= out_fmt + 5*in_fmt; //FIXME optimize common cases - for(ch=0; ch<6; ch++){ - const int is= in_stride[ch] * isize; - const int os= out_stride[ch] * osize; + for(ch=0; chout_channels; ch++){ + const int is= in_stride[ch]; + const int os= out_stride[ch]; uint8_t *pi= in[ch]; uint8_t *po= out[ch]; - uint8_t *end= po + os; + uint8_t *end= po + os*len; if(!out[ch]) continue; #define CONV(ofmt, otype, ifmt, expr)\ -if(fmt_pair == ofmt + 5*ifmt){\ +if(ctx->fmt_pair == ofmt + SAMPLE_FMT_NB*ifmt){\ do{\ *(otype*)po = expr; pi += is; po += os;\ }while(po < end);\ diff -r eb63aa50bf85 -r 283eeda62184 audioconvert.h --- a/audioconvert.h Fri Aug 01 11:26:22 2008 +0000 +++ b/audioconvert.h Fri Aug 01 13:53:18 2008 +0000 @@ -54,4 +54,38 @@ */ enum SampleFormat avcodec_get_sample_fmt(const char* name); +struct AVAudioConvert; +typedef struct AVAudioConvert AVAudioConvert; + +/** + * Create an audio sample format converter context + * @param out_fmt Output sample format + * @param out_channels Number of output channels + * @param in_fmt Input sample format + * @param in_channels Number of input channels + * @param[in] matrix Channel mixing matrix (of dimension in_channel*out_channels). Set to NULL to ignore. + * @param flags See FF_MM_xx + * @return NULL on error + */ +AVAudioConvert *av_audio_convert_alloc(enum SampleFormat out_fmt, int out_channels, + enum SampleFormat in_fmt, int in_channels, + const float *matrix, int flags); + +/** + * Free audio sample format converter context + */ +void av_audio_convert_free(AVAudioConvert *ctx); + +/** + * Convert between audio sample formats + * @param[in] out array of output buffers for each channel. set to NULL to ignore processing of the given channel. + * @param[in] out_stride distance between consecutive input samples (measured in bytes) + * @param[in] in array of input buffers for each channel + * @param[in] in_stride distance between consecutive output samples (measured in bytes) + * @param len length of audio frame size (measured in samples) + */ +int av_audio_convert(AVAudioConvert *ctx, + void * const out[6], const int out_stride[6], + const void * const in[6], const int in_stride[6], int len); + #endif /* FFMPEG_AUDIOCONVERT_H */