@@ -2063,6 +2063,52 @@ static int mxf_compute_ptses_fake_index(MXFContext *mxf, MXFIndexTable *index_ta
return 0;
}
+static int mxf_validate_coherent_index_tables(MXFContext *mxf, int *is_coherent) {
+ int i, j, ret, nb_sorted_segments = 0;
+ MXFIndexTable *index_tables;
+ int nb_index_tables = 0;
+ int coherent_index_tables = 1;
+ MXFIndexTableSegment **sorted_segments = NULL;
+
+ ret = mxf_get_sorted_table_segments(mxf, &nb_sorted_segments, &sorted_segments);
+
+ index_tables = av_calloc(nb_index_tables, sizeof(MXFIndexTable));
+ if (!index_tables) {
+ av_log(mxf->fc, AV_LOG_ERROR, "failed to allocate index tables\n");
+ av_free(sorted_segments);
+ return AVERROR(ENOMEM);
+ }
+
+ /* distribute sorted segments to index tables */
+ for (i = j = 0; i < nb_sorted_segments; i++) {
+ if (i != 0 && sorted_segments[i-1]->index_sid != sorted_segments[i]->index_sid) {
+ /* next IndexSID */
+ j++;
+ }
+
+ index_tables[j].nb_segments++;
+ }
+
+ for (i = j = 0; j < nb_index_tables; i += index_tables[j++].nb_segments) {
+ if (sorted_segments[i]->index_start_position) {
+ av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i starts at EditUnit %"PRId64" - seeking may not work as expected\n",
+ sorted_segments[i]->index_sid, sorted_segments[i]->index_start_position);
+ coherent_index_tables = 0;
+ }
+ }
+
+ av_free(sorted_segments);
+
+ if (ret == 0 && coherent_index_tables) {
+ *is_coherent = 1;
+ } else {
+ *is_coherent = 0;
+ }
+
+ return 0;
+}
+
+
/**
* Sorts and collects index table segments into index tables.
* Also computes PTSes if possible.
@@ -3752,6 +3798,16 @@ static int mxf_read_header(AVFormatContext *s)
if (!essence_offset)
essence_offset = klv.offset;
+ if (mxf->mxf_inspect_mode == 1) {
+ int ret_local, coherent_index_tables;
+ ret_local = mxf_validate_coherent_index_tables(mxf, &coherent_index_tables);
+
+ // Break only if index table is coherent
+ if (ret_local == 0 && coherent_index_tables == 1) {
+ break;
+ }
+ }
+
/* seek to footer, previous partition or stop */
if (mxf_parse_handle_essence(mxf) <= 0)
break;