mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2024-12-25 20:32:33 +00:00
Added a function for duplicating KaxChapters.
This commit is contained in:
parent
1044857db7
commit
c2010e1a65
@ -244,3 +244,96 @@ KaxChapters *parse_chapters(const char *file_name, int64_t min_tc,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define is_id(c) (EbmlId(*e) == c::ClassInfos.GlobalId)
|
||||||
|
|
||||||
|
static EbmlMaster *copy_chapters_recursive(EbmlMaster *src) {
|
||||||
|
uint32_t i;
|
||||||
|
EbmlMaster *dst;
|
||||||
|
|
||||||
|
dst = static_cast<EbmlMaster *>(&src->Generic().Create());
|
||||||
|
while (dst->ListSize() > 0) {
|
||||||
|
EbmlElement *e;
|
||||||
|
e = (*dst)[0];
|
||||||
|
dst->Remove(0);
|
||||||
|
delete e;
|
||||||
|
}
|
||||||
|
for (i = 0; i < src->ListSize(); i++) {
|
||||||
|
EbmlElement *e;
|
||||||
|
|
||||||
|
e = (*src)[i];
|
||||||
|
try {
|
||||||
|
EbmlMaster *m = &dynamic_cast<EbmlMaster &>(*e);
|
||||||
|
dst->PushElement(*copy_chapters_recursive(m));
|
||||||
|
} catch (...) {
|
||||||
|
if (is_id(KaxChapterUID)) {
|
||||||
|
KaxChapterUID *esrc, *edst;
|
||||||
|
edst = new KaxChapterUID;
|
||||||
|
esrc = static_cast<KaxChapterUID *>(e);
|
||||||
|
*edst = *esrc;
|
||||||
|
dst->PushElement(*edst);
|
||||||
|
|
||||||
|
} else if (is_id(KaxChapterTimeStart)) {
|
||||||
|
KaxChapterTimeStart *esrc, *edst;
|
||||||
|
edst = new KaxChapterTimeStart;
|
||||||
|
esrc = static_cast<KaxChapterTimeStart *>(e);
|
||||||
|
*edst = *esrc;
|
||||||
|
dst->PushElement(*edst);
|
||||||
|
|
||||||
|
} else if (is_id(KaxChapterTimeEnd)) {
|
||||||
|
KaxChapterTimeEnd *esrc, *edst;
|
||||||
|
edst = new KaxChapterTimeEnd;
|
||||||
|
esrc = static_cast<KaxChapterTimeEnd *>(e);
|
||||||
|
*edst = *esrc;
|
||||||
|
dst->PushElement(*edst);
|
||||||
|
|
||||||
|
} else if (is_id(KaxChapterTrackNumber)) {
|
||||||
|
KaxChapterTrackNumber *esrc, *edst;
|
||||||
|
edst = new KaxChapterTrackNumber;
|
||||||
|
esrc = static_cast<KaxChapterTrackNumber *>(e);
|
||||||
|
*edst = *esrc;
|
||||||
|
dst->PushElement(*edst);
|
||||||
|
|
||||||
|
} else if (is_id(KaxChapterString)) {
|
||||||
|
KaxChapterString *esrc, *edst;
|
||||||
|
edst = new KaxChapterString;
|
||||||
|
esrc = static_cast<KaxChapterString *>(e);
|
||||||
|
*static_cast<EbmlUnicodeString *>(edst) = UTFstring(*esrc);
|
||||||
|
dst->PushElement(*edst);
|
||||||
|
|
||||||
|
} else if (is_id(KaxChapterLanguage)) {
|
||||||
|
KaxChapterLanguage *esrc, *edst;
|
||||||
|
edst = new KaxChapterLanguage;
|
||||||
|
esrc = static_cast<KaxChapterLanguage *>(e);
|
||||||
|
*static_cast<EbmlString *>(edst) = string(*esrc);
|
||||||
|
dst->PushElement(*edst);
|
||||||
|
|
||||||
|
} else if (is_id(KaxChapterCountry)) {
|
||||||
|
KaxChapterCountry *esrc, *edst;
|
||||||
|
edst = new KaxChapterCountry;
|
||||||
|
esrc = static_cast<KaxChapterCountry *>(e);
|
||||||
|
*static_cast<EbmlString *>(edst) = string(*esrc);
|
||||||
|
dst->PushElement(*edst);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
|
KaxChapters *copy_chapters(KaxChapters *source) {
|
||||||
|
KaxChapters *dst;
|
||||||
|
uint32_t ee;
|
||||||
|
|
||||||
|
if (source == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
dst = new KaxChapters;
|
||||||
|
for (ee = 0; ee < source->ListSize(); ee++) {
|
||||||
|
EbmlMaster *master;
|
||||||
|
master = copy_chapters_recursive(static_cast<EbmlMaster *>((*source)[ee]));
|
||||||
|
dst->PushElement(*master);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
@ -42,5 +42,7 @@ KaxChapters *parse_xml_chapters(mm_text_io_c *in, int64_t min_tc,
|
|||||||
void write_chapters_xml(KaxChapters *chapters, FILE *out);
|
void write_chapters_xml(KaxChapters *chapters, FILE *out);
|
||||||
void write_chapters_simple(int &chapter_num, KaxChapters *chapters, FILE *out);
|
void write_chapters_simple(int &chapter_num, KaxChapters *chapters, FILE *out);
|
||||||
|
|
||||||
|
KaxChapters *copy_chapters(KaxChapters *source);
|
||||||
|
|
||||||
#endif // __CHAPTERS_H
|
#endif // __CHAPTERS_H
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user