diff options
author | David Conrad <lessen42@gmail.com> | 2010-03-12 05:16:57 +0000 |
---|---|---|
committer | David Conrad <lessen42@gmail.com> | 2010-03-12 05:16:57 +0000 |
commit | 8730fad595f5f391de21f6b41d04e22a4412e14e (patch) | |
tree | 83adc28aba746f9f31ec6f3d3ac9018d1d20005f | |
parent | 2e5085854c95d7ac83f8bfa79242fe4c3b429839 (diff) | |
download | ffmpeg-8730fad595f5f391de21f6b41d04e22a4412e14e.tar.gz |
oggdec: Parse ogm chapters
Originally committed as revision 22477 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavformat/oggparsevorbis.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c index 15463283e3..b032893e10 100644 --- a/libavformat/oggparsevorbis.c +++ b/libavformat/oggparsevorbis.c @@ -41,6 +41,40 @@ const AVMetadataConv ff_vorbiscomment_metadata_conv[] = { { 0 } }; +static int ogm_chapter(AVFormatContext *as, uint8_t *key, uint8_t *val) +{ + int i, cnum, h, m, s, ms, keylen = strlen(key); + AVChapter *chapter = NULL; + + if (keylen < 9 || sscanf(key, "CHAPTER%02d", &cnum) != 1) + return 0; + + if (keylen == 9) { + if (sscanf(val, "%02d:%02d:%02d.%03d", &h, &m, &s, &ms) < 4) + return 0; + + ff_new_chapter(as, cnum, (AVRational){1,1000}, + ms + 1000*(s + 60*(m + 60*h)), + AV_NOPTS_VALUE, NULL); + av_free(val); + } else if (!strcmp(key+9, "NAME")) { + for(i = 0; i < as->nb_chapters; i++) + if (as->chapters[i]->id == cnum) { + chapter = as->chapters[i]; + break; + } + if (!chapter) + return 0; + + av_metadata_set2(&chapter->metadata, "title", val, + AV_METADATA_DONT_STRDUP_VAL); + } else + return 0; + + av_free(key); + return 1; +} + int ff_vorbis_comment(AVFormatContext * as, AVMetadata **m, const uint8_t *buf, int size) { @@ -101,7 +135,8 @@ ff_vorbis_comment(AVFormatContext * as, AVMetadata **m, const uint8_t *buf, int memcpy(ct, v, vl); ct[vl] = 0; - av_metadata_set2(m, tt, ct, + if (!ogm_chapter(as, tt, ct)) + av_metadata_set2(m, tt, ct, AV_METADATA_DONT_STRDUP_KEY | AV_METADATA_DONT_STRDUP_VAL); } |