From: Aaron Colwell <[email protected]> This change fixes a bug where seeking does not work properly for Matroska files that have the CUES element before the first cluster. This bug was accidentally introduced a few months ago by my deferred CUES loading patch: http://git.videolan.org/?p=ffmpeg.git;a=commit;h=31ad14c21e0735387ba8082c6e3436241f7ccfc8
When the CUES element appears before the first cluster in the file, the data is parsed and placed in matroska->index but that data is never added to the seek index. Currently the transfer from matroska->index to the seek index only happens when matroska_parse_cues() is called. matroska_parse_cues() only gets called on a seek if cues_parsing_deferred is set. cues_parsing_deferred only gets set if parsing the CUES requires seeking past the first cluster. There is no code to handle the case where CUES is before the first cluster. This fix essentially restores the matroska->index processing that was happening at the end of matroska_read_header() before I made my CUES deferral change. In the case where CUES is before the first cluster, matroska->index will have data and the seek index will be updated. In the case where CUES is later in the file, matroska->index will be empty and cues_parsing_deferred will be set so loading will happen later. Signed-off-by: Diego Biurrun <[email protected]> --- libavformat/matroskadec.c | 29 +++++++++++++++++++---------- 1 files changed, 19 insertions(+), 10 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 01c9a7b..9beaa89 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1193,21 +1193,13 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska) } } -static void matroska_parse_cues(MatroskaDemuxContext *matroska) { - EbmlList *seekhead_list = &matroska->seekhead; - MatroskaSeekhead *seekhead = seekhead_list->elem; +static void matroska_add_index_entries(MatroskaDemuxContext *matroska) +{ EbmlList *index_list; MatroskaIndex *index; int index_scale = 1; int i, j; - for (i = 0; i < seekhead_list->nb_elem; i++) - if (seekhead[i].id == MATROSKA_ID_CUES) - break; - assert(i <= seekhead_list->nb_elem); - - matroska_parse_seekhead_entry(matroska, i); - index_list = &matroska->index; index = index_list->elem; if (index_list->nb_elem @@ -1229,6 +1221,21 @@ static void matroska_parse_cues(MatroskaDemuxContext *matroska) { } } +static void matroska_parse_cues(MatroskaDemuxContext *matroska) +{ + EbmlList *seekhead_list = &matroska->seekhead; + MatroskaSeekhead *seekhead = seekhead_list->elem; + int i; + + for (i = 0; i < seekhead_list->nb_elem; i++) + if (seekhead[i].id == MATROSKA_ID_CUES) + break; + assert(i <= seekhead_list->nb_elem); + + matroska_parse_seekhead_entry(matroska, i); + matroska_add_index_entries(matroska); +} + static int matroska_aac_profile(char *codec_id) { static const char * const aac_profiles[] = { "MAIN", "LC", "SSR" }; @@ -1587,6 +1594,8 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap) max_start = chapters[i].start; } + matroska_add_index_entries(matroska); + matroska_convert_tags(s); return 0; -- 1.7.1 _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
