[FFmpeg-devel] [PATCH 3/3] avformat/movenc: Add support for AVIF muxing

Vignesh Venkatasubramanian vigneshv at google.com
Wed Apr 13 23:41:34 EEST 2022


On Wed, Apr 13, 2022 at 10:22 AM James Zern <jzern at google.com> wrote:
>
> On Mon, Mar 28, 2022 at 1:49 PM Vignesh Venkatasubramanian
> <vigneshv-at-google.com at ffmpeg.org> wrote:
> >
> > Add an AVIF muxer by re-using the existing the mov/mp4 muxer.
> >
> > AVIF Specifiation: https://aomediacodec.github.io/av1-avif
> >
>
> Specification
>

Fixed.

> > Sample usage for still image:
> > ffmpeg -i image.png -c:v libaom-av1 -avif-image 1 image.avif
> >
> > Sample usage for animated AVIF image:
> > ffmpeg -i video.mp4 animated.avif
> >
> > We can re-use any of the AV1 encoding options that will make
> > sense for image encoding (like bitrate, tiles, encoding speed,
> > etc).
> >
> > The files generated by this muxer has been verified to be valid
> > AVIF files by the following:
> > 1) Displays on Chrome (both still and animated images).
> > 2) Displays on Firefox (only still images, firefox does not support
> >    animated AVIF yet).
> > 3) Verfied to be valid by Compliance Warden:
>
> Verified
>

Fixed.

> >    https://github.com/gpac/ComplianceWarden
> >
> > Fixes the encoder/muxer part of Trac Ticket #7621
> >
> > Signed-off-by: Vignesh Venkatasubramanian <vigneshv at google.com>
> > ---
> >  configure                |   1 +
> >  libavformat/allformats.c |   1 +
> >  libavformat/movenc.c     | 337 ++++++++++++++++++++++++++++++++++++---
> >  libavformat/movenc.h     |   5 +
> >  4 files changed, 319 insertions(+), 25 deletions(-)
> >
>
> There might be some other issues, you can try tools/patcheck.
>

Thanks, i ran this and only found a couple of other "} before else-if"
warnings. In those cases, i was just being consistent with the code
around it.

> > [...]
> > @@ -5068,6 +5231,31 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s)
> >      // compatible brand a second time.
> >      if (mov->mode == MODE_ISM) {
> >          ffio_wfourcc(pb, "piff");
> > +    } else if (mov->mode == MODE_AVIF) {
> > +        const AVPixFmtDescriptor *pix_fmt_desc =
> > +            av_pix_fmt_desc_get(s->streams[0]->codecpar->format);
> > +        const int depth = pix_fmt_desc->comp[0].depth;
> > +        if (mov->is_animated_avif) {
> > +            // For animated AVIF, major brand is "avis". Add "avif" as a
> > +            // compatible brand.
> > +            ffio_wfourcc(pb, "avif");
> > +            ffio_wfourcc(pb, "msf1");
> > +            ffio_wfourcc(pb, "iso8");
> > +        }
> > +        ffio_wfourcc(pb, "mif1");
> > +        ffio_wfourcc(pb, "miaf");
> > +        if (depth == 8 || depth == 10) {
> > +            // MA1B and MA1A brands are based on AV1 profile. Short hand for
> > +            // computing that is based on chroma subsampling type. 420 chroma
> > +            // subsampling is MA1B.  444 chroma subsampling is MA1A.
> > +            if (pix_fmt_desc->log2_chroma_w == 0 && pix_fmt_desc->log2_chroma_h == 0) {
>
> !... is the preferred style.

Done.

>
> > @@ -6773,12 +6983,13 @@ static int mov_init(AVFormatContext *s)
> >                          pix_fmt == AV_PIX_FMT_MONOWHITE ||
> >                          pix_fmt == AV_PIX_FMT_MONOBLACK;
> >              }
> > -            if (track->par->codec_id == AV_CODEC_ID_VP9 ||
> > -                track->par->codec_id == AV_CODEC_ID_AV1) {
> > -                if (track->mode != MODE_MP4) {
> > -                    av_log(s, AV_LOG_ERROR, "%s only supported in MP4.\n", avcodec_get_name(track->par->codec_id));
> > -                    return AVERROR(EINVAL);
> > -                }
> > +            if (track->par->codec_id == AV_CODEC_ID_VP9 && track->mode != MODE_MP4) {
> > +                av_log(s, AV_LOG_ERROR, "%s only supported in MP4.\n", avcodec_get_name(track->par->codec_id));
> > +               return AVERROR(EINVAL);
>
> This is indented with tabs.

Oops, fixed.

-- 
Vignesh


More information about the ffmpeg-devel mailing list