[FFmpeg-devel] [PATCH v2 3/5] avformat/s337m: Make available as subdemuxer

Tomas Härdin tjoppen at acc.umu.se
Tue Aug 6 15:07:52 EEST 2019


tis 2019-08-06 klockan 13:50 +0200 skrev Nicolas Gaullier:
> +int avpriv_s337m_probe_stream(void *avc, AVIOContext *pb, AVStream
> **st, int size)
> +{
> +    if ( size >= S337M_MIN_OFFSET &&
> +        ((*st)->codecpar->codec_id == AV_CODEC_ID_PCM_S16LE ||
> (*st)->codecpar->codec_id == AV_CODEC_ID_PCM_S24LE) &&
> +               (*st)->codecpar->channels == 2) {
> +        uint8_t *buf;
> +        int64_t data_offset;
> +        int pos = 0;
> +        double s337m_phase;
> +
> +        size = FFMIN(size, S337M_MAX_OFFSET);
> +        if (!(buf = av_mallocz(size)))
> +            return AVERROR(ENOMEM);

braces missing here

> +        data_offset = avio_tell(pb);
> +        if (avio_read(pb, buf, size) != size) {
> +            av_freep(&buf);
> +            return AVERROR(EIO);
> +        }
> +        avio_seek(pb, data_offset, SEEK_SET);
> +
> +        while (pos < size - 9 && !buf[pos])
> +            pos++;

and here

> +        if (pos < size - 9 &&
> +            (s337m_phase = (double)pos * 4 / (*st)->codecpar-
> >bits_per_coded_sample / (*st)->codecpar->sample_rate) >=
> S337M_PHASE_PROBE_MIN) {

Can this be turned into an integer-only test?
I'd put the assignment outside the if since it's a bit involved.

> +#ifndef AVFORMAT_S337M_H
> +#define AVFORMAT_S337M_H
> +
> +#define MARKER_16LE         0x72F81F4E
> +#define MARKER_20LE         0x20876FF0E154
> +#define MARKER_24LE         0x72F8961F4EA5
> +
> +#define IS_16LE_MARKER(state)   ((state & 0xFFFFFFFF) ==
> MARKER_16LE)
> +#define IS_20LE_MARKER(state)   ((state & 0xF0FFFFF0FFFF) ==
> MARKER_20LE)
> +#define IS_24LE_MARKER(state)   ((state & 0xFFFFFFFFFFFF) ==
> MARKER_24LE)
> +#define IS_LE_MARKER(state)     (IS_16LE_MARKER(state) ||
> IS_20LE_MARKER(state) || IS_24LE_MARKER(state))
> +
> +#define S337M_MIN_OFFSET 1601*4
> +#define S337M_MAX_OFFSET 2002*6
> +
> +#define S337M_PHASE_PROBE_MIN   0.000000
> +#define DOLBY_E_PHASE_MIN       0.000610
> +#define DOLBY_E_PHASE_MAX       0.001050

These macros should probably have an AVPRIV_ prefix or similar,
assuming they're visible to users (not sure)

/Tomas



More information about the ffmpeg-devel mailing list