summaryrefslogtreecommitdiffstats
path: root/audio/filter
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-11-10 23:11:40 +0100
committerwm4 <wm4@nowhere>2013-11-12 23:16:31 +0100
commitd2e7467eb203d3a34bc1111564c7058b5e9c6b12 (patch)
tree9285523821c8710a0609f47e3ee923a20d038826 /audio/filter
parentb2d4b5ee43206f8c4491b3af1c24fedd35dbdc31 (diff)
downloadmpv-d2e7467eb203d3a34bc1111564c7058b5e9c6b12.tar.bz2
mpv-d2e7467eb203d3a34bc1111564c7058b5e9c6b12.tar.xz
audio/filter: prepare filter chain for non-interleaved audio
Based on earlier work by Stefano Pigozzi. There are 2 changes: 1. Instead of mp_audio.audio, mp_audio.planes[0] must be used. 2. mp_audio.len used to contain the size of the audio in bytes. Now mp_audio.samples must be used. (Where 1 sample is the smallest unit of audio that covers all channels.) Also, some filters need changes to reject non-interleaved formats properly. Nothing uses the non-interleaved features yet, but this is needed so that things don't just break when doing so.
Diffstat (limited to 'audio/filter')
-rw-r--r--audio/filter/af.c46
-rw-r--r--audio/filter/af_bs2b.c2
-rw-r--r--audio/filter/af_center.c4
-rw-r--r--audio/filter/af_channels.c16
-rw-r--r--audio/filter/af_convert24.c15
-rw-r--r--audio/filter/af_convertsignendian.c9
-rw-r--r--audio/filter/af_delay.c9
-rw-r--r--audio/filter/af_drc.c17
-rw-r--r--audio/filter/af_equalizer.c6
-rw-r--r--audio/filter/af_export.c4
-rw-r--r--audio/filter/af_extrastereo.c9
-rw-r--r--audio/filter/af_format.c5
-rw-r--r--audio/filter/af_hrtf.c11
-rw-r--r--audio/filter/af_karaoke.c4
-rw-r--r--audio/filter/af_ladspa.c12
-rw-r--r--audio/filter/af_lavcac3enc.c30
-rw-r--r--audio/filter/af_lavfi.c17
-rw-r--r--audio/filter/af_lavrresample.c32
-rw-r--r--audio/filter/af_pan.c11
-rw-r--r--audio/filter/af_scaletempo.c27
-rw-r--r--audio/filter/af_sinesuppress.c4
-rw-r--r--audio/filter/af_sub.c4
-rw-r--r--audio/filter/af_surround.c11
-rw-r--r--audio/filter/af_sweep.c4
-rw-r--r--audio/filter/af_volume.c9
25 files changed, 163 insertions, 155 deletions
diff --git a/audio/filter/af.c b/audio/filter/af.c
index edee4bef65..95d0e43673 100644
--- a/audio/filter/af.c
+++ b/audio/filter/af.c
@@ -523,8 +523,7 @@ static int af_reinit(struct af_stream *s)
// Check if this is the first filter
struct mp_audio in = *af->prev->data;
// Reset just in case...
- in.audio = NULL;
- in.len = 0;
+ mp_audio_set_null_data(&in);
int rv = af->control(af, AF_CONTROL_REINIT, &in);
if (rv == AF_OK && !mp_audio_config_equals(&in, af->prev->data))
@@ -640,8 +639,8 @@ int af_init(struct af_stream *s)
return -1;
// Precaution in case caller is misbehaving
- s->input.audio = s->output.audio = NULL;
- s->input.len = s->output.len = 0;
+ mp_audio_set_null_data(&s->input);
+ mp_audio_set_null_data(&s->output);
// Check if this is the first call
if (s->first->next == s->last) {
@@ -731,36 +730,39 @@ double af_calc_delay(struct af_stream *s)
return delay;
}
-/* Calculate the minimum output buffer size for given input data d
- * when using the af_resize_local_buffer function. The +t+1 part ensures the
- * value is >= len*mul rounded upwards to whole samples even if the
- * double 'mul' is inexact. */
-static int af_lencalc(double mul, struct mp_audio *d)
-{
- int t = d->bps * d->nch;
- return d->len * mul + t + 1;
-}
-
/* I a local buffer is used (i.e. if the filter doesn't operate on the incoming
* buffer), this macro must be called to ensure the buffer is big enough. */
int af_resize_local_buffer(struct af_instance *af, struct mp_audio *data)
{
- if (af->data->len >= af_lencalc(af->mul, data))
+ assert(data->format);
+
+ if (!af->data->format && !af->data->planes[0]) {
+ // Dummy initialization
+ mp_audio_set_format(af->data, AF_FORMAT_U8);
+ }
+
+ int oldlen = af->data->samples * af->data->sstride;
+
+ /* Calculate the minimum output buffer size for given input data d
+ * when using the af_resize_local_buffer function. The +x part ensures
+ * the value is >= len*mul rounded upwards to whole samples even if the
+ * double 'mul' is inexact. */
+ int newlen = data->samples * data->sstride * af->mul + data->sstride + 1;
+
+ if (oldlen >= newlen)
return AF_OK;
- // Calculate new length
- register int len = af_lencalc(af->mul, data);
mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Reallocating memory in module %s, "
- "old len = %i, new len = %i\n", af->info->name, af->data->len, len);
+ "old len = %i, new len = %i\n", af->info->name, oldlen, newlen);
// If there is a buffer free it
- free(af->data->audio);
+ free(af->data->planes[0]);
// Create new buffer and check that it is OK
- af->data->audio = malloc(len);
- if (!af->data->audio) {
+ af->data->planes[0] = malloc(newlen);
+ if (!af->data->planes[0]) {
mp_msg(MSGT_AFILTER, MSGL_FATAL, "[libaf] Could not allocate memory \n");
return AF_ERROR;
}
- af->data->len = len;
+ af->data->samples = newlen / af->data->sstride;
return AF_OK;
}
diff --git a/audio/filter/af_bs2b.c b/audio/filter/af_bs2b.c
index 0e77b3e4eb..5e0caf28af 100644
--- a/audio/filter/af_bs2b.c
+++ b/audio/filter/af_bs2b.c
@@ -42,7 +42,7 @@ static struct mp_audio *play_##name(struct af_instance *af, struct mp_audio *dat
{ \
/* filter is called for all pairs of samples available in the buffer */ \
bs2b_cross_feed_##name(((struct af_bs2b*)(af->priv))->filter, \
- (type*)(data->audio), data->len/data->bps/2); \
+ (type*)(data->planes[0]), data->samples); \
\
return data; \
}
diff --git a/audio/filter/af_center.c b/audio/filter/af_center.c
index 0cfdbc3b0e..c64c551f1c 100644
--- a/audio/filter/af_center.c
+++ b/audio/filter/af_center.c
@@ -87,9 +87,9 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data)
{
struct mp_audio* c = data; // Current working data
af_center_t* s = af->setup; // Setup for this instance
- float* a = c->audio; // Audio data
- int len = c->len/4; // Number of samples in current audio block
+ float* a = c->planes[0]; // Audio data
int nch = c->nch; // Number of channels
+ int len = c->samples*c->nch; // Number of samples in current audio block
int ch = s->ch; // Channel in which to insert the center audio
register int i;
diff --git a/audio/filter/af_channels.c b/audio/filter/af_channels.c
index 27445aafe2..fd3b8262f5 100644
--- a/audio/filter/af_channels.c
+++ b/audio/filter/af_channels.c
@@ -169,6 +169,10 @@ static int control(struct af_instance* af, int cmd, void* arg)
af->data->rate = ((struct mp_audio*)arg)->rate;
mp_audio_set_format(af->data, ((struct mp_audio*)arg)->format);
af->mul = (double)af->data->nch / ((struct mp_audio*)arg)->nch;
+ mp_audio_force_interleaved_format(af->data);
+ int r = af_test_output(af,(struct mp_audio*)arg);
+ if (r != AF_OK)
+ return r;
return check_routes(s,((struct mp_audio*)arg)->nch,af->data->nch);
case AF_CONTROL_COMMAND_LINE:{
int nch = 0;
@@ -219,7 +223,7 @@ static void uninit(struct af_instance* af)
{
free(af->setup);
if (af->data)
- free(af->data->audio);
+ free(af->data->planes[0]);
free(af->data);
}
@@ -235,16 +239,16 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data)
return NULL;
// Reset unused channels
- memset(l->audio,0,c->len / c->nch * l->nch);
+ memset(l->planes[0],0,mp_audio_psize(c) / c->nch * l->nch);
if(AF_OK == check_routes(s,c->nch,l->nch))
for(i=0;i<s->nr;i++)
- copy(c->audio,l->audio,c->nch,s->route[i][FR],
- l->nch,s->route[i][TO],c->len,c->bps);
+ copy(c->planes[0],l->planes[0],c->nch,s->route[i][FR],
+ l->nch,s->route[i][TO],mp_audio_psize(c),c->bps);
// Set output data
- c->audio = l->audio;
- c->len = c->len / c->nch * l->nch;
+ c->planes[0] = l->planes[0];
+ c->samples = c->samples / c->nch * l->nch;
mp_audio_set_channels(c, &l->channels);
return c;
diff --git a/audio/filter/af_convert24.c b/audio/filter/af_convert24.c
index 18ce156467..96924de344 100644
--- a/audio/filter/af_convert24.c
+++ b/audio/filter/af_convert24.c
@@ -78,12 +78,12 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
return NULL;
struct mp_audio *out = af->data;
- size_t len = data->len / data->bps;
+ size_t len = mp_audio_psize(data) / data->bps;
if (data->bps == 4) {
for (int s = 0; s < len; s++) {
- uint32_t val = *((uint32_t *)data->audio + s);
- uint8_t *ptr = (uint8_t *)out->audio + s * 3;
+ uint32_t val = *((uint32_t *)data->planes[0] + s);
+ uint8_t *ptr = (uint8_t *)out->planes[0] + s * 3;
ptr[0] = val >> SHIFT(0);
ptr[1] = val >> SHIFT(1);
ptr[2] = val >> SHIFT(2);
@@ -91,24 +91,23 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
mp_audio_set_format(data, af_fmt_change_bits(data->format, 24));
} else {
for (int s = 0; s < len; s++) {
- uint8_t *ptr = (uint8_t *)data->audio + s * 3;
+ uint8_t *ptr = (uint8_t *)data->planes[0] + s * 3;
uint32_t val = ptr[0] << SHIFT(0)
| ptr[1] << SHIFT(1)
| ptr[2] << SHIFT(2);
- *((uint32_t *)out->audio + s) = val;
+ *((uint32_t *)out->planes[0] + s) = val;
}
mp_audio_set_format(data, af_fmt_change_bits(data->format, 32));
}
- data->audio = out->audio;
- data->len = len * data->bps;
+ data->planes[0] = out->planes[0];
return data;
}
static void uninit(struct af_instance* af)
{
if (af->data)
- free(af->data->audio);
+ free(af->data->planes[0]);
}
static int af_open(struct af_instance *af)
diff --git a/audio/filter/af_convertsignendian.c b/audio/filter/af_convertsignendian.c
index bfea004bb2..5565438aad 100644
--- a/audio/filter/af_convertsignendian.c
+++ b/audio/filter/af_convertsignendian.c
@@ -24,6 +24,9 @@
static bool test_conversion(int src_format, int dst_format)
{
+ if ((src_format & AF_FORMAT_PLANAR) ||
+ (dst_format & AF_FORMAT_PLANAR))
+ return false;
int src_noend = src_format & ~AF_FORMAT_END_MASK;
int dst_noend = dst_format & ~AF_FORMAT_END_MASK;
// We can swap endian for all formats, but sign only for integer formats.
@@ -100,13 +103,13 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
{
int infmt = data->format;
int outfmt = af->data->format;
- size_t len = data->len / data->bps;
+ size_t len = data->samples * data->nch;
if ((infmt & AF_FORMAT_END_MASK) != (outfmt & AF_FORMAT_END_MASK))
- endian(data->audio, len, data->bps);
+ endian(data->planes[0], len, data->bps);
if ((infmt & AF_FORMAT_SIGN_MASK) != (outfmt & AF_FORMAT_SIGN_MASK))
- si2us(data->audio, len, data->bps,
+ si2us(data->planes[0], len, data->bps,
(outfmt & AF_FORMAT_END_MASK) == AF_FORMAT_LE);
mp_audio_set_format(data, outfmt);
diff --git a/audio/filter/af_delay.c b/audio/filter/af_delay.c
index a6515f84cf..c979060fe3 100644
--- a/audio/filter/af_delay.c
+++ b/audio/filter/af_delay.c
@@ -56,6 +56,7 @@ static int control(struct af_instance* af, int cmd, void* arg)
free(s->q[i]);
mp_audio_copy_config(af->data, (struct mp_audio*)arg);
+ mp_audio_force_interleaved_format(af->data);
// Allocate new delay queues
for(i=0;i<af->data->nch;i++){
@@ -123,13 +124,13 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data)
struct mp_audio* c = data; // Current working data
af_delay_t* s = af->setup; // Setup for this instance
int nch = c->nch; // Number of channels
- int len = c->len/c->bps; // Number of sample in data chunk
+ int len = mp_audio_psize(c)/c->bps; // Number of sample in data chunk
int ri = 0;
int ch,i;
for(ch=0;ch<nch;ch++){
switch(c->bps){
case 1:{
- int8_t* a = c->audio;
+ int8_t* a = c->planes[0];
int8_t* q = s->q[ch];
int wi = s->wi[ch];
ri = s->ri;
@@ -143,7 +144,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data)
break;
}
case 2:{
- int16_t* a = c->audio;
+ int16_t* a = c->planes[0];
int16_t* q = s->q[ch];
int wi = s->wi[ch];
ri = s->ri;
@@ -157,7 +158,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data)
break;
}
case 4:{
- int32_t* a = c->audio;
+ int32_t* a = c->planes[0];
int32_t* q = s->q[ch];
int wi = s->wi[ch];
ri = s->ri;
diff --git a/audio/filter/af_drc.c b/audio/filter/af_drc.c
index 9bbbde4831..589844d89b 100644
--- a/audio/filter/af_drc.c
+++ b/audio/filter/af_drc.c
@@ -88,6 +88,7 @@ static int control(struct af_instance* af, int cmd, void* arg)
// Sanity check
if(!arg) return AF_ERROR;
+ mp_audio_force_interleaved_format((struct mp_audio*)arg);
mp_audio_copy_config(af->data, (struct mp_audio*)arg);
if(((struct mp_audio*)arg)->format != (AF_FORMAT_S16_NE)){
@@ -119,8 +120,8 @@ static void uninit(struct af_instance* af)
static void method1_int16(af_drc_t *s, struct mp_audio *c)
{
register int i = 0;
- int16_t *data = (int16_t*)c->audio; // Audio data
- int len = c->len/2; // Number of samples
+ int16_t *data = (int16_t*)c->planes[0]; // Audio data
+ int len = c->samples*c->nch; // Number of samples
float curavg = 0.0, newavg, neededmul;
int tmp;
@@ -161,8 +162,8 @@ static void method1_int16(af_drc_t *s, struct mp_audio *c)
static void method1_float(af_drc_t *s, struct mp_audio *c)
{
register int i = 0;
- float *data = (float*)c->audio; // Audio data
- int len = c->len/4; // Number of samples
+ float *data = (float*)c->planes[0]; // Audio data
+ int len = c->samples*c->nch; // Number of samples
float curavg = 0.0, newavg, neededmul, tmp;
for (i = 0; i < len; i++)
@@ -198,8 +199,8 @@ static void method1_float(af_drc_t *s, struct mp_audio *c)
static void method2_int16(af_drc_t *s, struct mp_audio *c)
{
register int i = 0;
- int16_t *data = (int16_t*)c->audio; // Audio data
- int len = c->len/2; // Number of samples
+ int16_t *data = (int16_t*)c->planes[0]; // Audio data
+ int len = c->samples*c->nch; // Number of samples
float curavg = 0.0, newavg, avg = 0.0;
int tmp, totallen = 0;
@@ -248,8 +249,8 @@ static void method2_int16(af_drc_t *s, struct mp_audio *c)
static void method2_float(af_drc_t *s, struct mp_audio *c)
{
register int i = 0;
- float *data = (float*)c->audio; // Audio data
- int len = c->len/4; // Number of samples
+ float *data = (float*)c->planes[0]; // Audio data
+ int len = c->samples*c->nch; // Number of samples
float curavg = 0.0, newavg, avg = 0.0, tmp;
int totallen = 0;
diff --git a/audio/filter/af_equalizer.c b/audio/filter/af_equalizer.c
index cbdcd3f84a..718445c001 100644
--- a/audio/filter/af_equalizer.c
+++ b/audio/filter/af_equalizer.c
@@ -170,9 +170,9 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* data)
while(ci--){
float* g = s->g[ci]; // Gain factor
- float* in = ((float*)c->audio)+ci;
- float* out = ((float*)c->audio)+ci;
- float* end = in + c->len/4; // Block loop end
+ float* in = ((float*)c->planes[0])+ci;
+ float* out = ((float*)c->planes[0])+ci;
+ float* end = in + c->samples*c->nch; // Block loop end
while(in < end){
register int k = 0; // Frequency band index
diff --git a/audio/filter/af_export.c b/audio/filter/af_export.c
index 45143075a1..a6ebdc322e 100644
--- a/audio/filter/af_export.c
+++ b/audio/filter/af_export.c
@@ -213,9 +213,9 @@ static struct mp_audio* play( struct af_instance* af, struct mp_audio* data )
{
struct mp_audio* c = data; // Current working data
af_export_t* s = af->setup; // Setup for this instance
- int16_t* a = c->audio; // Incomming sound
+ int16_t* a = c->planes[0]; // Incomming sound
int nch = c->nch; // Number of channels
- int len = c->len/c->bps; // Number of sample in data chunk
+ int len = c->samples*c->nch; // Number of sample in data chunk
int sz = s->sz; // buffer size (in samples)
int flag = 0; // Set to 1 if buffer is filled
diff --git a/audio/filter/af_extrastereo.c b/audio/filter/af_extrastereo.c
index 4cf27f2724..5b3792763b 100644
--- a/audio/filter/af_extrastereo.c
+++ b/audio/filter/af_extrastereo.c
@@ -49,6 +49,7 @@ static int control(struct af_instance* af, int cmd, void* arg)
if(!arg) return AF_ERROR;
mp_audio_copy_config(af->data, (struct mp_audio*)arg);
+ mp_audio_force_interleaved_format(af->data);
mp_audio_set_num_channels(af->data, 2);
if (af->data->format == AF_FORMAT_FLOAT_NE)
{
@@ -83,8 +84,8 @@ static struct mp_audio* play_s16(struct af_instance* af, struct mp_audio* data)
{
af_extrastereo_t *s = af->setup;
register int i = 0;
- int16_t *a = (int16_t*)data->audio; // Audio data
- int len = data->len/2; // Number of samples
+ int16_t *a = (int16_t*)data->planes[0]; // Audio data
+ int len = data->samples*data->nch; // Number of samples
int avg, l, r;
for (i = 0; i < len; i+=2)
@@ -105,8 +106,8 @@ static struct mp_audio* play_float(struct af_instance* af, struct mp_audio* data
{
af_extrastereo_t *s = af->setup;
register int i = 0;
- float *a = (float*)data->audio; // Audio data
- int len = data->len/4; // Number of samples
+ float *a = (float*)data->planes[0]; // Audio data
+ int len = data->samples * data->nch; // Number of samples
float avg, l, r;
for (i = 0; i < len; i+=2)
diff --git a/audio/filter/af_format.c b/audio/filter/af_format.c
index 642ef927bb..b551ddba42 100644
--- a/audio/filter/af_format.c
+++ b/audio/filter/af_format.c
@@ -105,8 +105,9 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
struct mp_audio *r = &priv->temp;
*r = *af->data;
- r->audio = data->audio;
- r->len = data->len;
+ for (int n = 0; n < r->nch; n++)
+ r->planes[n] = data->planes[n];
+ r->samples = data->samples;
return r;
}
diff --git a/audio/filter/af_hrtf.c b/audio/filter/af_hrtf.c
index 5b80bf0eec..01148dc6a6 100644
--- a/audio/filter/af_hrtf.c
+++ b/audio/filter/af_hrtf.c
@@ -367,7 +367,7 @@ static void uninit(struct af_instance *af)
free(af->setup);
}
if(af->data)
- free(af->data->audio);
+ free(af->data->planes[0]);
free(af->data);
}
@@ -385,9 +385,9 @@ damped (without any real 3D acoustical image, however).
static struct mp_audio* play(struct af_instance *af, struct mp_audio *data)
{
af_hrtf_t *s = af->setup;
- short *in = data->audio; // Input audio data
+ short *in = data->planes[0]; // Input audio data
short *out = NULL; // Output audio data
- short *end = in + data->len / sizeof(short); // Loop end
+ short *end = in + data->samples * data->nch; // Loop end
float common, left, right, diff, left_b, right_b;
const int dblen = s->dlbuflen, hlen = s->hrflen, blen = s->basslen;
@@ -425,7 +425,7 @@ static struct mp_audio* play(struct af_instance *af, struct mp_audio *data)
"channel\n");
}
- out = af->data->audio;
+ out = af->data->planes[0];
/* MPlayer's 5 channel layout (notation for the variable):
*
@@ -565,8 +565,7 @@ static struct mp_audio* play(struct af_instance *af, struct mp_audio *data)
}
/* Set output data */
- data->audio = af->data->audio;
- data->len = data->len / data->nch * 2;
+ data->planes[0] = af->data->planes[0];
mp_audio_set_num_channels(data, 2);
return data;
diff --git a/audio/filter/af_karaoke.c b/audio/filter/af_karaoke.c
index b24ba0d877..d9c62aa85c 100644
--- a/audio/filter/af_karaoke.c
+++ b/audio/filter/af_karaoke.c
@@ -51,9 +51,9 @@ static void uninit(struct af_instance* af)
static struct mp_audio* play(struct af_instance* af, struct mp_audio* data)
{
struct mp_audio* c = data; // Current working data
- float* a = c->audio; // Audio data
- int len = c->len/4; // Number of samples in current audio block
+ float* a = c->planes[0]; // Audio data
int nch = c->nch; // Number of channels
+ int len = c->samples*nch; // Number of samples in current audio block
register int i;
/*
diff --git a/audio/filter/af_ladspa.c b/audio/filter/af_ladspa.c
index 73b7430201..6acdc150d7 100644
--- a/audio/filter/af_ladspa.c
+++ b/audio/filter/af_ladspa.c
@@ -497,10 +497,6 @@ static int control(struct af_instance *af, int cmd, void *arg) {
mp_audio_copy_config(af->data, (struct mp_audio*)arg);
mp_audio_set_format(af->data, AF_FORMAT_FLOAT_NE);
- /* arg->len is not set here yet, so init of buffers and connecting the
- * filter, has to be done in play() :-/
- */
-
return af_test_output(af, (struct mp_audio*)arg);
case AF_CONTROL_COMMAND_LINE: {
char *buf;
@@ -710,8 +706,8 @@ static void uninit(struct af_instance *af) {
static struct mp_audio* play(struct af_instance *af, struct mp_audio *data) {
af_ladspa_t *setup = af->setup;
const LADSPA_Descriptor *pdes = setup->plugin_descriptor;
- float *audio = (float*)data->audio;
- int nsamples = data->len/4; /* /4 because it's 32-bit float */
+ float *audio = (float*)data->planes[0];
+ int nsamples = data->samples*data->nch;
int nch = data->nch;
int rate = data->rate;
int i, p;
@@ -723,10 +719,6 @@ static struct mp_audio* play(struct af_instance *af, struct mp_audio *data) {
* plugin, connect ports and activate plugin
*/
- /* 2004-12-07: Also check if the buffersize has to be changed!
- * data->len is not constant per se! re-init buffers.
- */
-
if ( (setup->bufsize != nsamples/nch) || (setup->nch != nch) ) {
/* if setup->nch==0, it's the first call, if not, something has
diff --git a/audio/filter/af_lavcac3enc.c b/audio/filter/af_lavcac3enc.c
index 9ca193017a..d4abf2e942 100644
--- a/audio/filter/af_lavcac3enc.c
+++ b/audio/filter/af_lavcac3enc.c
@@ -161,7 +161,7 @@ static void uninit(struct af_instance* af)
af_ac3enc_t *s = af->setup;
if (af->data)
- free(af->data->audio);
+ free(af->data->planes[0]);
free(af->data);
if (s) {
av_free_packet(&s->pkt);
@@ -183,7 +183,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* audio)
int left, outsize = 0;
char *buf, *src;
int max_output_len;
- int frame_num = (audio->len + s->pending_len) / s->expect_len;
+ int frame_num = (mp_audio_psize(audio) + s->pending_len) / s->expect_len;
int samplesize = af_fmt2bits(s->in_sampleformat) / 8;
if (s->add_iec61937_header)
@@ -191,23 +191,23 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* audio)
else
max_output_len = AC3_MAX_CODED_FRAME_SIZE * frame_num;
- if (af->data->len < max_output_len) {
+ if (mp_audio_psize(af->data) < max_output_len) {
mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Reallocating memory in module %s, "
- "old len = %i, new len = %i\n", af->info->name, af->data->len,
- max_output_len);
- free(af->data->audio);
- af->data->audio = malloc(max_output_len);
- if (!af->data->audio) {
+ "old len = %i, new len = %i\n", af->info->name,
+ mp_audio_psize(af->data), max_output_len);
+ free(af->data->planes[0]);
+ af->data->planes[0] = malloc(max_output_len);
+ if (!af->data->planes[0]) {
mp_msg(MSGT_AFILTER, MSGL_FATAL, "[libaf] Could not allocate memory \n");
return NULL;
}
- af->data->len = max_output_len;
+ af->data->samples = max_output_len / af->data->sstride;
}
l = af->data; // Local data
- buf = l->audio;
- src = c->audio;
- left = c->len;
+ buf = l->planes[0];
+ src = c->planes[0];
+ left = mp_audio_psize(c);
while (left > 0) {
@@ -296,7 +296,7 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* audio)
len = AC3_FRAME_SIZE * 2 * 2;
}
- assert(buf + len <= (char *)af->data->audio + af->data->len);
+ assert(buf + len <= (char *)af->data->planes[0] + mp_audio_psize(af->data));
assert(s->pkt.size <= len - header_len);
memcpy(buf + header_len, s->pkt.data, s->pkt.size);
@@ -304,10 +304,10 @@ static struct mp_audio* play(struct af_instance* af, struct mp_audio* audio)
outsize += len;
buf += len;
}
- c->audio = l->audio;
+ c->planes[0] = l->planes[0];
mp_audio_set_num_channels(c, 2);
mp_audio_set_format(c, af->data->format);
- c->len = outsize;
+ c->samples = outsize / c->sstride;
mp_msg(MSGT_AFILTER, MSGL_DBG2, "play return size %d, pending %d\n",
outsize, s->pending_len);
return c;
diff --git a/audio/filter/af_lavfi.c b/audio/filter/af_lavfi.c
index 3c6d981f1d..f08e7ff85c 100644
--- a/audio/filter/af_lavfi.c
+++ b/audio/filter/af_lavfi.c
@@ -181,6 +181,7 @@ static int control(struct af_instance *af, int cmd, void *arg)
if (af_to_avformat(in->format) == AV_SAMPLE_FMT_NONE)
mp_audio_set_format(in, AF_FORMAT_FLOAT_NE);
+ mp_audio_force_interleaved_format(in);
if (!mp_chmap_is_lavc(&in->channels))
mp_chmap_reorder_to_lavc(&in->channels); // will always work
@@ -193,6 +194,7 @@ static int control(struct af_instance *af, int cmd, void *arg)
out->rate = l_out->sample_rate;
mp_audio_set_format(out, af_from_avformat(l_out->format));
+ mp_audio_force_interleaved_format(out);
struct mp_chmap out_cm;
mp_chmap_from_lavc(&out_cm, l_out->channel_layout);
@@ -228,7 +230,7 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
int out_frame_size = r->bps * r->channels.num;
AVFrame *frame = av_frame_alloc();
- frame->nb_samples = data->len / in_frame_size;
+ frame->nb_samples = data->samples;
frame->format = l_in->format;
// Timebase is 1/sample_rate
@@ -238,7 +240,7 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
av_frame_set_channel_layout(frame, l_in->channel_layout);
av_frame_set_sample_rate(frame, l_in->sample_rate);
- frame->data[0] = data->audio;
+ frame->data[0] = data->planes[0];
frame->extended_data = frame->data;
if (av_buffersrc_add_frame(p->in, frame) < 0) {
@@ -268,11 +270,11 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
av_frame_free(&frame);
}
- r->audio = p->out_buffer;
- r->len = out_len;
+ r->planes[0] = p->out_buffer;
+ r->samples = out_len / r->sstride;
- p->bytes_in += data->len;
- p->bytes_out += r->len;
+ p->bytes_in += data->samples * data->sstride;
+ p->bytes_out += r->samples * r->sstride;
if (out_pts != AV_NOPTS_VALUE) {
int64_t num_in_frames = p->bytes_in / in_frame_size;
@@ -280,8 +282,7 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
double out_time = out_pts * av_q2d(p->timebase_out);
// Need pts past the last output sample.
- int out_frames = r->len / out_frame_size;
- out_time += out_frames / (double)r->rate;
+ out_time += r->samples / (double)r->rate;
af->delay = (in_time - out_time) * r->rate * out_frame_size;
}
diff --git a/audio/filter/af_lavrresample.c b/audio/filter/af_lavrresample.c
index 860e5a52d3..a6abd32aed 100644
--- a/audio/filter/af_lavrresample.c
+++ b/audio/filter/af_lavrresample.c
@@ -244,8 +244,10 @@ static int control(struct af_instance *af, int cmd, void *arg)
if (af_to_avformat(in->format) == AV_SAMPLE_FMT_NONE)
mp_audio_set_format(in, AF_FORMAT_FLOAT_NE);
+ mp_audio_force_interleaved_format(in);
if (af_to_avformat(out->format) == AV_SAMPLE_FMT_NONE)
mp_audio_set_format(out, in->format);
+ mp_audio_force_interleaved_format(out);
af->mul = (double) (out->rate * out->nch) / (in->rate * in->nch);
af->delay = out->nch * s->opts.filter_size / FFMIN(af->mul, 1);
@@ -306,28 +308,30 @@ static struct mp_audio *play(struct af_instance *af, struct mp_audio *data)
struct mp_audio *out = af->data;
- int in_size = data->len;
- int in_samples = in_size / (data->bps * data->nch);
+ int in_samples = data->samples;
+ int in_size = data->samples * data->sstride;
int out_samples = avresample_available(s->avrctx) +
av_rescale_rnd(get_delay(s) + in_samples,
s->ctx.out_rate, s->ctx.in_rate, AV_ROUND_UP);
- int out_size = out->bps * out_samples * out->nch;
+ int out_size = out_samples * out->sstride;
- if (talloc_get_size(out->audio) < out_size)
- out->audio = talloc_realloc_size(out, out->audio, out_size);
+ if (talloc_get_size(out->planes[0]) < out_size)
+ out->planes[0] = talloc_realloc_size(out, out->planes[0], out_size);
af->delay = out->bps * av_rescale_r