On 6/4/2019 11:45 AM, Paul B Mahol wrote: > Signed-off-by: Paul B Mahol <one...@gmail.com> > --- > libavformat/id3v2enc.c | 36 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 36 insertions(+) > > diff --git a/libavformat/id3v2enc.c b/libavformat/id3v2enc.c > index ffe358f019..9b72614447 100644 > --- a/libavformat/id3v2enc.c > +++ b/libavformat/id3v2enc.c > @@ -255,6 +255,39 @@ static int write_metadata(AVIOContext *pb, AVDictionary > **metadata, > return 0; > } > > +static int write_ctoc(AVFormatContext *s, ID3v2EncContext *id3, int enc) > +{ > + uint8_t *dyn_buf = NULL; > + AVIOContext *dyn_bc = NULL; > + char name[123]; > + int len, ret; > + > + if ((ret = avio_open_dyn_buf(&dyn_bc)) < 0) > + goto fail; > + > + id3->len += avio_put_str(dyn_bc, "toc"); > + avio_wb16(dyn_bc, 0x03); > + avio_w8(dyn_bc, s->nb_chapters); > + for (int i = 0; i < s->nb_chapters; i++) { > + snprintf(name, 122, "ch%d", i); > + id3->len += avio_put_str(dyn_bc, name); > + } > + len = avio_close_dyn_buf(dyn_bc, &dyn_buf); > + id3->len += 16 + ID3v2_HEADER_SIZE; > + > + avio_wb32(s->pb, MKBETAG('C', 'T', 'O', 'C')); > + avio_wb32(s->pb, len); > + avio_wb16(s->pb, 0); > + avio_write(s->pb, dyn_buf, len); > + > +fail: > + if (dyn_bc && !dyn_buf) > + avio_close_dyn_buf(dyn_bc, &dyn_buf); > + av_freep(&dyn_buf); > + > + return ret; > +} > + > static int write_chapter(AVFormatContext *s, ID3v2EncContext *id3, int id, > int enc) > { > const AVRational time_base = {1, 1000}; > @@ -306,6 +339,9 @@ int ff_id3v2_write_metadata(AVFormatContext *s, > ID3v2EncContext *id3) > if ((ret = write_metadata(s->pb, &s->metadata, id3, enc)) < 0) > return ret; > > + if ((ret = write_ctoc(s, id3, enc)) < 0)
Shouldn't you check that s->nb_chapters is > 0 before calling this? Or within that function, alternatively. Even if CTOC could be written with 0 chapters, it would be an unnecessary bloat in the output file. > + return ret; > + > for (i = 0; i < s->nb_chapters; i++) { > if ((ret = write_chapter(s, id3, i, enc)) < 0) > return ret; > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".