vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Dec 20 11:44:11 2018 +0100| [50ee8803414b024411674ffcba2cf0ba495c7258] | committer: Francois Cartegnie
mux: add extradata builder helper > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=50ee8803414b024411674ffcba2cf0ba495c7258 --- modules/mux/Makefile.am | 3 ++ modules/mux/extradata.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++ modules/mux/extradata.h | 26 +++++++++++ 3 files changed, 151 insertions(+) diff --git a/modules/mux/Makefile.am b/modules/mux/Makefile.am index eb63724015..b3f916bae5 100644 --- a/modules/mux/Makefile.am +++ b/modules/mux/Makefile.am @@ -1,5 +1,8 @@ muxdir = $(pluginsdir)/mux +extradata_builder_SOURCES = mux/extradata.c mux/extradata.h \ + packetizer/av1_obu.c + libmux_dummy_plugin_la_SOURCES = mux/dummy.c libmux_asf_plugin_la_SOURCES = mux/asf.c demux/asf/libasf_guid.h diff --git a/modules/mux/extradata.c b/modules/mux/extradata.c new file mode 100644 index 0000000000..79076cc23e --- /dev/null +++ b/modules/mux/extradata.c @@ -0,0 +1,122 @@ +/***************************************************************************** + * extradata.c: Muxing extradata builder/gatherer + ***************************************************************************** + * Copyright (C) 2018 VideoLabs, VLC authors and VideoLAN + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <vlc_common.h> +#include <vlc_codec.h> + +#include "extradata.h" +#include "../packetizer/av1_obu.h" + +struct mux_extradata_builder_cb +{ + int (*pf_init)(mux_extradata_builder_t *); + void (*pf_feed)(mux_extradata_builder_t *, const uint8_t *, size_t); + void (*pf_deinit)(mux_extradata_builder_t *); +}; + +struct mux_extradata_builder_t +{ + struct mux_extradata_builder_cb cb; + void *priv; + uint8_t *p_extra; + size_t i_extra; + vlc_fourcc_t fcc; +}; + +static void av1_extradata_builder_Feed(mux_extradata_builder_t *m, + const uint8_t *p_data, size_t i_data) +{ + if(m->i_extra) + return; + + AV1_OBU_iterator_ctx_t ctx; + AV1_OBU_iterator_init(&ctx, p_data, i_data); + const uint8_t *p_obu; size_t i_obu; + while(AV1_OBU_iterate_next(&ctx, &p_obu, &i_obu)) + { + enum av1_obu_type_e OBUtype = AV1_OBUGetType(p_obu); + if(OBUtype != AV1_OBU_SEQUENCE_HEADER) + continue; + av1_OBU_sequence_header_t *p_sh = AV1_OBU_parse_sequence_header(p_obu, i_obu); + if(p_sh) + { + m->i_extra = AV1_create_DecoderConfigurationRecord(&m->p_extra, p_sh, + 1, (const uint8_t **)&p_obu, &i_obu); + AV1_release_sequence_header(p_sh); + } + break; + } +} + +const struct mux_extradata_builder_cb av1_cb = +{ + NULL, + av1_extradata_builder_Feed, + NULL, +}; + +void mux_extradata_builder_Delete(mux_extradata_builder_t *m) +{ + if(m->cb.pf_deinit) + m->cb.pf_deinit(m); + free(m->p_extra); + free(m); +} + +mux_extradata_builder_t * mux_extradata_builder_New(vlc_fourcc_t fcc) +{ + const struct mux_extradata_builder_cb *cb; + switch(fcc) + { + case VLC_CODEC_AV1: + cb = &av1_cb; + break; + default: + return NULL; + } + + mux_extradata_builder_t *m = calloc(1, sizeof(*m)); + if(m) + { + m->fcc = fcc; + m->cb = *cb; + if(m->cb.pf_init && m->cb.pf_init(m) != 0) + { + free(m); + m = NULL; + } + } + return m; +} + +size_t mux_extradata_builder_Get(mux_extradata_builder_t *m, const uint8_t **a) +{ + *a = m->p_extra; + return m->i_extra; +} + +void mux_extradata_builder_Feed(mux_extradata_builder_t *m, + const uint8_t *p_data, size_t i_data) +{ + m->cb.pf_feed(m, p_data, i_data); +} diff --git a/modules/mux/extradata.h b/modules/mux/extradata.h new file mode 100644 index 0000000000..6754f84294 --- /dev/null +++ b/modules/mux/extradata.h @@ -0,0 +1,26 @@ +/***************************************************************************** + * extradata.h: Muxing extradata builder/gatherer + ***************************************************************************** + * Copyright (C) 2018 VideoLabs, VLC authors and VideoLAN + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +typedef struct mux_extradata_builder_t mux_extradata_builder_t; + +mux_extradata_builder_t * mux_extradata_builder_New(vlc_fourcc_t); +void mux_extradata_builder_Delete(mux_extradata_builder_t *); +void mux_extradata_builder_Feed(mux_extradata_builder_t *, const uint8_t *, size_t); +size_t mux_extradata_builder_Get(mux_extradata_builder_t *, const uint8_t **); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
