Skip to content
Snippets Groups Projects
Commit a5c17cf4 authored by Marton Balint's avatar Marton Balint
Browse files

avformat/mxfdec: drop invalid index table segments when sorting them


This way if an index table segment is present multiple times, we can always use
the proper one instead of the invalid one.

Fixes seeking in the sample of ticket #5671.

Signed-off-by: default avatarMarton Balint <cus@passwd.hu>
parent 0bb5cd8c
No related branches found
No related tags found
No related merge requests found
...@@ -1348,9 +1348,22 @@ static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segment ...@@ -1348,9 +1348,22 @@ static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segment
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
for (i = j = 0; i < mxf->metadata_sets_count; i++) for (i = nb_segments = 0; i < mxf->metadata_sets_count; i++) {
if (mxf->metadata_sets[i]->type == IndexTableSegment) if (mxf->metadata_sets[i]->type == IndexTableSegment) {
unsorted_segments[j++] = (MXFIndexTableSegment*)mxf->metadata_sets[i]; MXFIndexTableSegment *s = (MXFIndexTableSegment*)mxf->metadata_sets[i];
if (s->edit_unit_byte_count || s->nb_index_entries)
unsorted_segments[nb_segments++] = s;
else
av_log(mxf->fc, AV_LOG_WARNING, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n",
s->index_sid, s->index_start_position);
}
}
if (!nb_segments) {
av_freep(sorted_segments);
av_free(unsorted_segments);
return AVERROR_INVALIDDATA;
}
*nb_sorted_segments = 0; *nb_sorted_segments = 0;
...@@ -1482,7 +1495,7 @@ static int mxf_edit_unit_absolute_offset(MXFContext *mxf, MXFIndexTable *index_t ...@@ -1482,7 +1495,7 @@ static int mxf_edit_unit_absolute_offset(MXFContext *mxf, MXFIndexTable *index_t
if (s->edit_unit_byte_count) if (s->edit_unit_byte_count)
offset_temp += s->edit_unit_byte_count * index; offset_temp += s->edit_unit_byte_count * index;
else if (s->nb_index_entries) { else {
if (s->nb_index_entries == 2 * s->index_duration + 1) if (s->nb_index_entries == 2 * s->index_duration + 1)
index *= 2; /* Avid index */ index *= 2; /* Avid index */
...@@ -1493,10 +1506,6 @@ static int mxf_edit_unit_absolute_offset(MXFContext *mxf, MXFIndexTable *index_t ...@@ -1493,10 +1506,6 @@ static int mxf_edit_unit_absolute_offset(MXFContext *mxf, MXFIndexTable *index_t
} }
offset_temp = s->stream_offset_entries[index]; offset_temp = s->stream_offset_entries[index];
} else {
av_log(mxf->fc, AV_LOG_ERROR, "IndexSID %i segment at %"PRId64" missing EditUnitByteCount and IndexEntryArray\n",
index_table->index_sid, s->index_start_position);
return AVERROR_INVALIDDATA;
} }
if (edit_unit_out) if (edit_unit_out)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment