[FFmpeg-devel] [PATCH v5 2/2] libavformat/webp: add WebP demuxer
Zlomek, Josef
josef at pex.com
Sun Sep 13 06:59:59 EEST 2020
Dne so 12. 9. 2020 22:35 uživatel Carl Eugen Hoyos <ceffmpeg at gmail.com>
napsal:
> Am Fr., 11. Sept. 2020 um 08:36 Uhr schrieb Josef Zlomek <josef at pex.com>:
>
> This is not the requested review, I am just curious about the
> behaviour:
>
> > +static int webp_probe(const AVProbeData *p)
> > +{
> > + const uint8_t *b = p->buf;
> > +
> > + if (AV_RB32(b) == MKBETAG('R', 'I', 'F', 'F') &&
> > + AV_RB32(b + 8) == MKBETAG('W', 'E', 'B', 'P'))
> > + return AVPROBE_SCORE_MAX;
>
> What happens if you pipe several (not animated) webp images
> through your new demuxer?
> Does it behave like the existing pipe demuxer?
>
Piping several WebP images (may be non-animated or animated) is supported.
webp_probe checks if the first one is WebP so the WebP demuxer should be
used.
> +static int resync(AVFormatContext *s, int seek_to_start)
> > +{
> > + WebPDemuxContext *wdc = s->priv_data;
> > + AVIOContext *pb = s->pb;
> > + int ret;
> > + int i;
> > + uint64_t state = 0;
> > +
> > + // ensure seek back for the file header and the first chunk header
> > + if ((ret = ensure_seekback(s, 12 + 8)) < 0)
> > + return ret;
> > +
> > + for (i = 0; i < 12; i++) {
> > + state = (state << 8) | avio_r8(pb);
>
> > + if (i == 11) {
> > + if ((uint32_t) state == MKBETAG('W', 'E', 'B', 'P'))
>
> The cast looks really ugly: Why is it necessary?
>
The signature of the WebP file is the following 12 bytes: "RIFF" <uint32_t
size> "WEBP".
The state is uint64_t. At this point, the state should contain bytes 4-11
of the signature (size and "WEBP") so the code checks that the lower 32
bits are "WEBP".
Alternatively there may be "state & 0xffffffff". I used the typecast as I
have seen it somewhere else (original WebP parser).
Josef
More information about the ffmpeg-devel
mailing list