summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/avformat.h3
-rw-r--r--libavformat/matroskadec.c9
-rw-r--r--libavformat/utils.c19
3 files changed, 23 insertions, 8 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index c7c38454dd..a2e0978e9d 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -760,11 +760,12 @@ AVProgram *av_new_program(AVFormatContext *s, int id);
* 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 --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 1fdf39910f..7f9352e46c 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -2160,6 +2160,7 @@ matroska_parse_chapters(AVFormatContext *s)
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 @@ matroska_parse_chapters(AVFormatContext *s)
}
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 @@ matroska_parse_chapters(AVFormatContext *s)
}
}
- 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 --git a/libavformat/utils.c b/libavformat/utils.c
index 66f26ccd6e..aa8a117c23 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2234,18 +2234,29 @@ void av_set_program_name(AVProgram *program, char *provider_name, char *name)
}
}
-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; i<s->num_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;
}