summaryrefslogtreecommitdiff
path: root/tools/probetest.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/probetest.c')
-rw-r--r--tools/probetest.c99
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;
}