vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Dec 20 15:05:30 2018 +0100| [3d5290f7d2dd99b40e15dbc93d31556f62856957] | committer: Francois Cartegnie
mux: mp4: generate AV1 extradata when missing > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3d5290f7d2dd99b40e15dbc93d31556f62856957 --- modules/mux/Makefile.am | 2 ++ modules/mux/mp4/libmp4mux.c | 8 -------- modules/mux/mp4/mp4.c | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/modules/mux/Makefile.am b/modules/mux/Makefile.am index b3f916bae5..581e8a1dd9 100644 --- a/modules/mux/Makefile.am +++ b/modules/mux/Makefile.am @@ -13,6 +13,8 @@ libmux_mp4_plugin_la_SOURCES = mux/mp4/mp4.c \ packetizer/hxxx_nal.c packetizer/hxxx_nal.h \ packetizer/hevc_nal.c packetizer/hevc_nal.h \ packetizer/h264_nal.c packetizer/h264_nal.h +libmux_mp4_plugin_la_SOURCES += $(extradata_builder_SOURCES) + libmux_mpjpeg_plugin_la_SOURCES = mux/mpjpeg.c libmux_ps_plugin_la_SOURCES = \ mux/mpeg/pes.c mux/mpeg/pes.h \ diff --git a/modules/mux/mp4/libmp4mux.c b/modules/mux/mp4/libmp4mux.c index 366a989f57..4581417799 100644 --- a/modules/mux/mp4/libmp4mux.c +++ b/modules/mux/mp4/libmp4mux.c @@ -2255,15 +2255,7 @@ bool mp4mux_CanMux(vlc_object_t *p_obj, const es_format_t *p_fmt, case VLC_CODEC_YUYV: 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) diff --git a/modules/mux/mp4/mp4.c b/modules/mux/mp4/mp4.c index 506dc3c226..8413a393bf 100644 --- a/modules/mux/mp4/mp4.c +++ b/modules/mux/mp4/mp4.c @@ -44,6 +44,7 @@ #include "libmp4mux.h" #include "../packetizer/hxxx_nal.h" #include "../av1_pack.h" +#include "../extradata.h" /***************************************************************************** * Module descriptor @@ -130,6 +131,8 @@ typedef struct mp4mux_trackinfo_t *tinfo; const es_format_t *p_fmt; + mux_extradata_builder_t *extrabuilder; + /* index */ vlc_tick_t i_length_neg; @@ -177,6 +180,9 @@ typedef struct static void mp4_stream_Delete(mp4_stream_t *p_stream) { + if(p_stream->extrabuilder) + mux_extradata_builder_Delete(p_stream->extrabuilder); + /* mp4 frag */ if (p_stream->p_held_entry) { @@ -520,6 +526,7 @@ static int AddStream(sout_mux_t *p_mux, sout_input_t *p_input) return VLC_ENOMEM; } + p_stream->extrabuilder = mux_extradata_builder_New(p_input->p_fmt->i_codec); p_stream->p_fmt = p_input->p_fmt; p_input->p_sys = p_stream; @@ -602,6 +609,17 @@ static block_t * BlockDequeue(sout_input_t *p_input, mp4_stream_t *p_stream) if(unlikely(!p_block)) return NULL; + /* Create on the fly extradata as packetizer is not in the loop */ + if(p_stream->extrabuilder && !mp4mux_track_HasSamplePriv(p_stream->tinfo)) + { + mux_extradata_builder_Feed(p_stream->extrabuilder, + p_block->p_buffer, p_block->i_buffer); + const uint8_t *p_extra; + size_t i_extra = mux_extradata_builder_Get(p_stream->extrabuilder, &p_extra); + if(i_extra) + mp4mux_track_SetSamplePriv(p_stream->tinfo, p_extra, i_extra); + } + switch(p_stream->p_fmt->i_codec) { case VLC_CODEC_AV1: _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
