Merge commit '1384df641994bf3d6cb51084290aa94752737bae'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 7 Nov 2014 21:59:00 +0000 (22:59 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 7 Nov 2014 22:09:30 +0000 (23:09 +0100)
* commit '1384df641994bf3d6cb51084290aa94752737bae':
  lavf: Add an option for avoiding negative timestamps

Conflicts:
libavformat/avformat.h
libavformat/mux.c
libavformat/options_table.h
libavformat/version.h

See: 3ba0dab76ac32f0c9f50c916a73bc64e43c1fdf9
See: a89c01253190b9eb9de8e28a3252423bf7732511
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/APIchanges
libavformat/avformat.h
libavformat/mux.c
libavformat/options_table.h
libavformat/version.h

diff --cc doc/APIchanges
@@@ -899,7 -476,7 +899,10 @@@ lavd 54.4.100 / 54.0.0, lavfi 3.5.
    avresample_read() are now uint8_t** instead of void**.
    Libavresample is now stable.
  
 -2012-09-24 - a42aada - lavc 54.28.0 - avcodec.h
++2012-09-26 - 3ba0dab7 / 1384df64 - lavf 54.29.101 / 56.06.3 - avformat.h
++  Add AVFormatContext.avoid_negative_ts.
++
 +2012-09-24 - 46a3595 / a42aada - lavc 54.59.100 / 54.28.0 - avcodec.h
    Add avcodec_free_frame(). This function must now
    be used for freeing an AVFrame.
  
@@@ -1475,131 -1198,18 +1475,132 @@@ typedef struct AVFormatContext 
       */
      int max_ts_probe;
  
 -     * Note, this only works when using av_interleaved_write_frame.
+     /**
+      * Avoid negative timestamps during muxing.
+      * Any value of the AVFMT_AVOID_NEG_TS_* constants.
-      * Avoid negative timestamps during muxing.
-      *  0 -> allow negative timestamps
-      *  1 -> avoid negative timestamps
-      * -1 -> choose automatically (default)
-      * Note, this only works when interleave_packet_per_dts is in use.
-      * - encoding: Set by user via AVOptions (NO direct access)
-      * - decoding: unused
-      */
-     int avoid_negative_ts;
-     /**
++     * Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use)
+      * - muxing: Set by user
+      * - demuxing: unused
+      */
+     int avoid_negative_ts;
+ #define AVFMT_AVOID_NEG_TS_AUTO             -1 ///< Enabled when required by target format
+ #define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative
+ #define AVFMT_AVOID_NEG_TS_MAKE_ZERO         2 ///< Shift timestamps so that they start at 0
 +
 +    /**
 +     * Transport stream id.
 +     * This will be moved into demuxer private options. Thus no API/ABI compatibility
 +     */
 +    int ts_id;
 +
 +    /**
 +     * Audio preload in microseconds.
 +     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int audio_preload;
 +
 +    /**
 +     * Max chunk time in microseconds.
 +     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int max_chunk_duration;
 +
 +    /**
 +     * Max chunk size in bytes
 +     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int max_chunk_size;
 +
 +    /**
 +     * forces the use of wallclock timestamps as pts/dts of packets
 +     * This has undefined results in the presence of B frames.
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    int use_wallclock_as_timestamps;
 +
 +    /**
 +     * avio flags, used to force AVIO_FLAG_DIRECT.
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    int avio_flags;
 +
 +    /**
 +     * The duration field can be estimated through various ways, and this field can be used
 +     * to know how the duration was estimated.
 +     * - encoding: unused
 +     * - decoding: Read by user via AVOptions (NO direct access)
 +     */
 +    enum AVDurationEstimationMethod duration_estimation_method;
 +
 +    /**
 +     * Skip initial bytes when opening stream
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    int64_t skip_initial_bytes;
 +
 +    /**
 +     * Correct single timestamp overflows
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    unsigned int correct_ts_overflow;
 +
 +    /**
 +     * Force seeking to any (also non key) frames.
 +     * - encoding: unused
 +     * - decoding: Set by user via AVOptions (NO direct access)
 +     */
 +    int seek2any;
 +
 +    /**
 +     * Flush the I/O context after each packet.
 +     * - encoding: Set by user via AVOptions (NO direct access)
 +     * - decoding: unused
 +     */
 +    int flush_packets;
 +
 +    /**
 +     * format probing score.
 +     * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes
 +     * the format.
 +     * - encoding: unused
 +     * - decoding: set by avformat, read by user via av_format_get_probe_score() (NO direct access)
 +     */
 +    int probe_score;
 +
 +    /**
 +     * number of bytes to read maximally to identify format.
 +     * - encoding: unused
 +     * - decoding: set by user through AVOPtions (NO direct access)
 +     */
 +    int format_probesize;
 +
 +    /**
 +     * ',' seperated list of allowed decoders.
 +     * If NULL then all are allowed
 +     * - encoding: unused
 +     * - decoding: set by user through AVOptions (NO direct access)
 +     */
 +    char *codec_whitelist;
 +
 +    /**
 +     * ',' seperated list of allowed demuxers.
 +     * If NULL then all are allowed
 +     * - encoding: unused
 +     * - decoding: set by user through AVOptions (NO direct access)
 +     */
 +    char *format_whitelist;
 +
      /*****************************************************************
       * All fields below this line are not part of the public API. They
       * may not be used outside of libavformat and can be changed and
@@@ -407,18 -244,11 +407,19 @@@ int avformat_write_header(AVFormatConte
  
      if (s->oformat->write_header) {
          ret = s->oformat->write_header(s);
 +        if (ret >= 0 && s->pb && s->pb->error < 0)
 +            ret = s->pb->error;
          if (ret < 0)
              return ret;
 +        if (s->flush_packets && s->pb && s->pb->error >= 0 && s->flags & AVFMT_FLAG_FLUSH_PACKETS)
 +            avio_flush(s->pb);
      }
  
 -    if (s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_AUTO) {
 +    if ((ret = init_pts(s)) < 0)
 +        return ret;
 +
 +    if (s->avoid_negative_ts < 0) {
++        av_assert2(s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_AUTO);
          if (s->oformat->flags & (AVFMT_TS_NEGATIVE | AVFMT_NOTIMESTAMPS)) {
              s->avoid_negative_ts = 0;
          } else
@@@ -538,36 -321,21 +539,37 @@@ static int compute_pkt_fields2(AVFormat
   * Those additional safety checks should be dropped once the correct checks
   * are set in the callers.
   */
 -
  static int write_packet(AVFormatContext *s, AVPacket *pkt)
  {
 -    int ret;
 +    int ret, did_split;
 +
 +    if (s->output_ts_offset) {
 +        AVStream *st = s->streams[pkt->stream_index];
 +        int64_t offset = av_rescale_q(s->output_ts_offset, AV_TIME_BASE_Q, st->time_base);
 +
 +        if (pkt->dts != AV_NOPTS_VALUE)
 +            pkt->dts += offset;
 +        if (pkt->pts != AV_NOPTS_VALUE)
 +            pkt->pts += offset;
 +    }
 +
      if (s->avoid_negative_ts > 0) {
 -        AVRational time_base = s->streams[pkt->stream_index]->time_base;
 -        int64_t offset = 0;
 +        AVStream *st = s->streams[pkt->stream_index];
 +        int64_t offset = st->mux_ts_offset;
  
-         if ((pkt->dts < 0 || s->avoid_negative_ts == 2) && pkt->dts != AV_NOPTS_VALUE && !s->offset) {
+         if (!s->offset && pkt->dts != AV_NOPTS_VALUE &&
+             (pkt->dts < 0 || s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO)) {
              s->offset = -pkt->dts;
 -            s->offset_timebase = time_base;
 +            s->offset_timebase = st->time_base;
 +        }
 +
 +        if (s->offset && !offset) {
 +            offset = st->mux_ts_offset =
 +                av_rescale_q_rnd(s->offset,
 +                                 s->offset_timebase,
 +                                 st->time_base,
 +                                 AV_ROUND_UP);
          }
 -        if (s->offset)
 -            offset = av_rescale_q(s->offset, s->offset_timebase, time_base);
  
          if (pkt->dts != AV_NOPTS_VALUE)
              pkt->dts += offset;
@@@ -73,32 -59,17 +73,32 @@@ static const AVOption avformat_options[
  {"bitstream", "detect bitstream specification deviations", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_BITSTREAM }, INT_MIN, INT_MAX, D, "err_detect"},
  {"buffer", "detect improper bitstream length", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_BUFFER }, INT_MIN, INT_MAX, D, "err_detect"},
  {"explode", "abort decoding on minor error detection", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_EXPLODE }, INT_MIN, INT_MAX, D, "err_detect"},
- {"avoid_negative_ts", "shift timestamps so they start at 0", OFFSET(avoid_negative_ts), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, E, "avoid_negative_ts"},
- {"auto",                "enabled when required by target format",    0, AV_OPT_TYPE_CONST, {.i64 = -1 }, INT_MIN, INT_MAX, E, "avoid_negative_ts"},
- {"disabled",            "do not change timestamps",                  0, AV_OPT_TYPE_CONST, {.i64 =  0 }, INT_MIN, INT_MAX, E, "avoid_negative_ts"},
- {"make_zero",           "shift timestamps so they start at 0",       0, AV_OPT_TYPE_CONST, {.i64 =  2 }, INT_MIN, INT_MAX, E, "avoid_negative_ts"},
- {"make_non_negative",   "shift timestamps so they are non negative", 0, AV_OPT_TYPE_CONST, {.i64 =  1 }, INT_MIN, INT_MAX, E, "avoid_negative_ts"},
 +{"ignore_err", "ignore errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_IGNORE_ERR }, INT_MIN, INT_MAX, D, "err_detect"},
 +{"careful",    "consider things that violate the spec, are fast to check and have not been seen in the wild as errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_CAREFUL }, INT_MIN, INT_MAX, D, "err_detect"},
 +{"compliant",  "consider all spec non compliancies as errors", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_COMPLIANT }, INT_MIN, INT_MAX, D, "err_detect"},
 +{"aggressive", "consider things that a sane encoder shouldn't do as an error", 0, AV_OPT_TYPE_CONST, {.i64 = AV_EF_AGGRESSIVE }, INT_MIN, INT_MAX, D, "err_detect"},
 +{"use_wallclock_as_timestamps", "use wallclock as timestamps", OFFSET(use_wallclock_as_timestamps), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX-1, D},
 +{"skip_initial_bytes", "set number of bytes to skip before reading header and frames", OFFSET(skip_initial_bytes), AV_OPT_TYPE_INT64, {.i64 = 0}, 0, INT64_MAX-1, D},
 +{"correct_ts_overflow", "correct single timestamp overflows", OFFSET(correct_ts_overflow), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, D},
 +{"flush_packets", "enable flushing of the I/O context after each packet", OFFSET(flush_packets), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, E},
 +{"metadata_header_padding", "set number of bytes to be written as padding in a metadata header", OFFSET(metadata_header_padding), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, E},
 +{"output_ts_offset", "set output timestamp offset", OFFSET(output_ts_offset), AV_OPT_TYPE_DURATION, {.i64 = 0}, -INT64_MAX, INT64_MAX, E},
  {"max_interleave_delta", "maximum buffering duration for interleaving", OFFSET(max_interleave_delta), AV_OPT_TYPE_INT64, { .i64 = 10000000 }, 0, INT64_MAX, E },
  {"f_strict", "how strictly to follow the standards (deprecated; use strict, save via avconv)", OFFSET(strict_std_compliance), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, D|E, "strict"},
  {"strict", "how strictly to follow the standards", OFFSET(strict_std_compliance), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, D|E, "strict"},
  {"strict", "strictly conform to all the things in the spec no matter what the consequences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_STRICT }, INT_MIN, INT_MAX, D|E, "strict"},
  {"normal", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_NORMAL }, INT_MIN, INT_MAX, D|E, "strict"},
 +{"unofficial", "allow unofficial extensions", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_UNOFFICIAL }, INT_MIN, INT_MAX, D|E, "strict"},
  {"experimental", "allow non-standardized experimental variants", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_EXPERIMENTAL }, INT_MIN, INT_MAX, D|E, "strict"},
  {"max_ts_probe", "maximum number of packets to read while waiting for the first timestamp", OFFSET(max_ts_probe), AV_OPT_TYPE_INT, { .i64 = 50 }, 0, INT_MAX, D },
+ {"avoid_negative_ts", "shift timestamps so they start at 0", OFFSET(avoid_negative_ts), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, E, "avoid_negative_ts"},
+ {"auto",              "enabled when required by target format",    0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_AVOID_NEG_TS_AUTO },              INT_MIN, INT_MAX, E, "avoid_negative_ts"},
++{"disabled",          "do not change timestamps",                  0, AV_OPT_TYPE_CONST, {.i64 = 0 },                                    INT_MIN, INT_MAX, E, "avoid_negative_ts"},
+ {"make_non_negative", "shift timestamps so they are non negative", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE }, INT_MIN, INT_MAX, E, "avoid_negative_ts"},
+ {"make_zero",         "shift timestamps so they start at 0",       0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_AVOID_NEG_TS_MAKE_ZERO },         INT_MIN, INT_MAX, E, "avoid_negative_ts"},
 +{"dump_separator", "set information dump field separator", OFFSET(dump_separator), AV_OPT_TYPE_STRING, {.str = ", "}, CHAR_MIN, CHAR_MAX, D|E},
 +{"codec_whitelist", "List of decoders that are allowed to be used", OFFSET(codec_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
 +{"format_whitelist", "List of demuxers that are allowed to be used", OFFSET(format_whitelist), AV_OPT_TYPE_STRING, { .str = NULL },  CHAR_MIN, CHAR_MAX, D },
  {NULL},
  };
  
@@@ -30,8 -30,8 +30,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 56
 -#define LIBAVFORMAT_VERSION_MINOR  6
 -#define LIBAVFORMAT_VERSION_MICRO  3
 +#define LIBAVFORMAT_VERSION_MINOR  12
- #define LIBAVFORMAT_VERSION_MICRO 101
++#define LIBAVFORMAT_VERSION_MICRO 102
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \