diff options
author | Marton Balint <cus@passwd.hu> | 2019-04-07 02:27:49 +0200 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2019-04-28 21:55:28 +0200 |
commit | 5b6960f955a8914594182baeb1ab8f523acc5323 (patch) | |
tree | 3101be23410e3cfd182efd7553e939acd2c8d694 /libavformat | |
parent | a5136426a73261e5b5a493f33944be82b6b659c6 (diff) | |
download | ffmpeg-streaming-5b6960f955a8914594182baeb1ab8f523acc5323.zip ffmpeg-streaming-5b6960f955a8914594182baeb1ab8f523acc5323.tar.gz |
avformat/mxfdec: guess wrapping of tracks by other tracks with the same body sid
This affects the following samples:
samples/ffmpeg-bugs/roundup/issue1775/av_seek_frame_failure.mxf
samples/ffmpeg-bugs/trac/ticket1957/16ch.mxf
samples/ffmpeg-bugs/trac/ticket5016/r0.mxf
samples/ffmpeg-bugs/trac/ticket5016/r1.mxf
samples/ffmpeg-bugs/trac/ticket5316/hq.MXF
samples/ffmpeg-bugs/trac/ticket5316/hqx.MXF
Some AVPacket->pos values are changed because for frame wrapped tracks we point
to the KLV offset and not the data.
Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/mxfdec.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 2c44852..034025b 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -2553,6 +2553,24 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) } } + for (int i = 0; i < mxf->fc->nb_streams; i++) { + MXFTrack *track1 = mxf->fc->streams[i]->priv_data; + if (track1 && track1->body_sid) { + for (int j = i + 1; j < mxf->fc->nb_streams; j++) { + MXFTrack *track2 = mxf->fc->streams[j]->priv_data; + if (track2 && track1->body_sid == track2->body_sid && track1->wrapping != track2->wrapping) { + if (track1->wrapping == UnknownWrapped) + track1->wrapping = track2->wrapping; + else if (track2->wrapping == UnknownWrapped) + track2->wrapping = track1->wrapping; + else + av_log(mxf->fc, AV_LOG_ERROR, "stream %d and stream %d have the same BodySID (%d) " + "with different wrapping\n", i, j, track1->body_sid); + } + } + } + } + ret = 0; fail_and_free: return ret; |