+ for (int i = 0; i < nb_chapters; i++) {
+ AVChapter *chp = chapters[i];
+ char chapter_time[13];
+ char chapter_number[4];
+ int h, m, s, ms;
+
+ s = av_rescale(chp->start, chp->time_base.num, chp->time_base.den);
+ h = s / 3600;
+ m = (s / 60) % 60;
+ ms = av_rescale_q(chp->start, chp->time_base, av_make_q( 1, 1000)) % 1000;
+ s = s % 60;
+ snprintf(chapter_number, sizeof(chapter_number), "%03d", i);
+ snprintf(chapter_time, sizeof(chapter_time), "%02d:%02d:%02d.%03d", h, m, s, ms);
+ bytestream_put_le32(p, 10+1+12);
+ bytestream_put_buffer(p, "CHAPTER", 7);
+ bytestream_put_buffer(p, chapter_number, 3);
+ bytestream_put_byte(p, '=');
+ bytestream_put_buffer(p, chapter_time, 12);
+
+ tag = NULL;
+ while ((tag = av_dict_get(chapters[i]->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
+ int64_t len1 = !strcmp(tag->key, "title") ? 4 : strlen(tag->key);
+ int64_t len2 = strlen(tag->value);
+ if (len1+1+len2+10 > UINT32_MAX)
+ return AVERROR(EINVAL);
+ bytestream_put_le32(p, 10+len1+1+len2);
+ bytestream_put_buffer(p, "CHAPTER", 7);
+ bytestream_put_buffer(p, chapter_number, 3);
+ if (!strcmp(tag->key, "title"))
+ bytestream_put_buffer(p, "NAME", 4);
+ else
+ bytestream_put_buffer(p, tag->key, len1);
+ bytestream_put_byte(p, '=');
+ bytestream_put_buffer(p, tag->value, len2);
+ }
+ }