@ -104,6 +104,8 @@ typedef struct MatroskaMuxContext {
int reserve_cues_space ;
int64_t cues_pos ;
uint32_t chapter_id_offset ;
} MatroskaMuxContext ;
@ -790,7 +792,7 @@ static int mkv_write_chapters(AVFormatContext *s)
AVDictionaryEntry * t = NULL ;
chapteratom = start_ebml_master ( pb , MATROSKA_ID_CHAPTERATOM , 0 ) ;
put_ebml_uint ( pb , MATROSKA_ID_CHAPTERUID , c - > id + 1 ) ;
put_ebml_uint ( pb , MATROSKA_ID_CHAPTERUID , c - > id + mkv - > chapter_id_offset ) ;
put_ebml_uint ( pb , MATROSKA_ID_CHAPTERTIMESTART ,
av_rescale_q ( c - > start , c - > time_base , scale ) ) ;
put_ebml_uint ( pb , MATROSKA_ID_CHAPTERTIMEEND ,
@ -882,6 +884,7 @@ static int mkv_check_tag(AVDictionary *m)
static int mkv_write_tags ( AVFormatContext * s )
{
MatroskaMuxContext * mkv = s - > priv_data ;
ebml_master tags = { 0 } ;
int i , ret ;
@ -908,7 +911,7 @@ static int mkv_write_tags(AVFormatContext *s)
if ( ! mkv_check_tag ( ch - > metadata ) )
continue ;
ret = mkv_write_tag ( s , ch - > metadata , MATROSKA_ID_TAGTARGETS_CHAPTERUID , ch - > id + 1 , & tags ) ;
ret = mkv_write_tag ( s , ch - > metadata , MATROSKA_ID_TAGTARGETS_CHAPTERUID , ch - > id + mkv - > chapter_id_offset , & tags ) ;
if ( ret < 0 ) return ret ;
}
@ -1087,6 +1090,9 @@ static int mkv_write_header(AVFormatContext *s)
ret = mkv_write_tracks ( s ) ;
if ( ret < 0 ) return ret ;
for ( i = 0 ; i < s - > nb_chapters ; i + + )
mkv - > chapter_id_offset = FFMAX ( mkv - > chapter_id_offset , 1LL - s - > chapters [ i ] - > id ) ;
if ( mkv - > mode ! = MODE_WEBM ) {
ret = mkv_write_chapters ( s ) ;
if ( ret < 0 ) return ret ;