[FFmpeg-devel] [PATCH]lavf/icodec: Improve probe function
Carl Eugen Hoyos
cehoyos at ag.or.at
Tue Jan 12 16:09:10 CET 2016
On Tuesday 12 January 2016 02:49:59 pm Michael Niedermayer wrote:
> On Tue, Jan 12, 2016 at 01:49:37PM +0100, Carl Eugen Hoyos wrote:
> > Hi!
> >
> > On Tuesday 12 January 2016 01:33:53 pm Carl Eugen Hoyos wrote:
> > > Attached patch improves ico probing, previously mpeg-2 frames could be
> > > detected.
> >
> > Wikipedia claims that planes can be 0, new patch attached.
> >
> > Carl Eugen
> >
> > icodec.c | 8 ++++++--
> > 1 file changed, 6 insertions(+), 2 deletions(-)
> > 5587972d12000a679757c9b42947869eb1cee0f5 patchico.diff
> > diff --git a/libavformat/icodec.c b/libavformat/icodec.c
> > index 22e2099..4d6e6dc 100644
>
> tools/probetest 256 4096
> testing size=1
> testing size=2
> testing size=4
> testing size=8
> Failure of ico probing code with score=26 type=1 p=EA6 size=8
Before the old patch, 32 bits were tested and return a value of 25,
after the patch, 55 bits were tested and returned 26.
Imo, this just shows that probetest cannot see every possible issue.
Improved patch attached.
Carl Eugen
-------------- next part --------------
diff --git a/libavformat/icodec.c b/libavformat/icodec.c
index 22e2099..9cf3dca 100644
--- a/libavformat/icodec.c
+++ b/libavformat/icodec.c
@@ -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;
+ }
+
+ return AVPROBE_SCORE_MAX / 4 + 1;
}
static int read_header(AVFormatContext *s)
More information about the ffmpeg-devel
mailing list