Defer the initialization of the XML mapping tables and link the entries to the libmatroska classes with their DebugName. This gets rid of the problems with different compilers/optimization settings causing the EbmlIds to be initialized too late.

This commit is contained in:
Moritz Bunkus 2004-10-11 11:19:33 +00:00
parent d7375f9c4b
commit 14c21e6ae8
5 changed files with 111 additions and 112 deletions

View File

@ -1,5 +1,9 @@
2004-10-10 Moritz Bunkus <moritz@bunkus.org>
* mkvmerge/mkvinfo/mkvextract: bug fix: The chapter and tag
element tables were not always intialized correctly depending on
the compiler and the optimization flags used.
* mkvmerge: bug fix: The OGM reader was broken if at least one
track was not to be copied from the file (happened between 0.9.5
and 0.9.6).

View File

@ -380,6 +380,31 @@ find_ebml_callbacks(const EbmlCallbacks &base,
throw "";
}
const EbmlCallbacks &
find_ebml_callbacks(const EbmlCallbacks &base,
const char *debug_name) {
const EbmlSemanticContext &context = base.Context;
int i;
if (!strcmp(debug_name, base.DebugName))
return base;
for (i = 0; i < context.Size; i++)
if (!strcmp(debug_name, context.MyTable[i].GetCallbacks.DebugName))
return context.MyTable[i].GetCallbacks;
for (i = 0; i < context.Size; i++) {
if (!(context != context.MyTable[i].GetCallbacks.Context))
continue;
try {
return find_ebml_callbacks(context.MyTable[i].GetCallbacks, debug_name);
} catch (...) {
}
}
throw "";
}
const EbmlCallbacks &
find_ebml_parent_callbacks(const EbmlCallbacks &base,
const EbmlId &id) {

View File

@ -100,6 +100,8 @@ EbmlMaster *MTX_DLL_API sort_ebml_master(EbmlMaster *e);
const EbmlCallbacks &MTX_DLL_API
find_ebml_callbacks(const EbmlCallbacks &base, const EbmlId &id);
const EbmlCallbacks &MTX_DLL_API
find_ebml_callbacks(const EbmlCallbacks &base, const char *debug_name);
const EbmlCallbacks &MTX_DLL_API
find_ebml_parent_callbacks(const EbmlCallbacks &base, const EbmlId &id);
const EbmlSemantic &MTX_DLL_API
find_ebml_semantic(const EbmlCallbacks &base, const EbmlId &id);

View File

@ -13,143 +13,110 @@
* Written by Moritz Bunkus <moritz@bunkus.org>.
*/
#include "ebml/EbmlElement.h"
#include "matroska/KaxConfig.h"
#include <ebml/EbmlElement.h>
#include <matroska/KaxConfig.h>
#include <matroska/KaxSegment.h>
#include "common.h"
#include "commonebml.h"
#include "xml_element_mapping.h"
namespace libmatroska {
extern EbmlId MATROSKA_DLL_API KaxChapters_TheId;
extern EbmlId MATROSKA_DLL_API KaxEditionEntry_TheId;
extern EbmlId MATROSKA_DLL_API KaxEditionUID_TheId;
extern EbmlId MATROSKA_DLL_API KaxEditionFlagHidden_TheId;
extern EbmlId MATROSKA_DLL_API KaxEditionFlagDefault_TheId;
extern EbmlId MATROSKA_DLL_API KaxEditionProcessed_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterAtom_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterUID_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterTimeStart_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterTimeEnd_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterFlagHidden_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterFlagEnabled_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterPhysicalEquiv_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterTrack_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterTrackNumber_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterDisplay_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterString_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterLanguage_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterCountry_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterProcessedPrivate_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterProcess_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterProcessTime_TheId;
extern EbmlId MATROSKA_DLL_API KaxChapterProcessCommand_TheId;
extern EbmlId MATROSKA_DLL_API KaxTags_TheId;
extern EbmlId MATROSKA_DLL_API KaxTag_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagTargets_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagSimple_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagName_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagLangue_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagDefault_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagString_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagBinary_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagTrackUID_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagEditionUID_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagChapterUID_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagAttachmentUID_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagTargetType_TheId;
extern EbmlId MATROSKA_DLL_API KaxTagTargetTypeValue_TheId;
};
using namespace libmatroska;
static EbmlId no_id((uint32_t)0, 0);
parser_element_t *chapter_elements = NULL;
parser_element_t *tag_elements = NULL;
void xml_element_map_init()
{
static parser_element_t _chapter_elements[] = {
{"Chapters", ebmlt_master, 0, 0, 0, KaxChapters_TheId, NULL, NULL},
static void
init_mapping_table(parser_element_t *table) {
const char *debug_name;
int i;
{"EditionEntry", ebmlt_master, 1, 0, 0, KaxEditionEntry_TheId, NULL, NULL},
{"EditionUID", ebmlt_uint, 2, 0, NO_MAX_VALUE, KaxEditionUID_TheId, NULL,
for (i = 0; table[i].name != NULL; i++) {
debug_name = table[i].debug_name != NULL ? table[i].debug_name :
table[i].name;
try {
table[i].id =
find_ebml_callbacks(KaxSegment::ClassInfos, debug_name).GlobalId;
} catch (...) {
mxerror("Error initializing the tables for the chapter and tag "
"elements: Could not find the element with the debug name "
"'%s'. %s\n", debug_name, BUGMSG);
}
}
}
void
xml_element_map_init() {
static parser_element_t _chapter_elements[] = {
{"Chapters", ebmlt_master, 0, 0, 0, no_id, NULL, NULL, NULL},
{"EditionEntry", ebmlt_master, 1, 0, 0, no_id, NULL, NULL, NULL},
{"EditionUID", ebmlt_uint, 2, 0, NO_MAX_VALUE, no_id, NULL, NULL, NULL},
{"EditionFlagHidden", ebmlt_bool, 2, 0, 0, no_id, NULL, NULL, NULL},
{"EditionProcessed", ebmlt_uint, 2, 0, NO_MAX_VALUE, no_id, NULL, NULL,
NULL},
{"EditionFlagHidden", ebmlt_bool, 2, 0, 0, KaxEditionFlagHidden_TheId,
NULL, NULL},
{"EditionProcessed", ebmlt_uint, 2, 0, NO_MAX_VALUE,
KaxEditionProcessed_TheId, NULL, NULL},
{"EditionFlagDefault", ebmlt_bool, 2, 0, 0, KaxEditionFlagDefault_TheId,
NULL, NULL},
{"EditionFlagDefault", ebmlt_bool, 2, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterAtom", ebmlt_master, 2, 0, 0, KaxChapterAtom_TheId, NULL,
{"ChapterAtom", ebmlt_master, 2, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, no_id, NULL, NULL, NULL},
{"ChapterTimeStart", ebmlt_time, 3, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterTimeEnd", ebmlt_time, 3, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterFlagHidden", ebmlt_bool, 3, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterFlagEnabled", ebmlt_bool, 3, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterProcessedPrivate", ebmlt_binary, 3, 0, 0, no_id, NULL, NULL,
NULL},
{"ChapterUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, KaxChapterUID_TheId, NULL,
{"ChapterProcess", ebmlt_master, 3, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterProcessTime", ebmlt_uint, 4, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterProcessCommand", ebmlt_binary, 4, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterTrack", ebmlt_master, 3, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterTrackNumber", ebmlt_uint, 4, 0, NO_MAX_VALUE, no_id, NULL, NULL,
NULL},
{"ChapterTimeStart", ebmlt_time, 3, 0, 0, KaxChapterTimeStart_TheId, NULL,
NULL},
{"ChapterTimeEnd", ebmlt_time, 3, 0, 0, KaxChapterTimeEnd_TheId, NULL,
NULL},
{"ChapterFlagHidden", ebmlt_bool, 3, 0, 0, KaxChapterFlagHidden_TheId,
NULL, NULL},
{"ChapterFlagEnabled", ebmlt_bool, 3, 0, 0, KaxChapterFlagEnabled_TheId,
NULL, NULL},
{"ChapterProcessedPrivate", ebmlt_binary, 3, 0, 0,
KaxChapterProcessedPrivate_TheId, NULL, NULL},
{"ChapterProcess", ebmlt_master, 3, 0, 0, KaxChapterProcess_TheId,
NULL, NULL},
{"ChapterProcessTime", ebmlt_uint, 4, 0, 0, KaxChapterProcessTime_TheId,
NULL, NULL},
{"ChapterProcessCommand", ebmlt_binary, 4, 0, 0,
KaxChapterProcessCommand_TheId, NULL, NULL},
{"ChapterDisplay", ebmlt_master, 3, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterString", ebmlt_ustring, 4, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterLanguage", ebmlt_string, 4, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterCountry", ebmlt_string, 4, 0, 0, no_id, NULL, NULL, NULL},
{"ChapterTrack", ebmlt_master, 3, 0, 0, KaxChapterTrack_TheId,
NULL, NULL},
{"ChapterTrackNumber", ebmlt_uint, 4, 0, NO_MAX_VALUE,
KaxChapterTrackNumber_TheId, NULL, NULL},
{"ChapterDisplay", ebmlt_master, 3, 0, 0, KaxChapterDisplay_TheId,
NULL, NULL},
{"ChapterString", ebmlt_ustring, 4, 0, 0, KaxChapterString_TheId,
NULL, NULL},
{"ChapterLanguage", ebmlt_string, 4, 0, 0, KaxChapterLanguage_TheId,
NULL, NULL},
{"ChapterCountry", ebmlt_string, 4, 0, 0, KaxChapterCountry_TheId,
NULL, NULL},
{NULL, ebmlt_master, 0, 0, 0, EbmlId((uint32_t)0, 0), NULL, NULL}
{NULL, ebmlt_master, 0, 0, 0, EbmlId((uint32_t)0, 0), NULL, NULL, NULL}
};
static parser_element_t _tag_elements[] = {
{"Tags", ebmlt_master, 0, 0, 0, KaxTags_TheId, NULL, NULL},
{"Tags", ebmlt_master, 0, 0, 0, no_id, NULL, NULL, NULL},
{"Tag", ebmlt_master, 1, 0, 0, KaxTag_TheId, NULL, NULL},
{"Tag", ebmlt_master, 1, 0, 0, no_id, NULL, NULL, NULL},
{"Targets", ebmlt_master, 2, 0, 0, KaxTagTargets_TheId, NULL, NULL},
{"TrackUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, KaxTagTrackUID_TheId,
NULL, NULL},
{"EditionUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, KaxTagEditionUID_TheId,
NULL, NULL},
{"ChapterUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, KaxTagChapterUID_TheId,
NULL, NULL},
{"AttachmentUID", ebmlt_uint, 3, 0, NO_MAX_VALUE,
KaxTagAttachmentUID_TheId, NULL, NULL},
{"TargetType", ebmlt_string, 3, 0, 0, KaxTagTargetType_TheId, NULL, NULL},
{"TargetTypeValue", ebmlt_uint, 3, 0, NO_MAX_VALUE,
KaxTagTargetTypeValue_TheId, NULL, NULL},
{"Targets", ebmlt_master, 2, 0, 0, no_id, NULL, NULL, "TagTargets"},
{"TrackUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, no_id, NULL, NULL,
"TagTrackUID"},
{"EditionUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, no_id, NULL, NULL,
"TagEditionUID"},
{"ChapterUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, no_id, NULL, NULL,
"TagChapterUID"},
{"AttachmentUID", ebmlt_uint, 3, 0, NO_MAX_VALUE, no_id, NULL, NULL,
"TagAttachmentUID"},
{"TargetType", ebmlt_string, 3, 0, 0, no_id, NULL, NULL, "TagTargetType"},
{"TargetTypeValue", ebmlt_uint, 3, 0, NO_MAX_VALUE, no_id, NULL, NULL,
"TagTargetTypeValue"},
{"Simple", ebmlt_master, 2, 0, 0, KaxTagSimple_TheId, NULL, NULL},
{"Name", ebmlt_ustring, 3, 0, 0, KaxTagName_TheId, NULL, NULL},
{"String", ebmlt_ustring, 3, 0, 0, KaxTagString_TheId, NULL, NULL},
{"Binary", ebmlt_binary, 3, 0, 0, KaxTagBinary_TheId, NULL, NULL},
{"TagLanguage", ebmlt_string, 3, 0, 0, KaxTagLangue_TheId, NULL, NULL},
{"DefaultLanguage", ebmlt_bool, 3, 0, 1, KaxTagDefault_TheId, NULL, NULL},
{"Simple", ebmlt_master, 2, 0, 0, no_id, NULL, NULL, "TagSimple"},
{"Name", ebmlt_ustring, 3, 0, 0, no_id, NULL, NULL, "TagName"},
{"String", ebmlt_ustring, 3, 0, 0, no_id, NULL, NULL, "TagString"},
{"Binary", ebmlt_binary, 3, 0, 0, no_id, NULL, NULL, "TagBinary"},
{"TagLanguage", ebmlt_string, 3, 0, 0, no_id, NULL, NULL, "TagLanguage"},
{"DefaultLanguage", ebmlt_bool, 3, 0, 1, no_id, NULL, NULL, "TagDefault"},
{NULL, ebmlt_master, 0, 0, 0, EbmlId((uint32_t)0, 0), NULL, NULL}
{NULL, ebmlt_master, 0, 0, 0, EbmlId((uint32_t)0, 0), NULL, NULL, NULL}
};
chapter_elements = _chapter_elements;
tag_elements = _tag_elements;
};
init_mapping_table(chapter_elements);
init_mapping_table(tag_elements);
}
int
xml_element_map_index(const parser_element_t *element_map,

View File

@ -36,9 +36,10 @@ typedef struct {
int level;
int64_t min_value;
int64_t max_value;
const EbmlId id;
EbmlId id;
parser_element_callback_t start_hook;
parser_element_callback_t end_hook;
const char *debug_name;
} parser_element_t;
extern parser_element_t MTX_DLL_API *chapter_elements;