mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	resample: fix start position of new samples
When we finished processing the history it might be possible that we need to skip some samples from the input. Implement this by adding a start offset for the samples in the buffer.
This commit is contained in:
		
							parent
							
								
									0a26c478f7
								
							
						
					
					
						commit
						761119f640
					
				
					 2 changed files with 19 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -29,8 +29,8 @@
 | 
			
		|||
#include "resample.h"
 | 
			
		||||
 | 
			
		||||
typedef void (*resample_func_t)(struct resample *r,
 | 
			
		||||
        const void * SPA_RESTRICT src[], uint32_t *in_len,
 | 
			
		||||
        void * SPA_RESTRICT dst[], uint32_t offs, uint32_t *out_len);
 | 
			
		||||
        const void * SPA_RESTRICT src[], uint32_t ioffs, uint32_t *in_len,
 | 
			
		||||
        void * SPA_RESTRICT dst[], uint32_t ooffs, uint32_t *out_len);
 | 
			
		||||
 | 
			
		||||
struct native_data {
 | 
			
		||||
	double rate;
 | 
			
		||||
| 
						 | 
				
			
			@ -52,8 +52,8 @@ struct native_data {
 | 
			
		|||
 | 
			
		||||
#define DEFINE_RESAMPLER(type,arch)						\
 | 
			
		||||
void do_resample_##type##_##arch(struct resample *r,				\
 | 
			
		||||
	const void * SPA_RESTRICT src[], uint32_t *in_len,			\
 | 
			
		||||
	void * SPA_RESTRICT dst[], uint32_t offs, uint32_t *out_len)
 | 
			
		||||
	const void * SPA_RESTRICT src[], uint32_t ioffs, uint32_t *in_len,	\
 | 
			
		||||
	void * SPA_RESTRICT dst[], uint32_t ooffs, uint32_t *out_len)
 | 
			
		||||
 | 
			
		||||
#define MAKE_RESAMPLER_COPY(arch)						\
 | 
			
		||||
DEFINE_RESAMPLER(copy,arch)							\
 | 
			
		||||
| 
						 | 
				
			
			@ -65,21 +65,21 @@ DEFINE_RESAMPLER(copy,arch)							\
 | 
			
		|||
	if (r->channels == 0)							\
 | 
			
		||||
		return;								\
 | 
			
		||||
										\
 | 
			
		||||
	index = 0;								\
 | 
			
		||||
	if (offs < olen && index + n_taps <= ilen) {				\
 | 
			
		||||
		uint32_t to_copy = SPA_MIN(olen - offs,				\
 | 
			
		||||
	index = ioffs;								\
 | 
			
		||||
	if (ooffs < olen && index + n_taps <= ilen) {				\
 | 
			
		||||
		uint32_t to_copy = SPA_MIN(olen - ooffs,			\
 | 
			
		||||
				ilen - (index + n_taps) + 1);			\
 | 
			
		||||
		for (c = 0; c < r->channels; c++) {				\
 | 
			
		||||
			const float *s = src[c];				\
 | 
			
		||||
			float *d = dst[c];					\
 | 
			
		||||
			spa_memcpy(&d[offs], &s[index + n_taps2],		\
 | 
			
		||||
			spa_memcpy(&d[ooffs], &s[index + n_taps2],		\
 | 
			
		||||
					to_copy * sizeof(float));		\
 | 
			
		||||
		}								\
 | 
			
		||||
		index += to_copy;						\
 | 
			
		||||
		offs += to_copy;						\
 | 
			
		||||
		ooffs += to_copy;						\
 | 
			
		||||
	}									\
 | 
			
		||||
	*in_len = index;							\
 | 
			
		||||
	*out_len = offs;							\
 | 
			
		||||
	*out_len = ooffs;							\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define MAKE_RESAMPLER_FULL(arch)						\
 | 
			
		||||
| 
						 | 
				
			
			@ -90,6 +90,7 @@ DEFINE_RESAMPLER(full,arch)							\
 | 
			
		|||
	uint32_t index, phase, n_phases = data->out_rate;			\
 | 
			
		||||
	uint32_t c, o, olen = *out_len, ilen = *in_len;				\
 | 
			
		||||
	uint32_t inc = data->inc, frac = data->frac;				\
 | 
			
		||||
	static int cnt = 0;				\
 | 
			
		||||
										\
 | 
			
		||||
	if (r->channels == 0)							\
 | 
			
		||||
		return;								\
 | 
			
		||||
| 
						 | 
				
			
			@ -98,10 +99,10 @@ DEFINE_RESAMPLER(full,arch)							\
 | 
			
		|||
		const float *s = src[c];					\
 | 
			
		||||
		float *d = dst[c];						\
 | 
			
		||||
										\
 | 
			
		||||
		index = 0;							\
 | 
			
		||||
		index = ioffs;							\
 | 
			
		||||
		phase = data->phase;						\
 | 
			
		||||
										\
 | 
			
		||||
		for (o = offs; o < olen && index + n_taps <= ilen; o++) {	\
 | 
			
		||||
		for (o = ooffs; o < olen && index + n_taps <= ilen; o++) {	\
 | 
			
		||||
			const float *ip, *taps;					\
 | 
			
		||||
										\
 | 
			
		||||
			ip = &s[index];						\
 | 
			
		||||
| 
						 | 
				
			
			@ -137,10 +138,10 @@ DEFINE_RESAMPLER(inter,arch)							\
 | 
			
		|||
		const float *s = src[c];					\
 | 
			
		||||
		float *d = dst[c];						\
 | 
			
		||||
										\
 | 
			
		||||
		index = 0;							\
 | 
			
		||||
		index = ioffs;							\
 | 
			
		||||
		phase = data->phase;						\
 | 
			
		||||
										\
 | 
			
		||||
		for (o = offs; o < olen && index + n_taps <= ilen; o++) {	\
 | 
			
		||||
		for (o = ooffs; o < olen && index + n_taps <= ilen; o++) {	\
 | 
			
		||||
			const float *ip, *t0, *t1;				\
 | 
			
		||||
			float ph, x;						\
 | 
			
		||||
			uint32_t offset;					\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -184,7 +184,7 @@ static void impl_native_process(struct resample *r,
 | 
			
		|||
		 * and we try to process it */
 | 
			
		||||
		in = hist + refill;
 | 
			
		||||
		out = *out_len;
 | 
			
		||||
		data->func(r, (const void**)history, &in, dst, 0, &out);
 | 
			
		||||
		data->func(r, (const void**)history, 0, &in, dst, 0, &out);
 | 
			
		||||
		spa_log_trace_fp(r->log, "native %p: in:%d/%d out %d/%d hist:%d",
 | 
			
		||||
				r, hist + refill, in, *out_len, out, hist);
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -192,10 +192,11 @@ static void impl_native_process(struct resample *r,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if (in >= hist) {
 | 
			
		||||
		int skip = in - hist;
 | 
			
		||||
		/* we are past the history and can now work on the new
 | 
			
		||||
		 * input data */
 | 
			
		||||
		in = *in_len;
 | 
			
		||||
		data->func(r, src, &in, dst, out, out_len);
 | 
			
		||||
		in = *in_len - skip;
 | 
			
		||||
		data->func(r, src, skip, &in, dst, out, out_len);
 | 
			
		||||
		spa_log_trace_fp(r->log, "native %p: in:%d/%d out %d/%d",
 | 
			
		||||
				r, *in_len, in, *out_len, out);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue