diff options
author | anders <anders@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-10-01 06:45:08 +0000 |
---|---|---|
committer | anders <anders@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-10-01 06:45:08 +0000 |
commit | 1f6c494641c4ca99eec7a9f47818526c72789439 (patch) | |
tree | 17bf220c1c1ac1144dfa8212f09444e51c248a26 /libaf/af.h | |
parent | c0091278d8f15580eecebfc8c454fba250cf4b94 (diff) | |
download | mpv-1f6c494641c4ca99eec7a9f47818526c72789439.tar.bz2 mpv-1f6c494641c4ca99eec7a9f47818526c72789439.tar.xz |
Adding new audio output filter layer libaf
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7569 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libaf/af.h')
-rw-r--r-- | libaf/af.h | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/libaf/af.h b/libaf/af.h new file mode 100644 index 0000000000..b0ea7b710a --- /dev/null +++ b/libaf/af.h @@ -0,0 +1,160 @@ +#ifndef __aop_h__ +#define __aop_h__ + +struct af_instance_s; + +// Audio data chunk +typedef struct af_data_s +{ + void* audio; // data buffer + int len; // buffer length + int rate; // sample rate + int nch; // number of channels + int format; // format + int bps; // bytes per sample +} af_data_t; + +// Fraction, used to calculate buffer lengths +typedef struct frac_s +{ + int n; // Numerator + int d; // Denominator +} frac_t; + +/* Audio filter information not specific for current instance, but for + a specific filter */ +typedef struct af_info_s +{ + const char *info; + const char *name; + const char *author; + const char *comment; + int (*open)(struct af_instance_s* vf); +} af_info_t; + +// Linked list of audio filters +typedef struct af_instance_s +{ + af_info_t* info; + int (*control)(struct af_instance_s* af, int cmd, void* arg); + void (*uninit)(struct af_instance_s* af); + af_data_t* (*play)(struct af_instance_s* af, af_data_t* data); + void* setup; // setup data for this specific instance and filter + af_data_t* data; // configuration for outgoing data stream + struct af_instance_s* next; + struct af_instance_s* prev; + frac_t mul; /* length multiplier: how much does this instance change + the length of the buffer. */ +}af_instance_t; + +/********************************************* +// Control parameters +*/ + +/* The control system is divided into 3 levels + mandatory calls - all filters must answer to all of these + optional calls - are optional + filter specific calls - applies only to some filters +*/ + +#define AF_CONTROL_MANDATORY_BASE 0 +#define AF_CONTROL_OPTIONAL_BASE 100 +#define AF_CONTROL_FILTER_SPECIFIC_BASE 200 + +// MANDATORY CALLS + +/* Reinitialize filter. The optional argument contains the new + configuration in form of a af_data_t struct. If the filter does not + support the new format the struct should be changed and AF_FALSE + should be returned. If the incoming and outgoing data streams are + identical the filter can return AF_DETACH. This will remove the + filter. */ +#define AF_CONTROL_REINIT 1 + AF_CONTROL_MANDATORY_BASE + +// OPTIONAL CALLS + + +// FILTER SPECIFIC CALLS + +// Set output rate in resample +#define AF_CONTROL_RESAMPLE 1 + AF_CONTROL_FILTER_SPECIFIC_BASE +// Set output format in format +#define AF_CONTROL_FORMAT 2 + AF_CONTROL_FILTER_SPECIFIC_BASE +// Set number of output channels in channels +#define AF_CONTROL_CHANNELS 3 + AF_CONTROL_FILTER_SPECIFIC_BASE +// Set delay length in delay +#define AF_CONTROL_SET_DELAY_LEN 4 + AF_CONTROL_FILTER_SPECIFIC_BASE +/********************************************* +// Return values +*/ + +#define AF_DETACH 2 +#define AF_OK 1 +#define AF_TRUE 1 +#define AF_FALSE 0 +#define AF_UNKNOWN -1 +#define AF_ERROR -2 +#define AF_NA -3 + + +/********************************************* +// Command line configuration switches +*/ +typedef struct af_cfg_s{ + int rate; + int format; + int bps; + int force; + char** list; +}af_cfg_t; + + +// Export functions + +/* Init read configuration and create filter list accordingly. In and + out contains the format of the current movie and the formate of the + prefered output respectively */ +int af_init(af_data_t* in, af_data_t* out); +// Uninit and remove all filters +void af_uninit(); +// Filter data chunk through the filters in the list +af_data_t* af_play(af_data_t* data); +/* Calculate how long the output from the filters will be given the + input length "len" */ +int af_outputlen(int len); +/* Calculate how long the input to the filters should be to produce a + certain output length, i.e. the return value of this function is + the input length required to produce the output length "len". */ +int af_inputlen(int len); + + + +// Helper functions and macros used inside the audio filters + +/* Helper function called by the macro with the same name only to be + called from inside filters */ +int af_resize_local_buffer(af_instance_t* af, af_data_t* data); + +/* Helper function used to calculate the exact buffer length needed + when buffers are resized */ +int af_lencalc(frac_t mul, int len); + +/* Memory reallocation macro: if 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. */ +#define RESIZE_LOCAL_BUFFER(a,d)\ +((af->data->len < af_lencalc(af->mul,data->len))?af_resize_local_buffer(af,data):AF_OK) + +#ifndef min +#define min(a,b)(((a)>(b))?(b):(a)) +#endif + +#ifndef max +#define max(a,b)(((a)>(b))?(a):(b)) +#endif + +#ifndef AUDIO_FILTER +extern af_cfg_t af_cfg; +#endif /* AUDIO_FILTER */ + +#endif |