summaryrefslogtreecommitdiff
path: root/libavformat/mxfdec.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2018-06-24 22:07:31 +0200
committerMarton Balint <cus@passwd.hu>2018-07-04 21:52:21 +0200
commit5861bc9e75694b0c2d35708efceca0756ce6d77e (patch)
treeb53dd83490894933635001e7bd63da6159b86543 /libavformat/mxfdec.c
parentc6fff3d32f4e36e6ee4b2cf9e371a884d86a510b (diff)
downloadffmpeg-5861bc9e75694b0c2d35708efceca0756ce6d77e.tar.gz
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>
Diffstat (limited to 'libavformat/mxfdec.c')
-rw-r--r--libavformat/mxfdec.c20
1 files 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;