1118
1142
int64_t before_pos = avio_tell(matroska->ctx->pb);
1119
1143
uint32_t saved_id = matroska->current_id;
1120
1144
MatroskaLevel level;
1123
// we should not do any seeking in the streaming case
1124
if (!matroska->ctx->pb->seekable ||
1125
(matroska->ctx->flags & AVFMT_FLAG_IGNIDX))
1128
for (i=0; i<seekhead_list->nb_elem; i++) {
1129
int64_t offset = seekhead[i].pos + matroska->segment_start;
1131
if (seekhead[i].pos <= before_pos
1132
|| seekhead[i].id == MATROSKA_ID_SEEKHEAD
1133
|| seekhead[i].id == MATROSKA_ID_CLUSTER)
1137
if (avio_seek(matroska->ctx->pb, offset, SEEK_SET) != offset)
1148
if (idx >= seekhead_list->nb_elem
1149
|| seekhead[idx].id == MATROSKA_ID_SEEKHEAD
1150
|| seekhead[idx].id == MATROSKA_ID_CLUSTER)
1154
offset = seekhead[idx].pos + matroska->segment_start;
1155
if (avio_seek(matroska->ctx->pb, offset, SEEK_SET) == offset) {
1140
1156
/* We don't want to lose our seekhead level, so we add
1141
1157
* a dummy. This is a crude hack. */
1142
1158
if (matroska->num_levels == EBML_MAX_DEPTH) {
1143
1159
av_log(matroska->ctx, AV_LOG_INFO,
1144
1160
"Max EBML element depth (%d) reached, "
1145
1161
"cannot parse further.\n", EBML_MAX_DEPTH);
1150
level.length = (uint64_t)-1;
1151
matroska->levels[matroska->num_levels] = level;
1152
matroska->num_levels++;
1153
matroska->current_id = 0;
1155
ebml_parse(matroska, matroska_segment, matroska);
1157
/* remove dummy level */
1158
while (matroska->num_levels) {
1159
uint64_t length = matroska->levels[--matroska->num_levels].length;
1160
if (length == (uint64_t)-1)
1162
ret = AVERROR_INVALIDDATA;
1165
level.length = (uint64_t)-1;
1166
matroska->levels[matroska->num_levels] = level;
1167
matroska->num_levels++;
1168
matroska->current_id = 0;
1170
ret = ebml_parse(matroska, matroska_segment, matroska);
1172
/* remove dummy level */
1173
while (matroska->num_levels) {
1174
uint64_t length = matroska->levels[--matroska->num_levels].length;
1175
if (length == (uint64_t)-1)
1165
1180
/* seek back */
1166
1181
avio_seek(matroska->ctx->pb, before_pos, SEEK_SET);
1167
1182
matroska->level_up = level_up;
1168
1183
matroska->current_id = saved_id;
1188
static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
1190
EbmlList *seekhead_list = &matroska->seekhead;
1191
int64_t before_pos = avio_tell(matroska->ctx->pb);
1194
// we should not do any seeking in the streaming case
1195
if (!matroska->ctx->pb->seekable ||
1196
(matroska->ctx->flags & AVFMT_FLAG_IGNIDX))
1199
for (i = 0; i < seekhead_list->nb_elem; i++) {
1200
MatroskaSeekhead *seekhead = seekhead_list->elem;
1201
if (seekhead[i].pos <= before_pos)
1204
// defer cues parsing until we actually need cue data.
1205
if (seekhead[i].id == MATROSKA_ID_CUES) {
1206
matroska->cues_parsing_deferred = 1;
1210
if (matroska_parse_seekhead_entry(matroska, i) < 0)
1215
static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
1216
EbmlList *seekhead_list = &matroska->seekhead;
1217
MatroskaSeekhead *seekhead = seekhead_list->elem;
1218
EbmlList *index_list;
1219
MatroskaIndex *index;
1220
int index_scale = 1;
1223
for (i = 0; i < seekhead_list->nb_elem; i++)
1224
if (seekhead[i].id == MATROSKA_ID_CUES)
1226
assert(i <= seekhead_list->nb_elem);
1228
matroska_parse_seekhead_entry(matroska, i);
1230
index_list = &matroska->index;
1231
index = index_list->elem;
1232
if (index_list->nb_elem
1233
&& index[0].time > 1E14/matroska->time_scale) {
1234
av_log(matroska->ctx, AV_LOG_WARNING, "Working around broken index.\n");
1235
index_scale = matroska->time_scale;
1237
for (i = 0; i < index_list->nb_elem; i++) {
1238
EbmlList *pos_list = &index[i].pos;
1239
MatroskaIndexPos *pos = pos_list->elem;
1240
for (j = 0; j < pos_list->nb_elem; j++) {
1241
MatroskaTrack *track = matroska_find_track_by_num(matroska, pos[j].track);
1242
if (track && track->stream)
1243
av_add_index_entry(track->stream,
1244
pos[j].pos + matroska->segment_start,
1245
index[i].time/index_scale, 0, 0,
1171
1251
static int matroska_aac_profile(char *codec_id)
1529
1603
max_start = chapters[i].start;
1532
index_list = &matroska->index;
1533
index = index_list->elem;
1534
if (index_list->nb_elem
1535
&& index[0].time > 100000000000000/matroska->time_scale) {
1536
av_log(matroska->ctx, AV_LOG_WARNING, "Working around broken index.\n");
1537
index_scale = matroska->time_scale;
1539
for (i=0; i<index_list->nb_elem; i++) {
1540
EbmlList *pos_list = &index[i].pos;
1541
MatroskaIndexPos *pos = pos_list->elem;
1542
for (j=0; j<pos_list->nb_elem; j++) {
1543
MatroskaTrack *track = matroska_find_track_by_num(matroska,
1545
if (track && track->stream)
1546
av_add_index_entry(track->stream,
1547
pos[j].pos + matroska->segment_start,
1548
index[i].time/index_scale, 0, 0,
1553
1606
matroska_convert_tags(s);
1897
1954
AVStream *st = s->streams[stream_index];
1898
1955
int i, index, index_sub, index_min;
1957
/* Parse the CUES now since we need the index data to seek. */
1958
if (matroska->cues_parsing_deferred) {
1959
matroska_parse_cues(matroska);
1960
matroska->cues_parsing_deferred = 0;
1900
1963
if (!st->nb_index_entries)
1902
1965
timestamp = FFMAX(timestamp, st->index_entries[0].timestamp);
1904
1967
if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) {
1905
1968
avio_seek(s->pb, st->index_entries[st->nb_index_entries-1].pos, SEEK_SET);
1969
matroska->current_id = 0;
1906
1970
while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) {
1907
1971
matroska_clear_queue(matroska);
1908
1972
if (matroska_parse_cluster(matroska) < 0)