yading@11: /* yading@11: * copyright (c) 2009 Michael Niedermayer yading@11: * yading@11: * This file is part of FFmpeg. yading@11: * yading@11: * FFmpeg is free software; you can redistribute it and/or yading@11: * modify it under the terms of the GNU Lesser General Public yading@11: * License as published by the Free Software Foundation; either yading@11: * version 2.1 of the License, or (at your option) any later version. yading@11: * yading@11: * FFmpeg is distributed in the hope that it will be useful, yading@11: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@11: * Lesser General Public License for more details. yading@11: * yading@11: * You should have received a copy of the GNU Lesser General Public yading@11: * License along with FFmpeg; if not, write to the Free Software yading@11: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@11: */ yading@11: yading@11: #include yading@11: yading@11: #include "libavformat/avformat.h" yading@11: #include "libavcodec/put_bits.h" yading@11: #include "libavutil/lfg.h" yading@11: yading@11: static int score_array[1000]; //this must be larger than the number of formats yading@11: static int failures = 0; yading@11: yading@11: static void probe(AVProbeData *pd, int type, int p, int size) yading@11: { yading@11: int i = 0; yading@11: AVInputFormat *fmt = NULL; yading@11: yading@11: while ((fmt = av_iformat_next(fmt))) { yading@11: if (fmt->flags & AVFMT_NOFILE) yading@11: continue; yading@11: if (fmt->read_probe) { yading@11: int score = fmt->read_probe(pd); yading@11: if (score > score_array[i] && score > AVPROBE_SCORE_MAX / 4) { yading@11: score_array[i] = score; yading@11: fprintf(stderr, yading@11: "Failure of %s probing code with score=%d type=%d p=%X size=%d\n", yading@11: fmt->name, score, type, p, size); yading@11: failures++; yading@11: } yading@11: } yading@11: i++; yading@11: } yading@11: } yading@11: yading@11: int main(int argc, char **argv) yading@11: { yading@11: unsigned int p, i, type, size, retry; yading@11: AVProbeData pd; yading@11: AVLFG state; yading@11: PutBitContext pb; yading@11: int retry_count= 4097; yading@11: int max_size = 65537; yading@11: yading@11: if(argc >= 2) yading@11: retry_count = atoi(argv[1]); yading@11: if(argc >= 3) yading@11: max_size = atoi(argv[2]); yading@11: yading@11: if (max_size > 1000000000U/8) { yading@11: fprintf(stderr, "max_size out of bounds\n"); yading@11: return 1; yading@11: } yading@11: yading@11: if (retry_count > 1000000000U) { yading@11: fprintf(stderr, "retry_count out of bounds\n"); yading@11: return 1; yading@11: } yading@11: yading@11: avcodec_register_all(); yading@11: av_register_all(); yading@11: yading@11: av_lfg_init(&state, 0xdeadbeef); yading@11: yading@11: pd.buf = NULL; yading@11: for (size = 1; size < max_size; size *= 2) { yading@11: pd.buf_size = size; yading@11: pd.buf = av_realloc(pd.buf, size + AVPROBE_PADDING_SIZE); yading@11: pd.filename = ""; yading@11: yading@11: memset(pd.buf, 0, size + AVPROBE_PADDING_SIZE); yading@11: yading@11: fprintf(stderr, "testing size=%d\n", size); yading@11: yading@11: for (retry = 0; retry < retry_count; retry += FFMAX(size, 32)) { yading@11: for (type = 0; type < 4; type++) { yading@11: for (p = 0; p < 4096; p++) { yading@11: unsigned hist = 0; yading@11: init_put_bits(&pb, pd.buf, size); yading@11: switch (type) { yading@11: case 0: yading@11: for (i = 0; i < size * 8; i++) yading@11: put_bits(&pb, 1, (av_lfg_get(&state) & 0xFFFFFFFF) > p << 20); yading@11: break; yading@11: case 1: yading@11: for (i = 0; i < size * 8; i++) { yading@11: unsigned int p2 = hist ? p & 0x3F : (p >> 6); yading@11: unsigned int v = (av_lfg_get(&state) & 0xFFFFFFFF) > p2 << 26; yading@11: put_bits(&pb, 1, v); yading@11: hist = v; yading@11: } yading@11: break; yading@11: case 2: yading@11: for (i = 0; i < size * 8; i++) { yading@11: unsigned int p2 = (p >> (hist * 3)) & 7; yading@11: unsigned int v = (av_lfg_get(&state) & 0xFFFFFFFF) > p2 << 29; yading@11: put_bits(&pb, 1, v); yading@11: hist = (2 * hist + v) & 3; yading@11: } yading@11: break; yading@11: case 3: yading@11: for (i = 0; i < size; i++) { yading@11: int c = 0; yading@11: while (p & 63) { yading@11: c = (av_lfg_get(&state) & 0xFFFFFFFF) >> 24; yading@11: if (c >= 'a' && c <= 'z' && (p & 1)) yading@11: break; yading@11: else if (c >= 'A' && c <= 'Z' && (p & 2)) yading@11: break; yading@11: else if (c >= '0' && c <= '9' && (p & 4)) yading@11: break; yading@11: else if (c == ' ' && (p & 8)) yading@11: break; yading@11: else if (c == 0 && (p & 16)) yading@11: break; yading@11: else if (c == 1 && (p & 32)) yading@11: break; yading@11: } yading@11: pd.buf[i] = c; yading@11: } yading@11: } yading@11: flush_put_bits(&pb); yading@11: probe(&pd, type, p, size); yading@11: } yading@11: } yading@11: } yading@11: } yading@11: return failures; yading@11: }