From 5861bc9e75694b0c2d35708efceca0756ce6d77e Mon Sep 17 00:00:00 2001 From: Marton Balint <cus@passwd.hu> Date: Sun, 24 Jun 2018 22:07:31 +0200 Subject: [PATCH] avformat/mxfdec: guess constant byte count indexes based on track duration For clip wrapped essences this should work. Also, since index_edit_rate can now be different from track edit rate, remove overriding track edit rate. Signed-off-by: Marton Balint <cus@passwd.hu> --- libavformat/mxfdec.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 8f64bd95014..309419bbc2a 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -2911,10 +2911,10 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st) MXFIndexTableSegment *segment = NULL; MXFPartition *p = NULL; int essence_partition_count = 0; + int edit_unit_byte_count = 0; int i, ret; - /* TODO: support raw video without an index if they exist */ - if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO || !is_pcm(st->codecpar->codec_id) || track->wrapping != ClipWrapped) + if (!track || track->wrapping != ClipWrapped) return 0; /* check if track already has an IndexTableSegment */ @@ -2940,6 +2940,17 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st) if (essence_partition_count != 1) return 0; + if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && is_pcm(st->codecpar->codec_id)) { + edit_unit_byte_count = (av_get_bits_per_sample(st->codecpar->codec_id) * st->codecpar->channels) >> 3; + } else if (st->duration > 0 && p->first_essence_klv.length > 0 && p->first_essence_klv.length % st->duration == 0) { + edit_unit_byte_count = p->first_essence_klv.length / st->duration; + } + + if (edit_unit_byte_count <= 0) + return 0; + + av_log(mxf->fc, AV_LOG_WARNING, "guessing index for stream %d using edit unit byte count %d\n", st->index, edit_unit_byte_count); + if (!(segment = av_mallocz(sizeof(*segment)))) return AVERROR(ENOMEM); @@ -2952,14 +2963,13 @@ static int mxf_handle_missing_index_segment(MXFContext *mxf, AVStream *st) * using the same SID for index is forbidden in MXF. */ if (!track->index_sid) track->index_sid = track->body_sid; - track->edit_rate = av_inv_q(st->time_base); segment->type = IndexTableSegment; /* stream will be treated as small EditUnitByteCount */ - segment->edit_unit_byte_count = (av_get_bits_per_sample(st->codecpar->codec_id) * st->codecpar->channels) >> 3; + segment->edit_unit_byte_count = edit_unit_byte_count; segment->index_start_position = 0; segment->index_duration = st->duration; - segment->index_edit_rate = track->edit_rate; + segment->index_edit_rate = av_inv_q(st->time_base); segment->index_sid = track->index_sid; segment->body_sid = p->body_sid; return 0; -- GitLab