[FFmpeg-trac] #8366(avformat:new): Audio ticks and video/audio out-of-sync when using MXF files with pre-charge

FFmpeg trac at avcodec.org
Tue Nov 5 17:55:40 EET 2019

#8366: Audio ticks and video/audio out-of-sync when using MXF files with pre-
             Reporter:  HenkDemper   |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:  avformat     |                  Version:  git-
             Keywords:  MXF pre-     |  master
  charge                             |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
 Summary of the bug:
 When we convert a MXF file that contains pre-charge frames (Long GOP
 codec), then the there will be audio ticks at the beginning and/or ending
 of the resulting output file. As a related problem, the video/audio can be
 a few frames out-of-sync.

 Workflow where this is used:
 With our Primestream Production software users make subclips from XDCAM
 MXF files out of Sony broadcast cameras or recorded with our Ingest
 software from feeds. These subclips are then (lossless) re-wrapped (with
 our own tool currently using bmx/libMXF as MXF writer) to MXF files and
 kept on the storage. Because the source MXF is Long GOP, the MXF subclips
 will have pre-charge by definition. For parts of our software we then
 create low-res QuickTime mov or MP4 proxies using ffmpeg command line.

 Background on pre-charge in MXF:
 As developer of MXF parsers, I believe this has to do because of the way
 that MXF files stores pre-charge: in MXF files, each frame is stored in a
 Content Package (CP), both video and audio. If we have pre-charge for Long
 GOP codecs, then each pre-charge frame is thus stored in it's own CP,
 together with some mandatory audio frames. These audio frames are never to
 be heard, they are just added as 'stuffing' to make complete CP packages
 to satisfy SMPTE ST377. Depending on how the MXF was created, these 'pre-
 charge audio frames' might contain silence, some original audio (belonging
 to  the never shown pre-charge frames) or could even be random/garbage.
 The 'Origin' parameter for both the video and audio tracks in the File
 Source Package are set to the size of the pre-charge. Note that for
 instance in QuickTime .mov/MP$ files you have (/need) no audio samples for
 pre-charge video frames, as they are separately addressed & stored per

 Likely cause of the bug:
 What I think is happening is that the ffmpeg MXF parser is correctly
 handling the video with the pre-charge frames, but when the calling layer
 requests audio for t=0, it returns from the beginning of the first CP,
 which is actually the never-to-be-heard/used pre-charge audio CP. Instead,
 it should take into consideration the Origin parameter of the File Source
 Package for the audio tracks and start reading audio from that CP instead.
 With our MXF files, these pre-charge audio frames are silent, hence you
 hear a tick when the waveform spikes to the real values after the pre-
 charge audio frames.
 Because the MXF starts to read audio at the wrong place ('too early'),
 video and audio will be out of sync with a difference of the pre-charge:
 somewhere between 0 and GOP Size frames, depending on the GOP layout.

 Quick look at ffmpeg source code:
 I see in libavformat\mxfdec.c that MXFSequence::origin is populated, and
 forwarded to av_dict_set_int() for material/source tracks. I also see some
 sample_time manipulations inside mxf_read_seek(), but I don't think the
 origin value is taken into account for audio here... I'm not the author of
 this code, and not familiar with the design, but happy to further
 discuss/dive in as needed...

 How to reproduce:
 % ffmpeg -i input.mxf -vcodec h264 -acodec copy -report output.mov
 ffmpeg version N-95635-gcae7f6658c-tessus
 built on: SnapShot from November 5th 2019

 I have attached:

 1. Input MXF file with pre-charge
 2. Excel sheet for this file showing GOP structure with 12 frames pre-
 3. Screenshot of MXF Analyser showing the 12 frames Origin for the 1st
 audio track
 4. Resulting output file QuickTime .mov that has a tick at start and end

Ticket URL: <https://trac.ffmpeg.org/ticket/8366>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker

More information about the FFmpeg-trac mailing list