[FFmpeg-devel] [PATCH 3/3] lavf/matroskadec: export chained segment chapter metadata.

Nicolas George george at nsup.org
Fri Feb 27 16:50:30 CET 2015


Signed-off-by: Nicolas George <george at 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



More information about the ffmpeg-devel mailing list