[vlc-devel] [vlc-commits] mux: mp4: add preliminary support for AV1
Thomas Guillem
thomas at gllm.fr
Thu Oct 18 13:14:13 CEST 2018
On Wed, Oct 17, 2018, at 20:40, Francois Cartegnie wrote:
> vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Oct
> 10 13:39:08 2018 +0200| [c25129d31872f2d7449fff2fa71692cd52d79aac] |
> committer: Francois Cartegnie
>
> mux: mp4: add preliminary support for AV1
>
> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c25129d31872f2d7449fff2fa71692cd52d79aac
> ---
>
> modules/mux/Makefile.am | 2 +-
> modules/mux/mp4/libmp4mux.c | 81 +++++++++++++++++++++++++++++++++++++++++----
> modules/mux/mp4/mp4.c | 4 +++
> 3 files changed, 80 insertions(+), 7 deletions(-)
>
> diff --git a/modules/mux/Makefile.am b/modules/mux/Makefile.am
> index e805b36bb8..0536e07a42 100644
> --- a/modules/mux/Makefile.am
> +++ b/modules/mux/Makefile.am
> @@ -6,7 +6,7 @@ libmux_asf_plugin_la_SOURCES = mux/asf.c demux/asf/libasf_guid.h
> libmux_avi_plugin_la_SOURCES = mux/avi.c demux/avi/bitmapinfoheader.h
> libmux_mp4_plugin_la_SOURCES = mux/mp4/mp4.c \
> mux/mp4/libmp4mux.c mux/mp4/libmp4mux.h \
> - demux/mp4/libmp4.h \
> + demux/mp4/libmp4.h av1_pack.h \
This broke distcheck. It should be mux/av1_pack.h. I fixed and push forced.
> packetizer/hxxx_nal.c packetizer/hxxx_nal.h \
> packetizer/hevc_nal.c packetizer/hevc_nal.h \
> packetizer/h264_nal.c packetizer/h264_nal.h
> diff --git a/modules/mux/mp4/libmp4mux.c b/modules/mux/mp4/libmp4mux.c
> index 4f0b0f8544..a78f8d8794 100644
> --- a/modules/mux/mp4/libmp4mux.c
> +++ b/modules/mux/mp4/libmp4mux.c
> @@ -25,10 +25,11 @@
> #endif
>
> #include "libmp4mux.h"
> -#include "../demux/mp4/libmp4.h" /* flags */
> -#include "../packetizer/hevc_nal.h"
> -#include "../packetizer/h264_nal.h" /* h264_AnnexB_get_spspps */
> -#include "../packetizer/hxxx_nal.h"
> +#include "../../demux/mp4/libmp4.h" /* flags */
> +#include "../../packetizer/hevc_nal.h"
> +#include "../../packetizer/h264_nal.h" /* h264_AnnexB_get_spspps */
> +#include "../../packetizer/hxxx_nal.h"
> +#include "../../packetizer/iso_color_tables.h"
>
> #include <vlc_es.h>
> #include <vlc_iso_lang.h>
> @@ -687,6 +688,50 @@ static bo_t *GetxxxxTag(es_format_t *p_fmt, const
> char *tag)
> return box;
> }
>
> +static bo_t *GetColrBox(const video_format_t *p_vfmt, bool b_mov)
> +{
> + bo_t *p_box = box_new("colr");
> + if(p_box)
> + {
> + bo_add_mem(p_box, 4, b_mov ? "nclc" : "nclx");
> + bo_add_16be(p_box, vlc_primaries_to_iso_23001_8_cp(p_vfmt-
> >primaries));
> + bo_add_16be(p_box, vlc_xfer_to_iso_23001_8_tc(p_vfmt-
> >transfer));
> + bo_add_16be(p_box, vlc_coeffs_to_iso_23001_8_mc(p_vfmt-
> >space));
> + bo_add_8(p_box, p_vfmt->b_color_range_full ? 0x80 : 0x00);
> + }
> + return p_box;
> +}
> +
> +static bo_t *GetMdcv(const video_format_t *p_vfmt)
> +{
> + if(!p_vfmt->mastering.max_luminance)
> + return NULL;
> + bo_t *p_box = box_new("mdcv");
> + if(p_box)
> + {
> + for(int i=0; i<6; i++)
> + bo_add_16be(p_box, p_vfmt->mastering.primaries[i]);
> + bo_add_16be(p_box, p_vfmt->mastering.white_point[0]);
> + bo_add_16be(p_box, p_vfmt->mastering.white_point[1]);
> + bo_add_32be(p_box, p_vfmt->mastering.max_luminance);
> + bo_add_32be(p_box, p_vfmt->mastering.min_luminance);
> + }
> + return p_box;
> +}
> +
> +static bo_t *GetClli(const video_format_t *p_vfmt)
> +{
> + if(!p_vfmt->lighting.MaxFALL)
> + return NULL;
> + bo_t *p_box = box_new("clli");
> + if(p_box)
> + {
> + bo_add_16be(p_box, p_vfmt->lighting.MaxCLL);
> + bo_add_16be(p_box, p_vfmt->lighting.MaxFALL);
> + }
> + return p_box;
> +}
> +
> static bo_t *GetAvcCTag(es_format_t *p_fmt)
> {
> bo_t *avcC = box_new("avcC");/* FIXME use better value */
> @@ -982,8 +1027,16 @@ static bo_t *GetVideBox(vlc_object_t *p_obj,
> mp4mux_trackinfo_t *p_track, bool b
> bo_add_16be(vide, 1); // frames count per sample
>
> // compressor name;
> - for (int i = 0; i < 32; i++)
> - bo_add_8(vide, 0);
> + uint8_t compressor_name[32] = {0};
> + switch (p_track->fmt.i_codec)
> + {
> + case VLC_CODEC_AV1:
> + memcpy(compressor_name, "\012AOM Coding", 11);
> + break;
> + default:
> + break;
> + }
> + bo_add_mem(vide, 32, compressor_name);
>
> bo_add_16be(vide, 0x18); // depth
> bo_add_16be(vide, 0xffff); // predefined
> @@ -991,6 +1044,13 @@ static bo_t *GetVideBox(vlc_object_t *p_obj,
> mp4mux_trackinfo_t *p_track, bool b
> /* add an ES Descriptor */
> switch(p_track->fmt.i_codec)
> {
> + case VLC_CODEC_AV1:
> + box_gather(vide, GetxxxxTag(&p_track->fmt, "av1C"));
> + box_gather(vide, GetColrBox(&p_track->fmt.video, b_mov));
> + box_gather(vide, GetMdcv(&p_track->fmt.video));
> + box_gather(vide, GetClli(&p_track->fmt.video));
> + break;
> +
> case VLC_CODEC_MP4V:
> case VLC_CODEC_MPGV:
> box_gather(vide, GetESDS(p_track));
> @@ -1877,6 +1937,15 @@ bool mp4mux_CanMux(vlc_object_t *p_obj, const
> es_format_t *p_fmt,
> case VLC_CODEC_VC1:
> case VLC_CODEC_WMAP:
> break;
> + case VLC_CODEC_AV1:
> + /* Extradata is an AVC1DecoderConfigurationRecord */
> + if(p_fmt->i_extra < 4 || ((uint8_t *)p_fmt->p_extra)[0] !=
> 0x81)
> + {
> + if(p_obj)
> + msg_Err(p_obj, "Can't mux AV1 without extradata");
> + return false;
> + }
> + break;
> case VLC_CODEC_H264:
> if(!p_fmt->i_extra && p_obj)
> msg_Warn(p_obj, "H264 muxing from AnnexB source will set an
> incorrect default profile");
> diff --git a/modules/mux/mp4/mp4.c b/modules/mux/mp4/mp4.c
> index c2828b39f6..7e31a6fb1e 100644
> --- a/modules/mux/mp4/mp4.c
> +++ b/modules/mux/mp4/mp4.c
> @@ -43,6 +43,7 @@
> #include "../demux/mp4/libmp4.h"
> #include "libmp4mux.h"
> #include "../packetizer/hxxx_nal.h"
> +#include "../av1_pack.h"
>
> /
> *****************************************************************************
> * Module descriptor
> @@ -577,6 +578,9 @@ static block_t * BlockDequeue(sout_input_t *p_input,
> mp4_stream_t *p_stream)
>
> switch(p_stream->mux.fmt.i_codec)
> {
> + case VLC_CODEC_AV1:
> + p_block = AV1_Pack_Sample(p_block);
> + break;
> case VLC_CODEC_H264:
> case VLC_CODEC_HEVC:
> p_block = hxxx_AnnexB_to_xVC(p_block, 4);
>
> _______________________________________________
> vlc-commits mailing list
> vlc-commits at videolan.org
> https://mailman.videolan.org/listinfo/vlc-commits
More information about the vlc-devel
mailing list