[FFmpeg-devel] [PATCH] lavf/mov.c: Add -editlist_fix_index option for mov format.

wm4 nfxjfg at googlemail.com
Mon Jan 9 12:08:11 EET 2017


On Thu, 29 Dec 2016 15:04:07 -0800
Sasi Inguva <isasi-at-google.com at ffmpeg.org> wrote:

> Signed-off-by: Sasi Inguva <isasi at google.com>
> ---
>  libavformat/isom.h |  1 +
>  libavformat/mov.c  | 23 ++++++++++++++++++++---
>  2 files changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/libavformat/isom.h b/libavformat/isom.h
> index 12cefc9..ff3a234 100644
> --- a/libavformat/isom.h
> +++ b/libavformat/isom.h
> @@ -225,6 +225,7 @@ typedef struct MOVContext {
>      unsigned int nb_chapter_tracks;
>      int use_absolute_path;
>      int ignore_editlist;
> +    int editlist_fix_index;
>      int ignore_chapters;
>      int seek_individually;
>      int64_t next_root_atom; ///< offset of the next root atom
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index d1b9291..98f8c4c 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -3227,7 +3227,7 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
>      uint64_t stream_size = 0;
>  
>      if (sc->elst_count) {
> -        int i, edit_start_index = 0;
> +        int i, edit_start_index = 0, multiple_edits = 0;
>          int64_t empty_duration = 0; // empty duration of the first edit list entry
>          int64_t start_time = 0; // start time of the media
>  
> @@ -3240,15 +3240,28 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
>                  edit_start_index = 1;
>              } else if (i == edit_start_index && e->time >= 0) {
>                  start_time = e->time;
> +            } else {
> +                multiple_edits = 1;
>              }
>          }
>  
> +        if (multiple_edits && !mov->editlist_fix_index)
> +            av_log(mov->fc, AV_LOG_WARNING, "multiple edit list entries, "
> +                   "Use -editlist_fix_index to correctly decode otherwise "
> +                   "a/v desync might occur\n");
> +
>          /* adjust first dts according to edit list */
>          if ((empty_duration || start_time) && mov->time_scale > 0) {
>              if (empty_duration)
>                  empty_duration = av_rescale(empty_duration, sc->time_scale, mov->time_scale);
>              sc->time_offset = start_time - empty_duration;
> +            if (!mov->editlist_fix_index)
> +                current_dts = -sc->time_offset;
>          }
> +
> +        if (!multiple_edits && !mov->editlist_fix_index &&
> +            st->codecpar->codec_id == AV_CODEC_ID_AAC && start_time > 0)
> +            sc->start_pad = start_time;
>      }
>  
>      /* only use old uncompressed audio chunk demuxing when stts specifies it */
> @@ -3482,8 +3495,10 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
>          }
>      }
>  
> -    // Fix index according to edit lists.
> -    mov_fix_index(mov, st);
> +    if (!mov->ignore_editlist && mov->editlist_fix_index) {
> +        // Fix index according to edit lists.
> +        mov_fix_index(mov, st);
> +    }
>  }
>  
>  static int test_same_origin(const char *src, const char *ref) {
> @@ -6349,6 +6364,8 @@ static const AVOption mov_options[] = {
>          0, 1, FLAGS},
>      {"ignore_editlist", "", OFFSET(ignore_editlist), AV_OPT_TYPE_BOOL, {.i64 = 0},
>          0, 1, FLAGS},
> +    {"editlist_fix_index", "", OFFSET(editlist_fix_index), AV_OPT_TYPE_BOOL, {.i64 = 1},
> +        0, 1, FLAGS},
>      {"ignore_chapters", "", OFFSET(ignore_chapters), AV_OPT_TYPE_BOOL, {.i64 = 0},
>          0, 1, FLAGS},
>      {"use_mfra_for",

Missing description or justification of any kind, both in the commit
message and user documentation.


More information about the ffmpeg-devel mailing list