# HG changeset patch # User michael # Date 1211547747 0 # Node ID 4bf98e198eec857b4c1ca913a3e3cbd1e80c1767 # Parent 97f7b77a969b63bee665aa8a1492ddb11a505713 Add id to AVChapter, untested (where do i find matroska files with chapters?). diff -r 97f7b77a969b -r 4bf98e198eec avformat.h --- a/avformat.h Fri May 23 12:45:03 2008 +0000 +++ b/avformat.h Fri May 23 13:02:27 2008 +0000 @@ -760,11 +760,12 @@ * and should be ONLY used by demuxers. * * @param s media file handle + * @param id unique id for this chapter * @param start chapter start time in AV_TIME_BASE units * @param end chapter end time in AV_TIME_BASE units * @param title chapter title */ -int ff_new_chapter(AVFormatContext *s, int64_t start, int64_t end, const char *title); +int ff_new_chapter(AVFormatContext *s, int id, int64_t start, int64_t end, const char *title); /** * Set the pts for a given stream. diff -r 97f7b77a969b -r 4bf98e198eec matroskadec.c --- a/matroskadec.c Fri May 23 12:45:03 2008 +0000 +++ b/matroskadec.c Fri May 23 13:02:27 2008 +0000 @@ -2160,6 +2160,7 @@ switch (id) { case MATROSKA_ID_EDITIONENTRY: { uint64_t end = AV_NOPTS_VALUE, start = AV_NOPTS_VALUE; + int64_t uid= -1; char* title = NULL; /* if there is more than one chapter edition we take only the first one */ @@ -2235,9 +2236,11 @@ } break; + case MATROSKA_ID_CHAPTERUID: + res = ebml_read_uint(matroska, &id, &uid); + break; default: av_log(s, AV_LOG_INFO, "Ignoring unknown Chapter atom ID 0x%x\n", id); - case MATROSKA_ID_CHAPTERUID: case MATROSKA_ID_CHAPTERFLAGHIDDEN: case EBML_ID_VOID: res = ebml_read_skip(matroska); @@ -2250,11 +2253,11 @@ } } - if (start != AV_NOPTS_VALUE) { + if (start != AV_NOPTS_VALUE && uid != -1) { start = start * AV_TIME_BASE / 1000000000; if (end != AV_NOPTS_VALUE) end = end * AV_TIME_BASE / 1000000000; - res = ff_new_chapter(s, start, end, title); + res = ff_new_chapter(s, uid, start, end, title); } av_free(title); break; diff -r 97f7b77a969b -r 4bf98e198eec utils.c --- a/utils.c Fri May 23 12:45:03 2008 +0000 +++ b/utils.c Fri May 23 13:02:27 2008 +0000 @@ -2234,18 +2234,29 @@ } } -int ff_new_chapter(AVFormatContext *s, int64_t start, int64_t end, const char *title) +int ff_new_chapter(AVFormatContext *s, int id, int64_t start, int64_t end, const char *title) { - AVChapter *chapter = av_mallocz(sizeof(AVChapter)); + AVChapter *chapter = NULL; + int i; + + for(i=0; inum_chapters; i++) + if(s->chapters[i]->id == id) + chapter = s->chapters[i]; + + if(!chapter){ + chapter= av_mallocz(sizeof(AVChapter)); if(!chapter) return AVERROR(ENOMEM); + dynarray_add(&s->chapters, &s->num_chapters, chapter); + } + if(chapter->title) + av_free(chapter->title); if (title) chapter->title = av_strdup(title); + chapter->id = id; chapter->start = start; chapter->end = end; - dynarray_add(&s->chapters, &s->num_chapters, chapter); - return 0; }