From f8e93e8037402c154827696bf04cbd41f3f21a48 Mon Sep 17 00:00:00 2001 From: anders Date: Mon, 7 Oct 2002 10:46:01 +0000 Subject: [PATCH] Adding functionality for adding filters during execution git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7650 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libaf/af.c | 32 ++++++++++++++++++++++++++++---- libaf/af.h | 18 ++++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/libaf/af.c b/libaf/af.c index 393f6e3cb1..e4d496464d 100644 --- a/libaf/af.c +++ b/libaf/af.c @@ -156,7 +156,9 @@ void af_remove(af_stream_t* s, af_instance_t* af) free(af); } -/* Reinitializes all filters downstream from the filter given in the argument */ +/* Reinitializes all filters downstream from the filter given in the + argument the return value is AF_OK if success and AF_ERROR if + failure */ int af_reinit(af_stream_t* s, af_instance_t* af) { if(!af) @@ -364,6 +366,31 @@ int af_init(af_stream_t* s) return 0; } +/* Add filter during execution. This function adds the filter "name" + to the stream s. The filter will be inserted somewhere nice in the + list of filters. The return value is a pointer to the new filter, + If the filter couldn't be added the return value is NULL. */ +af_instance_t* af_add(af_stream_t* s, char* name){ + af_instance_t* new; + // Sanity check + if(!s || !s->first || !name) + return NULL; + // Insert the filter somwhere nice + if(!strcmp(s->first->info->name,"format")) + new = af_append(s, s->first, name); + else + new = af_prepend(s, s->first, name); + if(!new) + return NULL; + + // Reinitalize the filter list + if(AF_OK != af_reinit(s, s->first)){ + free(new); + return NULL; + } + return new; +} + // Filter data chunk through the filters in the list af_data_t* af_play(af_stream_t* s, af_data_t* data) { @@ -451,9 +478,6 @@ int af_calc_insize_constrained(af_stream_t* s, int len, in+=t; } -// printf("Could no meet constraint nr 3. in=%d out=%d len=%d max_in=%d max_out=%d", -// in,out,len,max_insize,max_outsize); - // Could no meet constraint nr 3. while(out > max_outsize || in > max_insize){ in-=t; diff --git a/libaf/af.h b/libaf/af.h index 84f82b5d7e..26309aaf1b 100644 --- a/libaf/af.h +++ b/libaf/af.h @@ -138,19 +138,37 @@ typedef struct af_stream_s stream will be reinitialized. The return value is 0 if sucess and -1 if failure */ int af_init(af_stream_t* s); + // Uninit and remove all filters void af_uninit(af_stream_t* s); + +/* Add filter during execution. This function adds the filter "name" + to the stream s. The filter will be inserted somewhere nice in the + list of filters. The return value is a pointer to the new filter, + If the filter couldn't be added the return value is NULL. */ +af_instance_t* af_add(af_stream_t* s, char* name); + +// Uninit and remove the filter "af" +void af_remove(af_stream_t* s, af_instance_t* af); + +/* Find filter in the dynamic filter list using it's name This + function is used for finding already initialized filters */ +af_instance_t* af_get(af_stream_t* s, char* name); + // Filter data chunk through the filters in the list af_data_t* af_play(af_stream_t* s, af_data_t* data); + /* Calculate how long the output from the filters will be given the input length "len". The calculated length is >= the actual length */ int af_outputlen(af_stream_t* s, 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". The calculated length is <= the actual length */ int af_inputlen(af_stream_t* s, int len); + /* Calculate how long the input IN to the filters should be to produce a certain output length OUT but with the following three constraints: 1. IN <= max_insize, where max_insize is the maximum possible input