[FFmpeg-devel] [PATCH] avformat/amr: reduce raw amr false positive detection
Carl Eugen Hoyos
ceffmpeg at gmail.com
Wed Oct 2 23:27:14 EEST 2019
Am Mi., 2. Okt. 2019 um 22:18 Uhr schrieb Carl Eugen Hoyos <ceffmpeg at gmail.com>:
>
> Am Mi., 2. Okt. 2019 um 20:19 Uhr schrieb Paul B Mahol <onemda at gmail.com>:
> >
> > Signed-off-by: Paul B Mahol <onemda at gmail.com>
> > ---
> > libavformat/amr.c | 18 ++++++++++++------
> > 1 file changed, 12 insertions(+), 6 deletions(-)
> >
> > diff --git a/libavformat/amr.c b/libavformat/amr.c
> > index 42840a50a3..600cb1b0f0 100644
> > --- a/libavformat/amr.c
> > +++ b/libavformat/amr.c
> > @@ -190,9 +190,12 @@ static int amrnb_probe(const AVProbeData *p)
> > if (b[++i] != last)
> > break;
> > }
> > - if (size > 0) {
> > - valid++;
> > - i += size;
> > + while (size--) {
> > + if (b[i])
> > + valid++;
> > + else
> > + invalid++;
> > + i++;
> > }
> > } else {
> > valid = 0;
> > @@ -246,9 +249,12 @@ static int amrwb_probe(const AVProbeData *p)
> > if (b[++i] != last)
> > break;
> > }
> > - if (size > 0) {
> > - valid++;
> > - i += size;
> > + while (size--) {
> > + if (b[i])
> > + valid++;
> > + else
> > + invalid++;
> > + i++;
> > }
> > } else {
> > valid = 0;
>
> The changes to amrwb are unneeded for the file you provided.
> (A "PGP Secret Sub-key" according to file.)
>
> I encoded a few amr files and "00 00" seems common and not
> invalid.
>
> The following works here but I believe the main issue is that
> our amr decoder happily decodes the "PGP Secret Sub-key"
> without any error messages so I wonder if the detection is
> wrong at all.
>
> diff --git a/libavformat/amr.c b/libavformat/amr.c
> index 42840a50a3..2645af95c2 100644
> --- a/libavformat/amr.c
> +++ b/libavformat/amr.c
> @@ -186,8 +186,18 @@ static int amrnb_probe(const AVProbeData *p)
> if (mode < 9 && (b[i] & 0x4) == 0x4) {
> int last = b[i];
> int size = amrnb_packed_size[mode];
> + int changes = 0, repeats = 0;
> while (size--) {
> if (b[++i] != last)
> + changes++;
> + else
> + repeats++;
> + last = b[i];
> + if (repeats >= 2) {
> + i += size;
> + size = 0;
> + break;
> + } else if (changes > 4)
> break;
> }
> if (size > 0) {
> @@ -200,7 +210,7 @@ static int amrnb_probe(const AVProbeData *p)
> i++;
> }
> }
> - if (valid > 100 && valid >> 4 > invalid)
> + if (valid > 120 && valid >> 4 > invalid)
Another idea is to require different modes, that should be simpler if you
believe that the sample should not get detected.
Carl Eugen
More information about the ffmpeg-devel
mailing list