diff options
Diffstat (limited to 'tools/probetest.c')
-rw-r--r-- | tools/probetest.c | 99 |
1 files changed, 88 insertions, 11 deletions
diff --git a/tools/probetest.c b/tools/probetest.c index 678f4dd3a7..74045eb498 100644 --- a/tools/probetest.c +++ b/tools/probetest.c @@ -1,20 +1,20 @@ /* * copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at> * - * This file is part of Libav. + * This file is part of FFmpeg. * - * Libav is free software; you can redistribute it and/or + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ @@ -23,9 +23,17 @@ #include "libavformat/avformat.h" #include "libavcodec/put_bits.h" #include "libavutil/lfg.h" +#include "libavutil/timer.h" -static int score_array[1000]; //this must be larger than the number of formats +#define MAX_FORMATS 1000 //this must be larger than the number of formats +static int score_array[MAX_FORMATS]; +static int64_t time_array[MAX_FORMATS]; static int failures = 0; +static const char *single_format; + +#ifndef AV_READ_TIME +#define AV_READ_TIME(x) 0 +#endif static void probe(AVProbeData *pd, int type, int p, int size) { @@ -35,8 +43,13 @@ static void probe(AVProbeData *pd, int type, int p, int size) while ((fmt = av_iformat_next(fmt))) { if (fmt->flags & AVFMT_NOFILE) continue; - if (fmt->read_probe) { - int score = fmt->read_probe(pd); + if (fmt->read_probe && + (!single_format || !strcmp(single_format, fmt->name)) + ) { + int score; + int64_t start = AV_READ_TIME(); + score = fmt->read_probe(pd); + time_array[i] += AV_READ_TIME() - start; if (score > score_array[i] && score > AVPROBE_SCORE_MAX / 4) { score_array[i] = score; fprintf(stderr, @@ -49,12 +62,67 @@ static void probe(AVProbeData *pd, int type, int p, int size) } } -int main(void) +static void print_times(void) +{ + int i = 0; + AVInputFormat *fmt = NULL; + + while ((fmt = av_iformat_next(fmt))) { + if (fmt->flags & AVFMT_NOFILE) + continue; + if (time_array[i] > 1000000) { + fprintf(stderr, "%12"PRIu64" cycles, %12s\n", + time_array[i], fmt->name); + } + i++; + } +} + +static int read_int(char *arg) { + int ret; + + if (!arg || !*arg) + return -1; + ret = strtol(arg, &arg, 0); + if (*arg) + return -1; + return ret; +} + +int main(int argc, char **argv) { unsigned int p, i, type, size, retry; - AVProbeData pd; + AVProbeData pd = { 0 }; AVLFG state; PutBitContext pb; + int retry_count= 4097; + int max_size = 65537; + int j; + + for (j = i = 1; i<argc; i++) { + if (!strcmp(argv[i], "-f") && i+1<argc && !single_format) { + single_format = argv[++i]; + } else if (read_int(argv[i])>0 && j == 1) { + retry_count = read_int(argv[i]); + j++; + } else if (read_int(argv[i])>0 && j == 2) { + max_size = read_int(argv[i]); + j++; + } else { + fprintf(stderr, "probetest [-f <input format>] [<retry_count> [<max_size>]]\n"); + return 1; + } + } + + if (max_size > 1000000000U/8) { + fprintf(stderr, "max_size out of bounds\n"); + return 1; + } + + if (retry_count > 1000000000U) { + fprintf(stderr, "retry_count out of bounds\n"); + return 1; + } avcodec_register_all(); av_register_all(); @@ -62,14 +130,21 @@ int main(void) av_lfg_init(&state, 0xdeadbeef); pd.buf = NULL; - for (size = 1; size < 65537; size *= 2) { + for (size = 1; size < max_size; size *= 2) { pd.buf_size = size; pd.buf = av_realloc(pd.buf, size + AVPROBE_PADDING_SIZE); pd.filename = ""; + if (!pd.buf) { + fprintf(stderr, "out of memory\n"); + return 1; + } + + memset(pd.buf, 0, size + AVPROBE_PADDING_SIZE); + fprintf(stderr, "testing size=%d\n", size); - for (retry = 0; retry < 4097; retry += FFMAX(size, 32)) { + for (retry = 0; retry < retry_count; retry += FFMAX(size, 32)) { for (type = 0; type < 4; type++) { for (p = 0; p < 4096; p++) { unsigned hist = 0; @@ -122,5 +197,7 @@ int main(void) } } } + if(AV_READ_TIME()) + print_times(); return failures; } |