On Fri, 27 Feb 2015 16:50:30 +0100 Nicolas George <geo...@nsup.org> wrote:
> 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. This isn't enough information to implement ordered chapters. > > 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; > } _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel