All pastes #1854555 Raw Edit

Someone

public c v1 · immutable
#1854555 ·published 2010-03-28 12:32 UTC
rendered paste body
From 422c42cf9e4865ef8e59ac4ec62342b18b033e5b Mon Sep 17 00:00:00 2001From: Anton Khirnov <wyskas@gmail.com>Date: Sun, 28 Mar 2010 14:21:42 +0200Subject: [PATCH 2/2] demux_mkv: read tags.--- TOOLS/matroska.py       |    9 +++++++++ libmpdemux/demux_mkv.c  |   18 +++++++++++++++++- libmpdemux/ebml_defs.c  |   31 +++++++++++++++++++++++++++++-- libmpdemux/ebml_types.h |   33 +++++++++++++++++++++++++++++++-- 4 files changed, 86 insertions(+), 5 deletions(-)diff --git a/TOOLS/matroska.py b/TOOLS/matroska.pyindex 77268c8..410678d 100755--- a/TOOLS/matroska.py+++ b/TOOLS/matroska.py@@ -159,7 +159,16 @@ elements_matroska = (             'Tag*, 7373, sub', (                 'Targets, 63c0, sub', (                     'TargetTypeValue, 68ca, uint',+                    'TargetTrackUID, 63c5, uint',+                    'TargetEditionUID, 63c9, uint',+                    'TargetChapterUID, 63c4, uint',+                    'TargetAttachmentUID, 63c6, uint',                  ),+                'SimpleTag*, 67c8, sub', (+                    'TagName, 45a3, str',+                    'TagLanguage, 447a, str',+                    'TagString, 4487, str'+                ),             ),         ),     ),diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.cindex c1f6dd4..5740e4a 100644--- a/libmpdemux/demux_mkv.c+++ b/libmpdemux/demux_mkv.c@@ -889,7 +889,23 @@ static int demux_mkv_read_chapters(struct demuxer *demuxer)  static int demux_mkv_read_tags(demuxer_t *demuxer) {-    ebml_read_skip(demuxer->stream, NULL);+    stream_t *s = demuxer->stream;++    struct ebml_parse_ctx parse_ctx = {};+    struct ebml_tags           tags = {};+    if (ebml_read_element(s, &parse_ctx, &tags, &ebml_tags_desc) < 0)+        return 1;++    for (int i = 0; i < tags.n_tag; i++) {+        struct ebml_tag tag = tags.tag[i];+        if (tag.targets.target_track_uid  || tag.targets.target_edition_uid ||+            tag.targets.target_chapter_uid || tag.targets.target_attachment_uid)+            continue;++        for (int j; j < tag.n_simple_tag; j++)+            demux_info_add_len(demuxer, tag.simple_tag[j].tag_name, tag.simple_tag[j].tag_string);+    }+     return 0; } diff --git a/libmpdemux/ebml_defs.c b/libmpdemux/ebml_defs.cindex f0296a3..918c505 100644--- a/libmpdemux/ebml_defs.c+++ b/libmpdemux/ebml_defs.c@@ -1,17 +1,44 @@ // Generated by TOOLS/matroska.py, do not edit manually  +E("TagString", tag_string, EBML_TYPE_STR)++E("TagLanguage", tag_language, EBML_TYPE_STR)++E("TagName", tag_name, EBML_TYPE_STR)++#define N simple_tag+E_S("SimpleTag", 3)+F(MATROSKA_ID_TAGNAME, tag_name, 0)+F(MATROSKA_ID_TAGLANGUAGE, tag_language, 0)+F(MATROSKA_ID_TAGSTRING, tag_string, 0)+}};+#undef N++E("TargetAttachmentUID", target_attachment_uid, EBML_TYPE_UINT)++E("TargetChapterUID", target_chapter_uid, EBML_TYPE_UINT)++E("TargetEditionUID", target_edition_uid, EBML_TYPE_UINT)++E("TargetTrackUID", target_track_uid, EBML_TYPE_UINT)+ E("TargetTypeValue", target_type_value, EBML_TYPE_UINT)  #define N targets-E_S("Targets", 1)+E_S("Targets", 5) F(MATROSKA_ID_TARGETTYPEVALUE, target_type_value, 0)+F(MATROSKA_ID_TARGETTRACKUID, target_track_uid, 0)+F(MATROSKA_ID_TARGETEDITIONUID, target_edition_uid, 0)+F(MATROSKA_ID_TARGETCHAPTERUID, target_chapter_uid, 0)+F(MATROSKA_ID_TARGETATTACHMENTUID, target_attachment_uid, 0) }}; #undef N  #define N tag-E_S("Tag", 1)+E_S("Tag", 2) F(MATROSKA_ID_TARGETS, targets, 0)+F(MATROSKA_ID_SIMPLETAG, simple_tag, 1) }}; #undef N diff --git a/libmpdemux/ebml_types.h b/libmpdemux/ebml_types.hindex 45b2747..9dde581 100644--- a/libmpdemux/ebml_types.h+++ b/libmpdemux/ebml_types.h@@ -102,18 +102,46 @@ #define MATROSKA_ID_TAG                          0x7373 #define MATROSKA_ID_TARGETS                      0x63c0 #define MATROSKA_ID_TARGETTYPEVALUE              0x68ca-+#define MATROSKA_ID_TARGETTRACKUID               0x63c5+#define MATROSKA_ID_TARGETEDITIONUID             0x63c9+#define MATROSKA_ID_TARGETCHAPTERUID             0x63c4+#define MATROSKA_ID_TARGETATTACHMENTUID          0x63c6+#define MATROSKA_ID_SIMPLETAG                    0x67c8+#define MATROSKA_ID_TAGNAME                      0x45a3+#define MATROSKA_ID_TAGLANGUAGE                  0x447a+#define MATROSKA_ID_TAGSTRING                    0x4487+++struct ebml_simple_tag {+    struct bstr   tag_name;+    struct bstr   tag_language;+    struct bstr   tag_string;++    int  n_tag_name;+    int  n_tag_language;+    int  n_tag_string;+};  struct ebml_targets {     uint64_t   target_type_value;+    uint64_t   target_track_uid;+    uint64_t   target_edition_uid;+    uint64_t   target_chapter_uid;+    uint64_t   target_attachment_uid;      int  n_target_type_value;+    int  n_target_track_uid;+    int  n_target_edition_uid;+    int  n_target_chapter_uid;+    int  n_target_attachment_uid; };  struct ebml_tag {-    struct ebml_targets   targets;+    struct ebml_targets      targets;+    struct ebml_simple_tag  *simple_tag;      int  n_targets;+    int  n_simple_tag; };  struct ebml_tags {@@ -429,5 +457,6 @@ extern const struct ebml_elem_desc ebml_chapter_display_desc; extern const struct ebml_elem_desc ebml_tags_desc; extern const struct ebml_elem_desc ebml_tag_desc; extern const struct ebml_elem_desc ebml_targets_desc;+extern const struct ebml_elem_desc ebml_simple_tag_desc;  #define MAX_EBML_SUBELEMENTS 19-- 1.7.0