[FFmpeg-devel] [PATCH v4 2/4] avformat/matroska{dec, enc} Parse BlockAdditionMapping elements

quietvoid tcchlisop0 at gmail.com
Mon Sep 27 14:58:00 EEST 2021


> quietvoid:
>> Adds handling of dvcC/dvvC block addition mappings.
>> The parsing creates AVDOVIDecoderConfigurationRecord side data for the video track.
>> The configuration block is written when muxing into MKV if DOVI side data is present for the track.
>>
>> In version 2.2 of the Dolby ISOM specification, there is also dvwC but it is not in the Matroska spec.
>>
>> Most of the Matroska element parsing was implemented by Plex developers.
>>
>> Signed-off-by: quietvoid<tcChlisop0 at gmail.com>
>> ---
>>   libavformat/Makefile      |  4 +--
>>   libavformat/matroska.h    |  7 +++++
>>   libavformat/matroskadec.c | 59 +++++++++++++++++++++++++++++++++++++--
>>   libavformat/matroskaenc.c | 45 +++++++++++++++++++++++++++++
>>   4 files changed, 111 insertions(+), 4 deletions(-)
>>
>> diff --git a/libavformat/Makefile b/libavformat/Makefile
>> index c45caa3eed..680030014d 100644
>> --- a/libavformat/Makefile
>> +++ b/libavformat/Makefile
>> @@ -313,11 +313,11 @@ 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 \
>> -                                            vorbiscomment.o wv.o
>> +                                            vorbiscomment.o wv.o dovi_isom.o
>>   OBJS-$(CONFIG_MCA_DEMUXER)               += mca.o
>>   OBJS-$(CONFIG_MCC_DEMUXER)               += mccdec.o subtitles.o
>>   OBJS-$(CONFIG_MD5_MUXER)                 += hashenc.o
>> diff --git a/libavformat/matroska.h b/libavformat/matroska.h
>> index 2d04a6838b..4b2a3310a4 100644
>> --- a/libavformat/matroska.h
>> +++ b/libavformat/matroska.h
>> @@ -111,6 +111,7 @@
>>   #define MATROSKA_ID_TRACKCONTENTENCODING 0x6240
>>   #define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F
>>   #define MATROSKA_ID_TRACKMAXBLKADDID 0x55EE
>> +#define MATROSKA_ID_TRACKBLKADDMAPPING 0x41E4
>>   
>>   /* IDs in the trackvideo master */
>>   #define MATROSKA_ID_VIDEOFRAMERATE 0x2383E3
>> @@ -189,6 +190,12 @@
>>   #define MATROSKA_ID_ENCODINGSIGKEYID 0x47E4
>>   #define MATROSKA_ID_ENCODINGSIGNATURE 0x47E3
>>   
>> +/* IDs in the block addition mapping master */
>> +#define MATROSKA_ID_BLKADDIDVALUE 0x41F0
>> +#define MATROSKA_ID_BLKADDIDNAME 0x41A4
>> +#define MATROSKA_ID_BLKADDIDTYPE 0x41E7
>> +#define MATROSKA_ID_BLKADDIDEXTRADATA 0x41ED
>> +
>>   /* ID in the cues master */
>>   #define MATROSKA_ID_POINTENTRY 0xBB
>>   
>> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
>> index 500c83ac3a..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"
> We use relative paths for headers in the same directory; and this
> inclusion should be added to the headers below, keeping its alphabetical
> ordering. This goes for lots of headers added by you.
>
Had not realized the headers below were relative. Thanks.


>> +
>>   #include "avformat.h"
>>   #include "avio_internal.h"
>>   #include "internal.h"
>> @@ -239,6 +241,13 @@ typedef struct MatroskaTrackOperation {
>>       EbmlList combine_planes;
>>   } MatroskaTrackOperation;
>>   
>> +typedef struct MatroskaBlockAdditionMapping {
>> +    uint64_t value;
>> +    char *name;
>> +    uint64_t type;
>> +    EbmlBin extradata;
>> +} MatroskaBlockAdditionMapping;
>> +
>>   typedef struct MatroskaTrack {
>>       uint64_t num;
>>       uint64_t uid;
>> @@ -269,6 +278,7 @@ typedef struct MatroskaTrack {
>>       int ms_compat;
>>       int needs_decoding;
>>       uint64_t max_block_additional_id;
>> +    EbmlList block_addition_mappings;
>>   
>>       uint32_t palette[AVPALETTE_COUNT];
>>       int has_palette;
>> @@ -419,8 +429,8 @@ typedef struct MatroskaDemuxContext {
>>   // incomplete type (6.7.2 in C90, 6.9.2 in C99).
>>   // Removing the sizes breaks MSVC.
>>   static EbmlSyntax ebml_syntax[3], matroska_segment[9], matroska_track_video_color[15], matroska_track_video[19],
>> -                  matroska_track[32], matroska_track_encoding[6], matroska_track_encodings[2],
>> -                  matroska_track_combine_planes[2], matroska_track_operation[2], matroska_tracks[2],
>> +                  matroska_track[33], matroska_track_encoding[6], matroska_track_encodings[2],
>> +                  matroska_track_combine_planes[2], matroska_track_operation[2], matroska_block_addition_mapping[5], matroska_tracks[2],
>>                     matroska_attachments[2], matroska_chapter_entry[9], matroska_chapter[6], matroska_chapters[2],
>>                     matroska_index_entry[3], matroska_index[2], matroska_tag[3], matroska_tags[2], matroska_seekhead[2],
>>                     matroska_blockadditions[2], matroska_blockgroup[8], matroska_cluster_parsing[8];
>> @@ -570,6 +580,14 @@ static EbmlSyntax matroska_track_operation[] = {
>>       CHILD_OF(matroska_track)
>>   };
>>   
>> +static EbmlSyntax matroska_block_addition_mapping[] = {
>> +    { MATROSKA_ID_BLKADDIDVALUE,      EBML_UINT, 0, 0, offsetof(MatroskaBlockAdditionMapping, value) },
>> +    { MATROSKA_ID_BLKADDIDNAME,       EBML_STR,  0, 0, offsetof(MatroskaBlockAdditionMapping, name) },
>> +    { MATROSKA_ID_BLKADDIDTYPE,       EBML_UINT, 0, 0, offsetof(MatroskaBlockAdditionMapping, type) },
>> +    { MATROSKA_ID_BLKADDIDEXTRADATA,  EBML_BIN,  0, 0, offsetof(MatroskaBlockAdditionMapping, extradata) },
>> +    CHILD_OF(matroska_track)
>> +};
>> +
>>   static EbmlSyntax matroska_track[] = {
>>       { MATROSKA_ID_TRACKNUMBER,           EBML_UINT,  0, 0, offsetof(MatroskaTrack, num) },
>>       { MATROSKA_ID_TRACKNAME,             EBML_UTF8,  0, 0, offsetof(MatroskaTrack, name) },
>> @@ -593,6 +611,7 @@ static EbmlSyntax matroska_track[] = {
>>       { MATROSKA_ID_TRACKOPERATION,        EBML_NEST,  0, 0, offsetof(MatroskaTrack, operation),    { .n = matroska_track_operation } },
>>       { MATROSKA_ID_TRACKCONTENTENCODINGS, EBML_NEST,  0, 0, 0,                                     { .n = matroska_track_encodings } },
>>       { MATROSKA_ID_TRACKMAXBLKADDID,      EBML_UINT,  0, 0, offsetof(MatroskaTrack, max_block_additional_id), { .u = 0 } },
>> +    { MATROSKA_ID_TRACKBLKADDMAPPING,    EBML_NEST,  0, sizeof(MatroskaBlockAdditionMapping), offsetof(MatroskaTrack, block_addition_mappings), { .n = matroska_block_addition_mapping } },
>>       { MATROSKA_ID_SEEKPREROLL,           EBML_UINT,  0, 0, offsetof(MatroskaTrack, seek_preroll), { .u = 0 } },
>>       { MATROSKA_ID_TRACKFLAGENABLED,      EBML_NONE },
>>       { MATROSKA_ID_TRACKFLAGLACING,       EBML_NONE },
>> @@ -2306,6 +2325,38 @@ 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",
> This is wrong and won't work on Windows, where long is always 32bit.
> Furthermore, printing signed values here is absolutely not what we want.
> It is probably best to use hexadecimal values for the type, but decimal
> for the value.

Ok, I had only changed it to long because of warnings.



More information about the ffmpeg-devel mailing list