From b2781c11ed0ee68b42013df6000d5427a5c988f0 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 16 Jun 2015 22:49:21 +0200 Subject: af: remove conversion filter search This attempted to find a minimal filter graph for a format conversion involving multiple conversion filters. With the last 2 commits it becomes dead code - remove it. --- audio/filter/af.c | 90 ++---------------------------------------- audio/filter/af.h | 1 - audio/filter/af_lavrresample.c | 7 ---- 3 files changed, 4 insertions(+), 94 deletions(-) diff --git a/audio/filter/af.c b/audio/filter/af.c index b7895d3598..5a686e813c 100644 --- a/audio/filter/af.c +++ b/audio/filter/af.c @@ -329,89 +329,9 @@ static void af_print_filter_chain(struct af_stream *s, struct af_instance *at, MP_MSG(s, msg_level, " [ao] %s\n", mp_audio_config_to_str(&s->output)); } -static int af_count_filters(struct af_stream *s) -{ - int count = 0; - for (struct af_instance *af = s->first; af; af = af->next) - count++; - return count; -} - -// Finds the first conversion filter on the way from srcfmt to dstfmt. -// Conversions form a DAG: each node is a format/filter pair, and possible -// conversions are edges. We search the DAG for the shortest path. -// Some cases visit the same filter multiple times, but with different formats -// (like u24le->s8), so one node per format or filter separate is not enough. -// Returns the filter and dest. format for the first conversion step. -// (So we know what conversion filter with what format to insert next.) -static char *af_find_conversion_filter(int srcfmt, int *dstfmt) -{ -#define MAX_NODES (64 * 32) - int num_fmt = 0, num_filt = 0; - for (int n = 0; filter_list[n]; n++) - num_filt = n + 1; - for (int n = 0; af_fmtstr_table[n].format; n++) - num_fmt = n + 1; - - int num_nodes = num_fmt * num_filt; - assert(num_nodes < MAX_NODES); - - bool visited[MAX_NODES] = {0}; - unsigned char distance[MAX_NODES]; - short previous[MAX_NODES] = {0}; - for (int n = 0; n < num_nodes; n++) { - distance[n] = 255; - if (af_fmtstr_table[n % num_fmt].format == srcfmt) - distance[n] = 0; - } - - while (1) { - int next = -1; - for (int n = 0; n < num_nodes; n++) { - if (!visited[n] && (next < 0 || (distance[n] < distance[next]))) - next = n; - } - if (next < 0 || distance[next] == 255) - return NULL; - visited[next] = true; - - int fmt = next % num_fmt; - if (af_fmtstr_table[fmt].format == *dstfmt) { - // Best match found - for (int cur = next; cur >= 0; cur = previous[cur] - 1) { - if (distance[cur] == 1) { - *dstfmt = af_fmtstr_table[cur % num_fmt].format; - return (char *)filter_list[cur / num_fmt]->name; - } - } - return NULL; - } - - for (int n = 0; filter_list[n]; n++) { - const struct af_info *af = filter_list[n]; - if (!af->test_conversion) - continue; - for (int i = 0; af_fmtstr_table[i].format; i++) { - if (i != fmt && af->test_conversion(af_fmtstr_table[fmt].format, - af_fmtstr_table[i].format)) - { - int other = n * num_fmt + i; - int ndist = distance[next] + 1; - if (ndist < distance[other]) { - distance[other] = ndist; - previous[other] = next + 1; - } - } - } - } - } - assert(0); -#undef MAX_NODES -} - static bool af_is_conversion_filter(struct af_instance *af) { - return af && af->info->test_conversion != NULL; + return af && strcmp(af->info->name, "lavrresample") == 0; } // in is what af can take as input - insert a conversion filter if the actual @@ -431,9 +351,7 @@ static int af_fix_format_conversion(struct af_stream *s, if (actual.format == in.format) return AF_FALSE; int dstfmt = in.format; - char *filter = af_find_conversion_filter(actual.format, &dstfmt); - if (!filter) - return AF_ERROR; + char *filter = "lavrresample"; if (strcmp(filter, prev->info->name) == 0) { if (prev->control(prev, AF_CONTROL_SET_FORMAT, &dstfmt) == AF_OK) { *p_af = prev; @@ -523,8 +441,8 @@ static int af_reinit(struct af_stream *s) // Start with the second filter, as the first filter is the special input // filter which needs no initialization. struct af_instance *af = s->first->next; - // Up to 7 retries per filter (channel, rate, 5x format conversions) - int max_retry = af_count_filters(s) * 7; + // Up to 4 retries per filter (channel, rate, format conversions) + int max_retry = 4; int retry = 0; while (af) { if (retry >= max_retry) diff --git a/audio/filter/af.h b/audio/filter/af.h index fb5f74b253..b35901232d 100644 --- a/audio/filter/af.h +++ b/audio/filter/af.h @@ -48,7 +48,6 @@ struct af_info { const char *name; const int flags; int (*open)(struct af_instance *vf); - bool (*test_conversion)(int src_format, int dst_format); int priv_size; const void *priv_defaults; const struct m_option *options; diff --git a/audio/filter/af_lavrresample.c b/audio/filter/af_lavrresample.c index cfc3bc847d..5b6f93478b 100644 --- a/audio/filter/af_lavrresample.c +++ b/audio/filter/af_lavrresample.c @@ -177,12 +177,6 @@ static int check_output_conversion(int mp_format) return af_to_avformat(mp_format); } -static bool test_conversion(int src_format, int dst_format) -{ - return af_to_avformat(src_format) != AV_SAMPLE_FMT_NONE && - check_output_conversion(dst_format) != AV_SAMPLE_FMT_NONE; -} - // mp_chmap_get_reorder() performs: // to->speaker[n] = from->speaker[src[n]] // but libavresample does: @@ -547,7 +541,6 @@ const struct af_info af_info_lavrresample = { .info = "Sample frequency conversion using libavresample", .name = "lavrresample", .open = af_open, - .test_conversion = test_conversion, .priv_size = sizeof(struct af_resample), .priv_defaults = &(const struct af_resample) { .opts = { -- cgit v1.2.3