[FFmpeg-devel] [PATCH 3/3] avformat/movenc: Add support for AVIF muxing
James Zern
jzern at google.com
Wed Apr 13 20:21:54 EEST 2022
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
> 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
> 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.
> [...]
> @@ -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.
> @@ -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.
More information about the ffmpeg-devel
mailing list