[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