diff mbox series

[FFmpeg-devel,1/5] avformat/matroskadec: Parse Block Additional Mapping elements

Message ID 20210923004624.476145-1-tcChlisop0@gmail.com
State New
Headers show
Series [FFmpeg-devel,1/5] avformat/matroskadec: Parse Block Additional Mapping elements
Related show

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/makex86 warning New warnings during build
andriy/make_ppc success Make finished
andriy/make_fate_ppc success Make fate finished
andriy/makeppc warning New warnings during build

Commit Message

quietvoid Sept. 23, 2021, 12:46 a.m. UTC
Most of the implementation was done by the Plex developers.

Signed-off-by: quietvoid <tcChlisop0@gmail.com>
---
 libavformat/matroska.h    |  7 ++++++
 libavformat/matroskadec.c | 45 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 50 insertions(+), 2 deletions(-)

Comments

Andreas Rheinhardt Sept. 23, 2021, 12:55 a.m. UTC | #1
quietvoid:
> Most of the implementation was done by the Plex developers.
> 
> Signed-off-by: quietvoid <tcChlisop0@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;
>
quietvoid Sept. 23, 2021, 1:31 a.m. UTC | #2
On 22/09/2021 20.55, Andreas Rheinhardt wrote:
> quietvoid:
>> Most of the implementation was done by the Plex developers.
>>
>> Signed-off-by: quietvoid <tcChlisop0@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.

Okay, will change to uint64_t.

I'm new to this, am I just supposed to update the patches locally and
send them as a new version once the whole series is reviewed?

Sorry, think I responded to the wrong email.
diff mbox series

Patch

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;
+    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;