quietvoid: > Most of the implementation was done by the Plex developers. > > Signed-off-by: quietvoid <tcchlis...@gmail.com> > --- > libavformat/matroska.h | 7 ++++++ > libavformat/matroskadec.c | 45 +++++++++++++++++++++++++++++++++++++-- > 2 files changed, 50 insertions(+), 2 deletions(-) > > 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..8ae553953d 100644 > --- a/libavformat/matroskadec.c > +++ b/libavformat/matroskadec.c > @@ -239,6 +239,13 @@ typedef struct MatroskaTrackOperation { > EbmlList combine_planes; > } MatroskaTrackOperation; > > +typedef struct MatroskaBlockAdditionMapping { > + int value; > + char *name; > + int type;
This is wrong and won't work on big endian systems: Our EBML_UINT always expects a target element of type uint64_t. > + EbmlBin extradata; > +} MatroskaBlockAdditionMapping; > + > typedef struct MatroskaTrack { > uint64_t num; > uint64_t uid; > @@ -269,6 +276,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 +427,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 +578,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 +609,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 +2323,26 @@ static int mkv_parse_video_projection(AVStream *st, > const MatroskaTrack *track, > return 0; > } > > +static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream > *st, const MatroskaTrack *track) > +{ > + int i, ret; > + const EbmlList *mappings_list = &track->block_addition_mappings; > + MatroskaBlockAdditionMapping *mappings = mappings_list->elem; > + > + for (i = 0; i < mappings_list->nb_elem; i++) { > + MatroskaBlockAdditionMapping *mapping = &mappings[i]; > + > + switch (mapping->type) { > + default: > + av_log(s, AV_LOG_DEBUG, > + "Unknown block additional mapping type %i, value %i, name > \"%s\"\n", > + mapping->type, mapping->value, mapping->name ? > mapping->name : ""); > + } > + } > + > + return 0; > +} > + > static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum > AVCodecID *codec_id) > { > const AVCodecTag *codec_tags; > @@ -2893,6 +2930,10 @@ static int matroska_parse_tracks(AVFormatContext *s) > if (track->flag_textdescriptions) > st->disposition |= AV_DISPOSITION_DESCRIPTIONS; > } > + > + ret = mkv_parse_block_addition_mappings(s, st, track); > + if (ret < 0) > + return ret; > } > > return 0; > _______________________________________________ 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".