Add id to AVChapter, untested (where do i find matroska files with chapters?).
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 23 May 2008 13:02:27 +0000 (13:02 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 23 May 2008 13:02:27 +0000 (13:02 +0000)
Originally committed as revision 13255 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avformat.h
libavformat/matroskadec.c
libavformat/utils.c

index c7c3845..a2e0978 100644 (file)
@@ -760,11 +760,12 @@ AVProgram *av_new_program(AVFormatContext *s, int id);
  * and should be ONLY used by demuxers.
  *
  * @param s media file handle
  * 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
  */
  * @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.
 
 /**
  * Set the pts for a given stream.
index 1fdf399..7f9352e 100644 (file)
@@ -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;
         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 */
             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;
 
                             }
                             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);
                         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);
                         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;
                         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;
                     }
                     av_free(title);
                     break;
index 66f26cc..aa8a117 100644 (file)
@@ -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);
     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);
     if (title)
         chapter->title = av_strdup(title);
+    chapter->id    = id;
     chapter->start = start;
     chapter->end = end;
 
     chapter->start = start;
     chapter->end = end;
 
-    dynarray_add(&s->chapters, &s->num_chapters, chapter);
-
     return 0;
 }
 
     return 0;
 }