| @@ -24,50 +24,56 @@ | |||||
| #include "swresample.h" | #include "swresample.h" | ||||
| typedef struct AudioData{ | typedef struct AudioData{ | ||||
| uint8_t *ch[SWR_CH_MAX]; | |||||
| uint8_t *data; | |||||
| int ch_count; | |||||
| int bps; | |||||
| int count; | |||||
| int planar; | |||||
| uint8_t *ch[SWR_CH_MAX]; ///< samples buffer per channel | |||||
| uint8_t *data; ///< samples buffer | |||||
| int ch_count; ///< number of channels | |||||
| int bps; ///< bytes per sample | |||||
| int count; ///< number of samples | |||||
| int planar; ///< 1 if planar audio, 0 otherwise | |||||
| } AudioData; | } AudioData; | ||||
| typedef struct SwrContext { //FIXME find unused fields | |||||
| const AVClass *av_class; | |||||
| int log_level_offset; | |||||
| void *log_ctx; | |||||
| enum AVSampleFormat in_sample_fmt; | |||||
| enum AVSampleFormat int_sample_fmt; ///<AV_SAMPLE_FMT_FLT OR AV_SAMPLE_FMT_S16 | |||||
| enum AVSampleFormat out_sample_fmt; | |||||
| int64_t in_ch_layout; | |||||
| int64_t out_ch_layout; | |||||
| int in_sample_rate; | |||||
| int out_sample_rate; | |||||
| int flags; | |||||
| float slev, clev, rematrix_volume; | |||||
| const int *channel_map; ///< channel index (or -1 if muted channel) map | |||||
| int used_ch_count; ///< number of used channels (mapped channel count if channel_map, otherwise in.ch_count) | |||||
| typedef struct SwrContext { | |||||
| const AVClass *av_class; ///< AVClass used for AVOption and av_log() | |||||
| int log_level_offset; ///< logging level offset | |||||
| void *log_ctx; ///< parent logging context | |||||
| enum AVSampleFormat in_sample_fmt; ///< input sample format | |||||
| enum AVSampleFormat int_sample_fmt; ///< internal sample format (AV_SAMPLE_FMT_FLT or AV_SAMPLE_FMT_S16) | |||||
| enum AVSampleFormat out_sample_fmt; ///< output sample format | |||||
| int64_t in_ch_layout; ///< input channel layout | |||||
| int64_t out_ch_layout; ///< output channel layout | |||||
| int in_sample_rate; ///< input sample rate | |||||
| int out_sample_rate; ///< output sample rate | |||||
| int flags; ///< miscellaneous flags such as SWR_FLAG_RESAMPLE | |||||
| float slev; ///< surround mixing level, XXX: unused | |||||
| float clev; ///< center mixing level | |||||
| float rematrix_volume; ///< rematrixing volume coefficient | |||||
| const int *channel_map; ///< channel index (or -1 if muted channel) map | |||||
| int used_ch_count; ///< number of used input channels (mapped channel count if channel_map, otherwise in.ch_count) | |||||
| //below are private | |||||
| int int_bps; | |||||
| int resample_first; | |||||
| int rematrix; ///< flag to indicate if rematrixing is used | |||||
| int int_bps; ///< internal bytes per sample | |||||
| int resample_first; ///< 1 if resampling must come first, 0 if rematrixing | |||||
| int rematrix; ///< flag to indicate if rematrixing is needed (basically if input and output layouts mismatch) | |||||
| AudioData in, postin, midbuf, preout, out, in_buffer; | |||||
| int in_buffer_index; | |||||
| int in_buffer_count; | |||||
| int resample_in_constraint; | |||||
| AudioData in; ///< input audio data | |||||
| AudioData postin; ///< post-input audio data: used for rematrix/resample | |||||
| AudioData midbuf; ///< intermediate audio data (postin/preout) | |||||
| AudioData preout; ///< pre-output audio data: used for rematrix/resample | |||||
| AudioData out; ///< converted output audio data | |||||
| AudioData in_buffer; ///< cached audio data (convert and resample purpose) | |||||
| int in_buffer_index; ///< cached buffer position | |||||
| int in_buffer_count; ///< cached buffer length | |||||
| int resample_in_constraint; ///< 1 if the input end was reach before the output end, 0 otherwise | |||||
| struct AudioConvert *in_convert; | |||||
| struct AudioConvert *out_convert; | |||||
| struct AudioConvert *full_convert; | |||||
| struct ResampleContext *resample; | |||||
| struct AudioConvert *in_convert; ///< input conversion context | |||||
| struct AudioConvert *out_convert; ///< output conversion context | |||||
| struct AudioConvert *full_convert; ///< full conversion context (single conversion for input and output) | |||||
| struct ResampleContext *resample; ///< resampling context | |||||
| float matrix[SWR_CH_MAX][SWR_CH_MAX]; | float matrix[SWR_CH_MAX][SWR_CH_MAX]; | ||||
| int32_t matrix32[SWR_CH_MAX][SWR_CH_MAX]; | int32_t matrix32[SWR_CH_MAX][SWR_CH_MAX]; | ||||
| uint8_t matrix_ch[SWR_CH_MAX][SWR_CH_MAX+1]; | uint8_t matrix_ch[SWR_CH_MAX][SWR_CH_MAX+1]; | ||||
| //TODO callbacks for asm optims | |||||
| /* TODO: callbacks for ASM optimizations */ | |||||
| }SwrContext; | }SwrContext; | ||||
| struct ResampleContext *swri_resample_init(struct ResampleContext *, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, double cutoff); | struct ResampleContext *swri_resample_init(struct ResampleContext *, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, double cutoff); | ||||
| @@ -78,4 +84,5 @@ int swri_resample(struct ResampleContext *c, short *dst, const short *src, int * | |||||
| int swri_rematrix_init(SwrContext *s); | int swri_rematrix_init(SwrContext *s); | ||||
| int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy); | int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy); | ||||
| #endif | #endif | ||||