typedef void (conv_func_type)(uint8_t *po, const uint8_t *pi, int is, int os, uint8_t *end);
-struct AVAudioConvert {
+struct AudioConvert {
int channels;
conv_func_type *conv_f;
const int *ch_map;
+ uint8_t silence[8]; ///< silence input sample
};
#define CONV_FUNC_NAME(dst_fmt, src_fmt) conv_ ## src_fmt ## _to_ ## dst_fmt
#define FMT_PAIR_FUNC(out, in) [out + AV_SAMPLE_FMT_NB*in] = CONV_FUNC_NAME(out, in)
-conv_func_type *fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB*AV_SAMPLE_FMT_NB] = {
+static conv_func_type * const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB*AV_SAMPLE_FMT_NB] = {
FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8 , AV_SAMPLE_FMT_U8 ),
FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8 ),
FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8 ),
FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL),
};
-AVAudioConvert *swr_audio_convert_alloc(enum AVSampleFormat out_fmt,
- enum AVSampleFormat in_fmt,
- int channels, const int *ch_map,
- int flags)
+AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt,
+ enum AVSampleFormat in_fmt,
+ int channels, const int *ch_map,
+ int flags)
{
- AVAudioConvert *ctx;
+ AudioConvert *ctx;
conv_func_type *f = fmt_pair_to_conv_functions[out_fmt + AV_SAMPLE_FMT_NB*in_fmt];
if (!f)
return NULL;
- ctx = av_malloc(sizeof(AVAudioConvert));
+ ctx = av_mallocz(sizeof(*ctx));
if (!ctx)
return NULL;
ctx->channels = channels;
ctx->conv_f = f;
ctx->ch_map = ch_map;
+ if (in_fmt == AV_SAMPLE_FMT_U8)
+ memset(ctx->silence, 0x80, sizeof(ctx->silence));
return ctx;
}
-void swr_audio_convert_free(AVAudioConvert **ctx)
+void swri_audio_convert_free(AudioConvert **ctx)
{
av_freep(ctx);
}
-int swr_audio_convert(AVAudioConvert *ctx, AudioData *out, AudioData*in, int len)
+int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len)
{
int ch;
- const uint8_t null_input[8] = {0};
av_assert0(ctx->channels == out->ch_count);
const int ich= ctx->ch_map ? ctx->ch_map[ch] : ch;
const int is= ich < 0 ? 0 : (in->planar ? 1 : in->ch_count) * in->bps;
const int os= (out->planar ? 1 :out->ch_count) *out->bps;
- const uint8_t *pi= ich < 0 ? null_input : in->ch[ich];
+ const uint8_t *pi= ich < 0 ? ctx->silence : in->ch[ich];
uint8_t *po= out->ch[ch];
uint8_t *end= po + os*len;
if(!po)