Merge commit '7ea1b3472a61de4aa4d41b571e99418e4997ad41'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 15 Oct 2014 11:38:10 +0000 (13:38 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 15 Oct 2014 13:49:31 +0000 (15:49 +0200)
* commit '7ea1b3472a61de4aa4d41b571e99418e4997ad41':
  lavc: deprecate the use of AVCodecContext.time_base for decoding

Conflicts:
libavcodec/avcodec.h
libavcodec/h264.c
libavcodec/mpegvideo_parser.c
libavcodec/utils.c
libavcodec/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
27 files changed:
1  2 
doc/APIchanges
libavcodec/avcodec.h
libavcodec/cavsdec.c
libavcodec/dirac.c
libavcodec/dvdec.c
libavcodec/eacmv.c
libavcodec/eamad.c
libavcodec/eatgq.c
libavcodec/eatgv.c
libavcodec/eatqi.c
libavcodec/h261dec.c
libavcodec/h264.c
libavcodec/h264_slice.c
libavcodec/hevc.c
libavcodec/ituh263dec.c
libavcodec/libschroedingerdec.c
libavcodec/mpeg12dec.c
libavcodec/mpeg4videodec.c
libavcodec/mpegvideo_parser.c
libavcodec/options.c
libavcodec/pthread_frame.c
libavcodec/utils.c
libavcodec/vaapi_mpeg4.c
libavcodec/vc1.c
libavcodec/vdpau_mpeg4.c
libavcodec/version.h
libavcodec/vp3.c

diff --cc doc/APIchanges
Simple merge
@@@ -2988,133 -2790,15 +2989,141 @@@ typedef struct AVCodecContext 
       */
      int initial_padding;
  
+     /*
+      * - decoding: For codecs that store a framerate value in the compressed
+      *             bitstream, the decoder may export it here. { 0, 1} when
+      *             unknown.
+      * - encoding: unused
+      */
+     AVRational framerate;
++
 +    /**
 +     * Timebase in which pkt_dts/pts and AVPacket.dts/pts are.
 +     * Code outside libavcodec should access this field using:
 +     * av_codec_{get,set}_pkt_timebase(avctx)
 +     * - encoding unused.
 +     * - decoding set by user.
 +     */
 +    AVRational pkt_timebase;
 +
 +    /**
 +     * AVCodecDescriptor
 +     * Code outside libavcodec should access this field using:
 +     * av_codec_{get,set}_codec_descriptor(avctx)
 +     * - encoding: unused.
 +     * - decoding: set by libavcodec.
 +     */
 +    const AVCodecDescriptor *codec_descriptor;
 +
 +#if !FF_API_LOWRES
 +    /**
 +     * low resolution decoding, 1-> 1/2 size, 2->1/4 size
 +     * - encoding: unused
 +     * - decoding: Set by user.
 +     * Code outside libavcodec should access this field using:
 +     * av_codec_{get,set}_lowres(avctx)
 +     */
 +     int lowres;
 +#endif
 +
 +    /**
 +     * Current statistics for PTS correction.
 +     * - decoding: maintained and used by libavcodec, not intended to be used by user apps
 +     * - encoding: unused
 +     */
 +    int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far
 +    int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far
 +    int64_t pts_correction_last_pts;       /// PTS of the last frame
 +    int64_t pts_correction_last_dts;       /// DTS of the last frame
 +
 +    /**
 +     * Character encoding of the input subtitles file.
 +     * - decoding: set by user
 +     * - encoding: unused
 +     */
 +    char *sub_charenc;
 +
 +    /**
 +     * Subtitles character encoding mode. Formats or codecs might be adjusting
 +     * this setting (if they are doing the conversion themselves for instance).
 +     * - decoding: set by libavcodec
 +     * - encoding: unused
 +     */
 +    int sub_charenc_mode;
 +#define FF_SUB_CHARENC_MODE_DO_NOTHING  -1  ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance)
 +#define FF_SUB_CHARENC_MODE_AUTOMATIC    0  ///< libavcodec will select the mode itself
 +#define FF_SUB_CHARENC_MODE_PRE_DECODER  1  ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv
 +
 +    /**
 +     * Skip processing alpha if supported by codec.
 +     * Note that if the format uses pre-multiplied alpha (common with VP6,
 +     * and recommended due to better video quality/compression)
 +     * the image will look as if alpha-blended onto a black background.
 +     * However for formats that do not use pre-multiplied alpha
 +     * there might be serious artefacts (though e.g. libswscale currently
 +     * assumes pre-multiplied alpha anyway).
 +     * Code outside libavcodec should access this field using AVOptions
 +     *
 +     * - decoding: set by user
 +     * - encoding: unused
 +     */
 +    int skip_alpha;
 +
 +    /**
 +     * Number of samples to skip after a discontinuity
 +     * - decoding: unused
 +     * - encoding: set by libavcodec
 +     */
 +    int seek_preroll;
 +
 +#if !FF_API_DEBUG_MV
 +    /**
 +     * debug motion vectors
 +     * Code outside libavcodec should access this field using AVOptions
 +     * - encoding: Set by user.
 +     * - decoding: Set by user.
 +     */
 +    int debug_mv;
 +#define FF_DEBUG_VIS_MV_P_FOR  0x00000001 //visualize forward predicted MVs of P frames
 +#define FF_DEBUG_VIS_MV_B_FOR  0x00000002 //visualize forward predicted MVs of B frames
 +#define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
 +#endif
 +
 +    /**
 +     * custom intra quantization matrix
 +     * Code outside libavcodec should access this field using av_codec_g/set_chroma_intra_matrix()
 +     * - encoding: Set by user, can be NULL.
 +     * - decoding: unused.
 +     */
 +    uint16_t *chroma_intra_matrix;
 +
 +    /**
 +     * dump format separator.
 +     * can be ", " or "\n      " or anything else
 +     * Code outside libavcodec should access this field using AVOptions
 +     * (NO direct access).
 +     * - encoding: Set by user.
 +     * - decoding: Set by user.
 +     */
 +    uint8_t *dump_separator;
 +
  } AVCodecContext;
  
 +AVRational av_codec_get_pkt_timebase         (const AVCodecContext *avctx);
 +void       av_codec_set_pkt_timebase         (AVCodecContext *avctx, AVRational val);
 +
 +const AVCodecDescriptor *av_codec_get_codec_descriptor(const AVCodecContext *avctx);
 +void                     av_codec_set_codec_descriptor(AVCodecContext *avctx, const AVCodecDescriptor *desc);
 +
 +int  av_codec_get_lowres(const AVCodecContext *avctx);
 +void av_codec_set_lowres(AVCodecContext *avctx, int val);
 +
 +int  av_codec_get_seek_preroll(const AVCodecContext *avctx);
 +void av_codec_set_seek_preroll(AVCodecContext *avctx, int val);
 +
 +uint16_t *av_codec_get_chroma_intra_matrix(const AVCodecContext *avctx);
 +void av_codec_set_chroma_intra_matrix(AVCodecContext *avctx, uint16_t *val);
 +
  /**
   * AVProfile.
   */
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -682,17 -650,13 +682,17 @@@ av_cold int ff_h264_decode_init(AVCodec
      for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
          h->last_pocs[i] = INT_MIN;
      h->prev_poc_msb = 1 << 16;
 +    h->prev_frame_num = -1;
      h->x264_build   = -1;
 +    h->sei_fpa.frame_packing_arrangement_cancel_flag = -1;
      ff_h264_reset_sei(h);
 -    h->recovery_frame = -1;
 -    h->frame_recovered = 0;
      if (avctx->codec_id == AV_CODEC_ID_H264) {
 -        if (avctx->ticks_per_frame == 1)
 -            h->avctx->framerate.num *= 2;
 +        if (avctx->ticks_per_frame == 1) {
-             if(h->avctx->time_base.den < INT_MAX/2) {
-                 h->avctx->time_base.den *= 2;
++            if(h->avctx->framerate.num < INT_MAX/2) {
++                h->avctx->framerate.num *= 2;
 +            } else
-                 h->avctx->time_base.num /= 2;
++                h->avctx->framerate.den /= 2;
 +        }
          avctx->ticks_per_frame = 2;
      }
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1774,10 -1735,10 +1773,12 @@@ static int decode_vol_header(Mpeg4DecCo
      check_marker(gb, "before fixed_vop_rate");
  
      if (get_bits1(gb) != 0)     /* fixed_vop_rate  */
-         s->avctx->time_base.num = get_bits(gb, ctx->time_increment_bits);
+         s->avctx->framerate.den = get_bits(gb, ctx->time_increment_bits);
      else
-         s->avctx->time_base.num = 1;
+         s->avctx->framerate.den = 1;
++    s->avctx->time_base = av_inv_q(av_mul_q(s->avctx->framerate, (AVRational){s->avctx->ticks_per_frame, 1}));
 +
      ctx->t_frame = 0;
  
      if (ctx->shape != BIN_ONLY_SHAPE) {
@@@ -2034,17 -1987,6 +2035,17 @@@ no_cplx_est
          }
      }
  
-                s->avctx->time_base.num, s->avctx->time_base.den,
 +    if (s->avctx->debug&FF_DEBUG_PICT_INFO) {
 +        av_log(s->avctx, AV_LOG_DEBUG, "tb %d/%d, tincrbits:%d, qp_prec:%d, ps:%d,  %s%s%s%s\n",
++               s->avctx->framerate.den, s->avctx->framerate.num,
 +               ctx->time_increment_bits,
 +               s->quant_precision,
 +               s->progressive_sequence,
 +               ctx->scalability ? "scalability " :"" , s->quarter_sample ? "qpel " : "",
 +               s->data_partitioning ? "partition " : "", ctx->rvlc ? "rvlc " : ""
 +        );
 +    }
 +
      return 0;
  }
  
@@@ -2264,9 -2115,6 +2265,10 @@@ static int decode_vop_header(Mpeg4DecCo
  
          av_log(s->avctx, AV_LOG_ERROR,
                 "my guess is %d bits ;)\n", ctx->time_increment_bits);
-         if (s->avctx->time_base.den && 4*s->avctx->time_base.den < 1<<ctx->time_increment_bits) {
-             s->avctx->time_base.den = 1<<ctx->time_increment_bits;
++        if (s->avctx->framerate.num && 4*s->avctx->framerate.num < 1<<ctx->time_increment_bits) {
++            s->avctx->framerate.num = 1<<ctx->time_increment_bits;
++            s->avctx->time_base = av_inv_q(av_mul_q(s->avctx->framerate, (AVRational){s->avctx->ticks_per_frame, 1}));
 +        }
      }
  
      if (IS_3IV1)
          }
      }
  
-     if (s->avctx->time_base.num)
-         pts = ROUNDED_DIV(s->time, s->avctx->time_base.num);
++    if (s->avctx->framerate.den)
++        pts = ROUNDED_DIV(s->time, s->avctx->framerate.den);
 +    else
 +        pts = AV_NOPTS_VALUE;
 +    if (s->avctx->debug&FF_DEBUG_PTS)
 +        av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %"PRId64"\n",
 +               pts);
 +
      check_marker(gb, "before vop_coded");
  
      /* vop coded */
@@@ -70,9 -66,8 +70,8 @@@ static void mpegvideo_extract_headers(A
                      did_set_size=1;
                  }
                  frame_rate_index = buf[3] & 0xf;
-                 pc->frame_rate.den = avctx->time_base.den = ff_mpeg12_frame_rate_tab[frame_rate_index].num;
-                 pc->frame_rate.num = avctx->time_base.num = ff_mpeg12_frame_rate_tab[frame_rate_index].den;
+                 pc->frame_rate = avctx->framerate = ff_mpeg12_frame_rate_tab[frame_rate_index];
 -                avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400;
 +                bit_rate = (buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6);
                  avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
              }
              break;
  
                          pc->width  |=(horiz_size_ext << 12);
                          pc->height |=( vert_size_ext << 12);
 -                        avctx->bit_rate += (bit_rate_ext << 18) * 400;
 +                        bit_rate = (bit_rate&0x3FFFF) | (bit_rate_ext << 18);
                          if(did_set_size)
                              ff_set_dimensions(avctx, pc->width, pc->height);
-                         avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1) * 2;
-                         avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1);
+                         avctx->framerate.num = pc->frame_rate.num * (frame_rate_ext_n + 1) * 2;
+                         avctx->framerate.den = pc->frame_rate.den * (frame_rate_ext_d + 1);
                          avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
                      }
                      break;
          }
      }
   the_end: ;
 +    if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO && bit_rate) {
 +        avctx->rc_max_rate = 400*bit_rate;
 +    }
 +    if (bit_rate &&
 +        ((avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO && bit_rate != 0x3FFFF) || vbv_delay != 0xFFFF)) {
 +        avctx->bit_rate = 400*bit_rate;
 +    }
+ #if FF_API_AVCTX_TIMEBASE
+     if (avctx->framerate.num)
+         avctx->time_base = av_inv_q(avctx->framerate);
+ #endif
  }
  
  static int mpegvideo_parse(AVCodecParserContext *s,
@@@ -94,18 -84,11 +94,19 @@@ int avcodec_get_context_defaults3(AVCod
      s->av_class = &av_codec_context_class;
  
      s->codec_type = codec ? codec->type : AVMEDIA_TYPE_UNKNOWN;
 -    s->codec      = codec;
 -    av_opt_set_defaults(s);
 +    if (codec)
 +        s->codec_id = codec->id;
 +
 +    if(s->codec_type == AVMEDIA_TYPE_AUDIO)
 +        flags= AV_OPT_FLAG_AUDIO_PARAM;
 +    else if(s->codec_type == AVMEDIA_TYPE_VIDEO)
 +        flags= AV_OPT_FLAG_VIDEO_PARAM;
 +    else if(s->codec_type == AVMEDIA_TYPE_SUBTITLE)
 +        flags= AV_OPT_FLAG_SUBTITLE_PARAM;
 +    av_opt_set_defaults2(s, flags, flags);
  
      s->time_base           = (AVRational){0,1};
+     s->framerate           = (AVRational){ 0, 1 };
      s->get_buffer2         = avcodec_default_get_buffer2;
      s->get_format          = avcodec_default_get_format;
      s->execute             = avcodec_default_execute;
Simple merge
@@@ -1637,46 -1262,19 +1637,51 @@@ int attribute_align_arg avcodec_open2(A
              ret = AVERROR(EINVAL);
              goto free_and_end;
          }
 +        if (avctx->sub_charenc) {
 +            if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
 +                av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
 +                       "supported with subtitles codecs\n");
 +                ret = AVERROR(EINVAL);
 +                goto free_and_end;
 +            } else if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) {
 +                av_log(avctx, AV_LOG_WARNING, "Codec '%s' is bitmap-based, "
 +                       "subtitles character encoding will be ignored\n",
 +                       avctx->codec_descriptor->name);
 +                avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_DO_NOTHING;
 +            } else {
 +                /* input character encoding is set for a text based subtitle
 +                 * codec at this point */
 +                if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_AUTOMATIC)
 +                    avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_PRE_DECODER;
 +
 +                if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_PRE_DECODER) {
 +#if CONFIG_ICONV
 +                    iconv_t cd = iconv_open("UTF-8", avctx->sub_charenc);
 +                    if (cd == (iconv_t)-1) {
 +                        av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
 +                               "with input character encoding \"%s\"\n", avctx->sub_charenc);
 +                        ret = AVERROR(errno);
 +                        goto free_and_end;
 +                    }
 +                    iconv_close(cd);
 +#else
 +                    av_log(avctx, AV_LOG_ERROR, "Character encoding subtitles "
 +                           "conversion needs a libavcodec built with iconv support "
 +                           "for this codec\n");
 +                    ret = AVERROR(ENOSYS);
 +                    goto free_and_end;
 +#endif
 +                }
 +            }
 +        }
+ #if FF_API_AVCTX_TIMEBASE
+         if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
+             avctx->time_base = av_inv_q(avctx->framerate);
+ #endif
      }
  end:
 -    entangled_thread_counter--;
 -
 -    /* Release any user-supplied mutex. */
 -    if (lockmgr_cb) {
 -        (*lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
 -    }
 +    ff_unlock_avcodec();
      if (options) {
          av_dict_free(options);
          *options = tmp;
@@@ -2380,10 -1679,11 +2385,15 @@@ fail
      } else
          ret = 0;
  
 +    /* many decoders assign whole AVFrames, thus overwriting extended_data;
 +     * make sure it's set correctly */
 +    av_assert0(!picture->extended_data || picture->extended_data == picture->data);
 +
+ #if FF_API_AVCTX_TIMEBASE
+     if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
+         avctx->time_base = av_inv_q(avctx->framerate);
+ #endif
      return ret;
  }
  
Simple merge
Simple merge
Simple merge
@@@ -29,8 -29,8 +29,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVCODEC_VERSION_MAJOR 56
- #define LIBAVCODEC_VERSION_MINOR  6
 -#define LIBAVCODEC_VERSION_MINOR  5
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR  7
 +#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
Simple merge