mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
lavf/icodec: Improve autodetection.
Avoids misdetection of MPEG (B-)frames. Reviewed-by: Michael Bradshaw
This commit is contained in:
parent
f59b727e2f
commit
9bc281beae
@ -27,6 +27,7 @@
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavcodec/bytestream.h"
|
||||
#include "libavcodec/bmp.h"
|
||||
#include "libavcodec/png.h"
|
||||
#include "avformat.h"
|
||||
#include "internal.h"
|
||||
|
||||
@ -44,9 +45,30 @@ typedef struct {
|
||||
|
||||
static int probe(AVProbeData *p)
|
||||
{
|
||||
if (AV_RL16(p->buf) == 0 && AV_RL16(p->buf + 2) == 1 && AV_RL16(p->buf + 4))
|
||||
return AVPROBE_SCORE_MAX / 4;
|
||||
return 0;
|
||||
unsigned i, frames = AV_RL16(p->buf + 4);
|
||||
|
||||
if (AV_RL16(p->buf) || AV_RL16(p->buf + 2) != 1 || !frames)
|
||||
return 0;
|
||||
for (i = 0; i < frames; i++) {
|
||||
unsigned offset;
|
||||
if (AV_RL16(p->buf + 10 + i * 16) & ~1)
|
||||
return FFMIN(i, AVPROBE_SCORE_MAX / 4);
|
||||
if (p->buf[13 + i * 16])
|
||||
return FFMIN(i, AVPROBE_SCORE_MAX / 4);
|
||||
if (AV_RL32(p->buf + 14 + i * 16) < 40)
|
||||
return FFMIN(i, AVPROBE_SCORE_MAX / 4);
|
||||
offset = AV_RL32(p->buf + 18 + i * 16);
|
||||
if (offset < 22)
|
||||
return FFMIN(i, AVPROBE_SCORE_MAX / 4);
|
||||
if (offset + 8 > p->buf_size)
|
||||
return AVPROBE_SCORE_MAX / 4 + FFMIN(i, 1);
|
||||
if (p->buf[offset] != 40 && AV_RB64(p->buf + offset) != PNGSIG)
|
||||
return FFMIN(i, AVPROBE_SCORE_MAX / 4);
|
||||
if (i * 16 + 6 > p->buf_size)
|
||||
return AVPROBE_SCORE_MAX / 4 + FFMIN(i, 1);
|
||||
}
|
||||
|
||||
return AVPROBE_SCORE_MAX / 2 + 1;
|
||||
}
|
||||
|
||||
static int read_header(AVFormatContext *s)
|
||||
|
Loading…
Reference in New Issue
Block a user