[FFmpeg-cvslog] avformat/mxfdec: guess constant byte count indexes based on track duration

Marton Balint git at videolan.org
Wed Jul 4 23:28:37 EEST 2018


ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Sun Jun 24 22:07:31 2018 +0200| [5861bc9e75694b0c2d35708efceca0756ce6d77e] | committer: Marton Balint

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 at passwd.hu>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5861bc9e75694b0c2d35708efceca0756ce6d77e
---

 libavformat/mxfdec.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index 8f64bd9501..309419bbc2 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;



More information about the ffmpeg-cvslog mailing list