Unified · Split
| @@ -190,7 +190,6 @@ typedef struct { · 189 unmodified lines | |||
| 190 | uint8_t *local_tags; | 190 | uint8_t *local_tags; |
| 191 | int local_tags_count; | 191 | int local_tags_count; |
| 192 | uint64_t footer_partition; | 192 | uint64_t footer_partition; |
| 193 | int system_item; | ||
| 194 | int64_t essence_offset; | 193 | int64_t essence_offset; |
| 195 | int first_essence_kl_length; | 194 | int first_essence_kl_length; |
| 196 | int64_t first_essence_length; | 195 | int64_t first_essence_length; |
| @@ -986,17 +985,22 @@ static int mxf_get_sorted_table_segments(MXFContext *mxf, int *nb_sorted_segment · 789 unmodified lines | |||
| 986 | return 0; | 985 | return 0; |
| 987 | } | 986 | } |
| 988 | 987 | ||
| 989 | static int mxf_parse_index(MXFContext *mxf, int i, AVStream *st) | 988 | static int mxf_parse_index(MXFContext *mxf, int track_id, AVStream *st) |
| 990 | { | 989 | { |
| 991 | int64_t accumulated_offset = 0; | 990 | int64_t accumulated_offset = 0; |
| 992 | int j, k, ret, nb_sorted_segments; | 991 | int j, k, ret, nb_sorted_segments; |
| 993 | MXFIndexTableSegment **sorted_segments; | 992 | MXFIndexTableSegment **sorted_segments; |
| 993 | int n_delta = track_id - 1; /* TrackID = 1-based stream index */ | ||
| 994 | |||
| 995 | if (track_id < 1) { | ||
| 996 | av_log(mxf->fc, AV_LOG_ERROR, "TrackID not positive: %i\n", track_id); | ||
| 997 | return AVERROR_INVALIDDATA; | ||
| 998 | } | ||
| 994 | 999 | ||
| 995 | if ((ret = mxf_get_sorted_table_segments(mxf, &nb_sorted_segments, &sorted_segments))) | 1000 | if ((ret = mxf_get_sorted_table_segments(mxf, &nb_sorted_segments, &sorted_segments))) |
| 996 | return ret; | 1001 | return ret; |
| 997 | 1002 | ||
| 998 | for (j = 0; j < nb_sorted_segments; j++) { | 1003 | for (j = 0; j < nb_sorted_segments; j++) { |
| 999 | int n_delta = i; | ||
| 1000 | int duration, sample_duration = 1, last_sample_size = 0; | 1004 | int duration, sample_duration = 1, last_sample_size = 0; |
| 1001 | int64_t segment_size; | 1005 | int64_t segment_size; |
| 1002 | MXFIndexTableSegment *tableseg = sorted_segments[j]; | 1006 | MXFIndexTableSegment *tableseg = sorted_segments[j]; |
| @@ -1005,9 +1009,6 @@ static int mxf_parse_index(MXFContext *mxf, int i, AVStream *st) · 2 unmodified lines | |||
| 1005 | if (j > 0 && tableseg->body_sid != sorted_segments[j-1]->body_sid) | 1009 | if (j > 0 && tableseg->body_sid != sorted_segments[j-1]->body_sid) |
| 1006 | accumulated_offset = 0; | 1010 | accumulated_offset = 0; |
| 1007 | 1011 | ||
| 1008 | /* HACK: How to correctly link between streams and slices? */ | ||
| 1009 | if (i < mxf->system_item + st->index) | ||
| 1010 | n_delta++; | ||
| 1011 | if (n_delta >= tableseg->nb_delta_entries && st->index != 0) | 1012 | if (n_delta >= tableseg->nb_delta_entries && st->index != 0) |
| 1012 | continue; | 1013 | continue; |
| 1013 | duration = tableseg->index_duration > 0 ? tableseg->index_duration : | 1014 | duration = tableseg->index_duration > 0 ? tableseg->index_duration : |
| @@ -1075,8 +1076,8 @@ static int mxf_parse_index(MXFContext *mxf, int i, AVStream *st) · 61 unmodified lines | |||
| 1075 | 1076 | ||
| 1076 | pos += mxf->essence_offset; | 1077 | pos += mxf->essence_offset; |
| 1077 | 1078 | ||
| 1078 | av_dlog(mxf->fc, "Stream %d IndexEntry %d n_Delta %d Offset %"PRIx64" Timestamp %"PRId64"\n", | 1079 | av_dlog(mxf->fc, "Stream %d IndexEntry %d TrackID %d Offset %"PRIx64" Timestamp %"PRId64"\n", |
| 1079 | st->index, st->nb_index_entries, n_delta, pos, sample_duration * st->nb_index_entries); | 1080 | st->index, st->nb_index_entries, track_id, pos, sample_duration * st->nb_index_entries); |
| 1080 | 1081 | ||
| 1081 | if ((ret = av_add_index_entry(st, pos, sample_duration * st->nb_index_entries, size, 0, flags)) < 0) | 1082 | if ((ret = av_add_index_entry(st, pos, sample_duration * st->nb_index_entries, size, 0, flags)) < 0) |
| 1082 | return ret; | 1083 | return ret; |
| @@ -1275,7 +1276,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) · 192 unmodified lines | |||
| 1275 | st->need_parsing = AVSTREAM_PARSE_FULL; | 1276 | st->need_parsing = AVSTREAM_PARSE_FULL; |
| 1276 | } | 1277 | } |
| 1277 | 1278 | ||
| 1278 | if ((ret = mxf_parse_index(mxf, i, st))) | 1279 | if ((ret = mxf_parse_index(mxf, material_track->track_id, st))) |
| 1279 | return ret; | 1280 | return ret; |
| 1280 | } | 1281 | } |
| 1281 | return 0; | 1282 | return 0; |
| @@ -1524,10 +1525,6 @@ static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) · 242 unmodified lines | |||
| 1524 | } | 1525 | } |
| 1525 | } | 1526 | } |
| 1526 | 1527 | ||
| 1527 | if (IS_KLV_KEY(klv.key, mxf_system_item_key)) { | ||
| 1528 | mxf->system_item = 1; | ||
| 1529 | } | ||
| 1530 | |||
| 1531 | if (!mxf->essence_offset) | 1528 | if (!mxf->essence_offset) |
| 1532 | mxf->essence_offset = klv.offset; | 1529 | mxf->essence_offset = klv.offset; |
| 1533 | 1530 | ||