Signed-off-by: Nicolas George <geo...@nsup.org> --- libavformat/matroska.h | 1 + libavformat/matroskadec.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-)
This is not real support for chained Matroska files, but at least applications using only lavf will have the relevant information to implement playback. diff --git a/libavformat/matroska.h b/libavformat/matroska.h index 391c56c..1506307 100644 --- a/libavformat/matroska.h +++ b/libavformat/matroska.h @@ -226,6 +226,7 @@ #define MATROSKA_ID_CHAPTERFLAGHIDDEN 0x98 #define MATROSKA_ID_CHAPTERFLAGENABLED 0x4598 #define MATROSKA_ID_CHAPTERPHYSEQUIV 0x63C3 +#define MATROSKA_ID_CHAPTERSEGMENTUID 0x6E67 typedef enum { MATROSKA_TRACK_TYPE_NONE = 0x0, diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index f8519b7..07cf194 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -203,6 +203,7 @@ typedef struct MatroskaChapter { uint64_t end; uint64_t uid; char *title; + EbmlBin segment_uid; AVChapter *chapter; } MatroskaChapter; @@ -479,6 +480,7 @@ static EbmlSyntax matroska_chapter_entry[] = { { MATROSKA_ID_CHAPTERTIMESTART, EBML_UINT, 0, offsetof(MatroskaChapter, start), { .u = AV_NOPTS_VALUE } }, { MATROSKA_ID_CHAPTERTIMEEND, EBML_UINT, 0, offsetof(MatroskaChapter, end), { .u = AV_NOPTS_VALUE } }, { MATROSKA_ID_CHAPTERUID, EBML_UINT, 0, offsetof(MatroskaChapter, uid) }, + { MATROSKA_ID_CHAPTERSEGMENTUID, EBML_BIN, 0, offsetof(MatroskaChapter, segment_uid) }, { MATROSKA_ID_CHAPTERDISPLAY, EBML_NEST, 0, 0, { .n = matroska_chapter_display } }, { MATROSKA_ID_CHAPTERFLAGHIDDEN, EBML_NONE }, { MATROSKA_ID_CHAPTERFLAGENABLED, EBML_NONE }, @@ -2185,7 +2187,7 @@ static int matroska_read_header(AVFormatContext *s) chapters = chapters_list->elem; for (i = 0; i < chapters_list->nb_elem; i++) if (chapters[i].start != AV_NOPTS_VALUE && chapters[i].uid && - (max_start == 0 || chapters[i].start > max_start)) { + (max_start == 0 || chapters[i].start > max_start || chapters[i].segment_uid.size)) { chapters[i].chapter = avpriv_new_chapter(s, chapters[i].uid, (AVRational) { 1, 1000000000 }, @@ -2194,6 +2196,8 @@ static int matroska_read_header(AVFormatContext *s) if (chapters[i].chapter) { av_dict_set(&chapters[i].chapter->metadata, "title", chapters[i].title, 0); + matroska_metadata_uid(s, &chapters[i].chapter->metadata, + &chapters[i].segment_uid); } max_start = chapters[i].start; } -- 2.1.4 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel