From d4bdd0473d6f43132257c9fb3848d829755167a3 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 5 Nov 2012 17:02:04 +0100 Subject: Rename directories, move files (step 1 of 2) (does not compile) Tis drops the silly lib prefixes, and attempts to organize the tree in a more logical way. Make the top-level directory less cluttered as well. Renames the following directories: libaf -> audio/filter libao2 -> audio/out libvo -> video/out libmpdemux -> demux Split libmpcodecs: vf* -> video/filter vd*, dec_video.* -> video/decode mp_image*, img_format*, ... -> video/ ad*, dec_audio.* -> audio/decode libaf/format.* is moved to audio/ - this is similar to how mp_image.* is located in video/. Move most top-level .c/.h files to core. (talloc.c/.h is left on top- level, because it's external.) Park some of the more annoying files in compat/. Some of these are relicts from the time mplayer used ffmpeg internals. sub/ is not split, because it's too much of a mess (subtitle code is mixed with OSD display and rendering). Maybe the organization of core is not ideal: it mixes playback core (like mplayer.c) and utility helpers (like bstr.c/h). Should the need arise, the playback core will be moved somewhere else, while core contains all helper and common code. --- audio/filter/af_delay.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 audio/filter/af_delay.c (limited to 'audio/filter/af_delay.c') diff --git a/audio/filter/af_delay.c b/audio/filter/af_delay.c new file mode 100644 index 0000000000..ce8d71980b --- /dev/null +++ b/audio/filter/af_delay.c @@ -0,0 +1,200 @@ +/* + * This audio filter delays the output signal for the different + * channels and can be used for simple position panning. + * An extension for this filter would be a reverb. + * + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include + +#include "af.h" + +#define L 65536 + +#define UPDATEQI(qi) qi=(qi+1)&(L-1) + +// Data for specific instances of this filter +typedef struct af_delay_s +{ + void* q[AF_NCH]; // Circular queues used for delaying audio signal + int wi[AF_NCH]; // Write index + int ri; // Read index + float d[AF_NCH]; // Delay [ms] +}af_delay_t; + +// Initialization and runtime control +static int control(struct af_instance* af, int cmd, void* arg) +{ + af_delay_t* s = af->setup; + switch(cmd){ + case AF_CONTROL_REINIT:{ + int i; + + // Free prevous delay queues + for(i=0;idata->nch;i++) + free(s->q[i]); + + af->data->rate = ((struct mp_audio*)arg)->rate; + af->data->nch = ((struct mp_audio*)arg)->nch; + af->data->format = ((struct mp_audio*)arg)->format; + af->data->bps = ((struct mp_audio*)arg)->bps; + + // Allocate new delay queues + for(i=0;idata->nch;i++){ + s->q[i] = calloc(L,af->data->bps); + if(NULL == s->q[i]) + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[delay] Out of memory\n"); + } + + return control(af,AF_CONTROL_DELAY_LEN | AF_CONTROL_SET,s->d); + } + case AF_CONTROL_COMMAND_LINE:{ + int n = 1; + int i = 0; + char* cl = arg; + while(n && i < AF_NCH ){ + sscanf(cl,"%f:%n",&s->d[i],&n); + if(n==0 || cl[n-1] == '\0') + break; + cl=&cl[n]; + i++; + } + return AF_OK; + } + case AF_CONTROL_DELAY_LEN | AF_CONTROL_SET:{ + int i; + if(AF_OK != af_from_ms(AF_NCH, arg, s->wi, af->data->rate, 0.0, 1000.0)) + return AF_ERROR; + s->ri = 0; + for(i=0;id[i],0.0,1000.0)); + mp_msg(MSGT_AFILTER, MSGL_DBG3, "[delay] Channel %i delayed by %i samples\n", + i,s->wi[i]); + } + return AF_OK; + } + case AF_CONTROL_DELAY_LEN | AF_CONTROL_GET:{ + int i; + for(i=0;iri > s->wi[i]) + s->wi[i] = L - (s->ri - s->wi[i]); + else + s->wi[i] = s->wi[i] - s->ri; + } + return af_to_ms(AF_NCH, s->wi, arg, af->data->rate); + } + } + return AF_UNKNOWN; +} + +// Deallocate memory +static void uninit(struct af_instance* af) +{ + int i; + + free(af->data); + for(i=0;isetup))->q[i]); + free(af->setup); +} + +// Filter data through filter +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 ri = 0; + int ch,i; + for(ch=0;chbps){ + case 1:{ + int8_t* a = c->audio; + int8_t* q = s->q[ch]; + int wi = s->wi[ch]; + ri = s->ri; + for(i=ch;iwi[ch] = wi; + break; + } + case 2:{ + int16_t* a = c->audio; + int16_t* q = s->q[ch]; + int wi = s->wi[ch]; + ri = s->ri; + for(i=ch;iwi[ch] = wi; + break; + } + case 4:{ + int32_t* a = c->audio; + int32_t* q = s->q[ch]; + int wi = s->wi[ch]; + ri = s->ri; + for(i=ch;iwi[ch] = wi; + break; + } + } + } + s->ri = ri; + return c; +} + +// Allocate memory and set function pointers +static int af_open(struct af_instance* af){ + af->control=control; + af->uninit=uninit; + af->play=play; + af->mul=1; + af->data=calloc(1,sizeof(struct mp_audio)); + af->setup=calloc(1,sizeof(af_delay_t)); + if(af->data == NULL || af->setup == NULL) + return AF_ERROR; + return AF_OK; +} + +// Description of this filter +struct af_info af_info_delay = { + "Delay audio filter", + "delay", + "Anders", + "", + AF_FLAGS_REENTRANT, + af_open +}; -- cgit v1.2.3