aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/pva.c
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2011-10-13 19:45:49 +0200
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2011-10-13 20:10:25 +0200
commite91230a589fbf84ac57e7e878e05926bdb5b1ff6 (patch)
tree3fd2c16e913b33754442464fe19dda01110aefeb /libavformat/pva.c
parentc722c88eb6491bb554f50cd9ba8dd894d6294c15 (diff)
downloadffmpeg-e91230a589fbf84ac57e7e878e05926bdb5b1ff6.tar.gz
Improve PVA probe function.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Diffstat (limited to 'libavformat/pva.c')
-rw-r--r--libavformat/pva.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/libavformat/pva.c b/libavformat/pva.c
index fda5fc3867..1aad6db29d 100644
--- a/libavformat/pva.c
+++ b/libavformat/pva.c
@@ -31,13 +31,26 @@ typedef struct {
int continue_pes;
} PVAContext;
+static int pva_check(uint8_t *p) {
+ int length = AV_RB16(p + 6);
+ if (AV_RB16(p) != PVA_MAGIC || !p[2] || p[2] > 2 || p[4] != 0x55 ||
+ (p[5] & 0xe0) || length > PVA_MAX_PAYLOAD_LENGTH)
+ return -1;
+ return length + 8;
+}
+
static int pva_probe(AVProbeData * pd) {
unsigned char *buf = pd->buf;
+ int len = pva_check(buf);
- if (AV_RB16(buf) == PVA_MAGIC && buf[2] && buf[2] < 3 && buf[4] == 0x55)
+ if (len < 0)
+ return 0;
+
+ if (pd->buf_size >= len + 8 &&
+ pva_check(buf + len) >= 0)
return AVPROBE_SCORE_MAX / 2;
- return 0;
+ return AVPROBE_SCORE_MAX / 4;
}
static int pva_read_header(AVFormatContext *s, AVFormatParameters *ap) {