[FFmpeg-devel] [PATCH v2 4/4] avformat/libopenmpt: Probe file format from file data if possible

Jörn Heusipp osmanx at problemloesungsmaschine.de
Wed Jan 10 14:05:49 EET 2018


On 01/10/2018 12:55 PM, Carl Eugen Hoyos wrote:
> 2018-01-10 12:18 GMT+01:00 Jörn Heusipp <osmanx at problemloesungsmaschine.de>:

>> When building with libopenmpt 0.3, use the libopenmpt file header
>> probing functions for probing. libopenmpt probing functions are
>> allocation-free and designed to be as fast as possible.
>>
>> For libopenmpt 0.2, or when libopenmpt 0.3 file header probing cannot
>> probe successfully due to too small probe buffer, test the filename
>> against the file extensions supported by the libopenmpt library that
>> is actually linked, instead of relying on a hard-coded file extension
>> list. File extension testing is also allocation-free and designed to
>> be fast in libopenmpt. Avoiding a hard-coded file extension list is
>> useful because later libopenmpt versions will likely add support for
>> more module file formats.
>>
>> libopenmpt file header probing is tested regularly against the FATE
>> suite and other diverse file collections by libopenmpt upstream in
>> order to avoid false positives.
>>
>> FATE passes with './configure --enable-libopenmpt' as well as with
>> './configure --enable-libopenmpt --enable-libmodplug'.
>>
>> libopenmpt probing adds about 5%..10% cpu time (depending on precise
>> usage pattern and host CPU and compiler version used for libopenmpt)
>> compared to all current internal FFmpeg probing functions combined in
>> tools/probetest for all of its module formats combined (currently 41
>> modules formats in libopenmpt 0.3.4 and 234 file formats in FFmpeg).
>>
>> Signed-off-by: Jörn Heusipp <osmanx at problemloesungsmaschine.de>
>> ---
>>   libavformat/libopenmpt.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 57 insertions(+)
>>
>> diff --git a/libavformat/libopenmpt.c b/libavformat/libopenmpt.c
>> index 5efbdc4..42b78fb 100644
>> --- a/libavformat/libopenmpt.c
>> +++ b/libavformat/libopenmpt.c
>> @@ -218,6 +218,62 @@ static int read_seek_openmpt(AVFormatContext *s, int stream_idx, int64_t ts, int
>>       return 0;
>>   }
>>
>> +static int probe_openmpt_extension(AVProbeData *p)
>> +{
>> +    const char *ext;
>> +    if (p->filename) {
>> +        ext = strrchr(p->filename, '.');
>> +        if (ext && strlen(ext + 1) > 0) {
>> +            ext++;  /* skip '.' */
>> +            if (openmpt_is_extension_supported(ext) == 1)
>> +                return AVPROBE_SCORE_EXTENSION;
>> +        }
>> +    }
>> +    return 0;
>> +}
>> +
>> +static int read_probe_openmpt(AVProbeData *p)
>> +{
>> +#if OPENMPT_API_VERSION_AT_LEAST(0,3,0)
>> +    int probe_result;
>> +    if (p->buf && p->buf_size > 0) {
>> +        probe_result = openmpt_probe_file_header_without_filesize(
>> +                           OPENMPT_PROBE_FILE_HEADER_FLAGS_DEFAULT,
>> +                           p->buf, p->buf_size,
>> +                           &openmpt_logfunc, NULL, NULL, NULL, NULL, NULL);
>> +        if (probe_result == OPENMPT_PROBE_FILE_HEADER_RESULT_SUCCESS) {
>> +            /* As probing here relies on code external to FFmpeg, do not return
>> +             * AVPROBE_SCORE_MAX in order to reduce the impact in the rare
>> +             * cases of false positives.
>> +             */
>> +            return AVPROBE_SCORE_MIME + 1;
>> +        } else if (probe_result == OPENMPT_PROBE_FILE_HEADER_RESULT_WANTMOREDATA) {
> 
>> +            if (probe_openmpt_extension(p) > 0) {
>> +                return AVPROBE_SCORE_EXTENSION;
> 
> I don't think this is a good idea because it means that a high score is
> reported for WANTMOREDATA.

That is what the first patch did also, however much more convoluted and 
not easy to spot.
In any case, I agree, that does not appear like that good of an idea. 
Will change to AVPROBE_SCORE_RETRY with the next iteration of the patch.


Regards,
Jörn


More information about the ffmpeg-devel mailing list