On Sat, Sep 25, 2021 at 11:58 PM quietvoid <tcchlis...@gmail.com> wrote: > > The parsing was implemented in a new dovi_isom file for the > unification of the mov/mpegts DOVI parsing into one function, in a following > patch. > > Most of the Matroska elements implementation was done by Plex developers. > > Signed-off-by: quietvoid <tcchlis...@gmail.com> > --- > libavformat/Makefile | 2 +- > libavformat/dovi_isom.c | 80 +++++++++++++++++++++++++++++++++++++++ > libavformat/dovi_isom.h | 29 ++++++++++++++ > libavformat/matroskadec.c | 15 ++++++++ > 4 files changed, 125 insertions(+), 1 deletion(-) > create mode 100644 libavformat/dovi_isom.c > create mode 100644 libavformat/dovi_isom.h > > diff --git a/libavformat/Makefile b/libavformat/Makefile > index c45caa3eed..61a1fecf6c 100644 > --- a/libavformat/Makefile > +++ b/libavformat/Makefile > @@ -313,7 +313,7 @@ OBJS-$(CONFIG_M4V_MUXER) += rawenc.o > OBJS-$(CONFIG_MATROSKA_DEMUXER) += matroskadec.o matroska.o \ > flac_picture.o isom_tags.o > rmsipr.o \ > oggparsevorbis.o vorbiscomment.o > \ > - qtpalette.o replaygain.o > + qtpalette.o replaygain.o > dovi_isom.o > OBJS-$(CONFIG_MATROSKA_MUXER) += matroskaenc.o matroska.o \ > av1.o avc.o hevc.o isom_tags.o \ > flacenc_header.o avlanguage.o \ > diff --git a/libavformat/dovi_isom.c b/libavformat/dovi_isom.c > new file mode 100644 > index 0000000000..2c0a49c993 > --- /dev/null > +++ b/libavformat/dovi_isom.c > @@ -0,0 +1,80 @@ > +/* > + * DOVI ISO Media common code > + * Copyright (c) 2021 quietvoid > + * > + * This file is part of FFmpeg. > + * > + * FFmpeg 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. > + * > + * FFmpeg 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 FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + */ > + > +#include "libavutil/dovi_meta.h" > + > +#include "avformat.h" > +#include "dovi_isom.h" > + > +int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t > *buf_ptr, uint64_t size) > +{ > + uint32_t buf; > + AVDOVIDecoderConfigurationRecord *dovi; > + size_t dovi_size; > + int ret; > + > + if (size > (1 << 30) || size < 4) > + return AVERROR_INVALIDDATA; > + > + dovi = av_dovi_alloc(&dovi_size); > + if (!dovi) > + return AVERROR(ENOMEM); > + > + dovi->dv_version_major = *buf_ptr++; // 8 bits > + dovi->dv_version_minor = *buf_ptr++; // 8 bits > + > + buf = *buf_ptr++ << 8; > + buf |= *buf_ptr++; > + > + dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits > + dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits > + dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit > + dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit > + dovi->bl_present_flag = buf & 0x01; // 1 bit > + > + // Has enough remaining data > + if (size >= 5) { > + dovi->dv_bl_signal_compatibility_id = ((*buf_ptr++) >> 4) & 0x0f; // > 4 bits > + } else { > + // 0 stands for None > + // Dolby Vision V1.2.93 profiles and levels > + dovi->dv_bl_signal_compatibility_id = 0; > + } > + > + ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF, > + (uint8_t *)dovi, dovi_size); > + if (ret < 0) { > + av_free(dovi); > + return ret; > + } > + > + av_log(s, AV_LOG_TRACE, "DOVI, version: %d.%d, profile: %d, level: %d, " > + "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n", > + dovi->dv_version_major, dovi->dv_version_minor, > + dovi->dv_profile, dovi->dv_level, > + dovi->rpu_present_flag, > + dovi->el_present_flag, > + dovi->bl_present_flag, > + dovi->dv_bl_signal_compatibility_id > + ); > + > + return 0; > +} > diff --git a/libavformat/dovi_isom.h b/libavformat/dovi_isom.h > new file mode 100644 > index 0000000000..4c313046a7 > --- /dev/null > +++ b/libavformat/dovi_isom.h > @@ -0,0 +1,29 @@ > +/* > + * DOVI ISO Media common code > + * Copyright (c) 2021 quietvoid > + * > + * This file is part of FFmpeg. > + * > + * FFmpeg 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. > + * > + * FFmpeg 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 FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 > USA > + */ > + > +#ifndef AVFORMAT_DOVI_ISOM_H > +#define AVFORMAT_DOVI_ISOM_H > + > +#include "avformat.h" > + > +int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t > *buf_ptr, uint64_t size); > + > +#endif /* AVFORMAT_DOVI_ISOM_H */ > diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c > index 74c3fbc2a4..a50851b8d3 100644 > --- a/libavformat/matroskadec.c > +++ b/libavformat/matroskadec.c > @@ -51,6 +51,8 @@ > #include "libavcodec/mpeg4audio.h" > #include "libavcodec/packet_internal.h" > > +#include "libavformat/dovi_isom.h" > + > #include "avformat.h" > #include "avio_internal.h" > #include "internal.h" > @@ -2323,15 +2325,28 @@ static int mkv_parse_video_projection(AVStream *st, > const MatroskaTrack *track, > return 0; > } > > +static int mkv_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const > MatroskaTrack *track, > + EbmlBin *bin) > +{ > + return ff_isom_parse_dvcc_dvvc(s, st, bin->data, bin->size); > +} > + > static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream > *st, const MatroskaTrack *track) > { > const EbmlList *mappings_list = &track->block_addition_mappings; > MatroskaBlockAdditionMapping *mappings = mappings_list->elem; > + int ret; > > for (int i = 0; i < mappings_list->nb_elem; i++) { > MatroskaBlockAdditionMapping *mapping = &mappings[i]; > > switch (mapping->type) { > + case MKBETAG('d','v','c','C'): > + case MKBETAG('d','v','v','C'): > + if ((ret = mkv_parse_dvcc_dvvc(s, st, track, > &mapping->extradata)) < 0) > + return ret; > + > + break; > default: > av_log(s, AV_LOG_DEBUG, > "Unknown block additional mapping type %ld, value %ld, > name \"%s\"\n", > -- > 2.33.0
I prefer split dovi_isom.c/.h with DOVI parse/write as one commit, MKV/MOV/MPEG TS change & refactoring part as the other commits _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".