[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