Merge commit '2df0c32ea12ddfa72ba88309812bfb13b674130f'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 14 Oct 2014 00:16:16 +0000 (02:16 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 14 Oct 2014 00:16:16 +0000 (02:16 +0200)
* commit '2df0c32ea12ddfa72ba88309812bfb13b674130f':
  lavc: use a separate field for exporting audio encoder padding

Conflicts:
libavcodec/audio_frame_queue.c
libavcodec/avcodec.h
libavcodec/libvorbisenc.c
libavcodec/utils.c
libavcodec/version.h
libavcodec/wmaenc.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
22 files changed:
1  2 
doc/APIchanges
libavcodec/aacenc.c
libavcodec/ac3enc.c
libavcodec/audio_frame_queue.c
libavcodec/avcodec.h
libavcodec/g722enc.c
libavcodec/libfaac.c
libavcodec/libfdk-aacenc.c
libavcodec/libmp3lame.c
libavcodec/libopencore-amr.c
libavcodec/libopusenc.c
libavcodec/libspeexenc.c
libavcodec/libtwolame.c
libavcodec/libvo-aacenc.c
libavcodec/libvo-amrwbenc.c
libavcodec/libvorbisenc.c
libavcodec/mpegaudioenc_template.c
libavcodec/nellymoserenc.c
libavcodec/ra144enc.c
libavcodec/utils.c
libavcodec/version.h
libavcodec/wmaenc.c

diff --cc doc/APIchanges
Simple merge
Simple merge
Simple merge
  
  av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
  {
 -    afq->avctx             = avctx;
 -    afq->next_pts          = AV_NOPTS_VALUE;
 +    afq->avctx = avctx;
-     afq->remaining_delay   = avctx->delay;
-     afq->remaining_samples = avctx->delay;
+     afq->remaining_delay   = avctx->initial_padding;
+     afq->remaining_samples = avctx->initial_padding;
 -    afq->frame_queue       = NULL;
 -}
 -
 -static void delete_next_frame(AudioFrameQueue *afq)
 -{
 -    AudioFrame *f = afq->frame_queue;
 -    if (f) {
 -        afq->frame_queue = f->next;
 -        f->next = NULL;
 -        av_freep(&f);
 -    }
 +    afq->frame_count       = 0;
  }
  
  void ff_af_queue_close(AudioFrameQueue *afq)
@@@ -2981,132 -2773,23 +2972,149 @@@ typedef struct AVCodecContext 
      int side_data_only_packets;
  
      /**
+      * Audio only. The number of "priming" samples (padding) inserted by the
+      * encoder at the beginning of the audio. I.e. this number of leading
+      * decoded samples must be discarded by the caller to get the original audio
+      * without leading padding.
+      *
+      * - decoding: unused
+      * - encoding: Set by libavcodec. The timestamps on the output packets are
+      *             adjusted by the encoder so that they always refer to the
+      *             first sample of the data actually contained in the packet,
+      *             including any added padding.  E.g. if the timebase is
+      *             1/samplerate and the timestamp of the first input sample is
+      *             0, the timestamp of the first output packet will be
+      *             -initial_padding.
+      */
+     int initial_padding;
++
++    /**
 +     * 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
@@@ -151,23 -152,12 +151,23 @@@ static av_cold int Faac_encode_init(AVC
      }
  
      if (!faacEncSetConfiguration(s->faac_handle, faac_cfg)) {
 -        av_log(avctx, AV_LOG_ERROR, "libfaac doesn't support this output format!\n");
 -        ret = AVERROR(EINVAL);
 -        goto error;
 +        int i;
 +        for (i = avctx->bit_rate/1000; i ; i--) {
 +            faac_cfg->bitRate = 1000*i / avctx->channels;
 +            if (faacEncSetConfiguration(s->faac_handle, faac_cfg))
 +                break;
 +        }
 +        if (!i) {
 +            av_log(avctx, AV_LOG_ERROR, "libfaac doesn't support this output format!\n");
 +            ret = AVERROR(EINVAL);
 +            goto error;
 +        } else {
 +            avctx->bit_rate = 1000*i;
 +            av_log(avctx, AV_LOG_WARNING, "libfaac doesn't support the specified bitrate, using %dkbit/s instead\n", i);
 +        }
      }
  
-     avctx->delay = FAAC_DELAY_SAMPLES;
+     avctx->initial_padding = FAAC_DELAY_SAMPLES;
      ff_af_queue_init(avctx, &s->afq);
  
      return 0;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -152,10 -148,10 +152,10 @@@ static int twolame_encode_frame(AVCodec
      if (ret < 0)  // twolame error
          return AVERROR_UNKNOWN;
  
 -    avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples);
      if (frame) {
 +        avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples);
          if (frame->pts != AV_NOPTS_VALUE)
-             avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay);
+             avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding);
      } else {
          avpkt->pts = s->next_pts;
      }
Simple merge
Simple merge
@@@ -345,12 -322,9 +345,12 @@@ static int libvorbis_encode_frame(AVCod
      if (duration > 0) {
          /* we do not know encoder delay until we get the first packet from
           * libvorbis, so we have to update the AudioFrameQueue counts */
-         if (!avctx->delay && s->afq.frames) {
-             avctx->delay              = duration;
 -        if (!avctx->initial_padding) {
++        if (!avctx->initial_padding && s->afq.frames) {
+             avctx->initial_padding    = duration;
 -            s->afq.remaining_delay   += duration;
 +            av_assert0(!s->afq.remaining_delay);
 +            s->afq.frames->duration  += duration;
 +            if (s->afq.frames->pts != AV_NOPTS_VALUE)
 +                s->afq.frames->pts       -= duration;
              s->afq.remaining_samples += duration;
          }
          ff_af_queue_remove(&s->afq, duration, &avpkt->pts, &avpkt->duration);
Simple merge
Simple merge
Simple merge
@@@ -1607,11 -1240,12 +1607,16 @@@ int attribute_align_arg avcodec_open2(A
          }
      }
  
 +    ret=0;
 +
+ #if FF_API_AUDIOENC_DELAY
+     if (av_codec_is_encoder(avctx->codec))
+         avctx->delay = avctx->initial_padding;
+ #endif
      if (av_codec_is_decoder(avctx->codec)) {
 +        if (!avctx->bit_rate)
 +            avctx->bit_rate = get_bit_rate(avctx);
          /* validate channel layout from the decoder */
          if (avctx->channel_layout) {
              int channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
@@@ -1919,8 -1451,11 +1924,12 @@@ FF_ENABLE_DEPRECATION_WARNING
  
  end:
      av_frame_free(&padded_frame);
 +    av_free(extended_frame);
  
+ #if FF_API_AUDIOENC_DELAY
+     avctx->delay = avctx->initial_padding;
+ #endif
      return ret;
  }
  
@@@ -29,8 -29,8 +29,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVCODEC_VERSION_MAJOR 56
- #define LIBAVCODEC_VERSION_MINOR  4
- #define LIBAVCODEC_VERSION_MICRO 101
 -#define LIBAVCODEC_VERSION_MINOR  3
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR  5
++#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
  #ifndef FF_API_AFD
  #define FF_API_AFD               (LIBAVCODEC_VERSION_MAJOR < 57)
  #endif
 +#ifndef FF_API_VISMV
 +/* XXX: don't forget to drop the -vismv documentation */
 +#define FF_API_VISMV             (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
 +#ifndef FF_API_DV_FRAME_PROFILE
 +#define FF_API_DV_FRAME_PROFILE  (LIBAVCODEC_VERSION_MAJOR < 57)
 +#endif
+ #ifndef FF_API_AUDIOENC_DELAY
+ #define FF_API_AUDIOENC_DELAY    (LIBAVCODEC_VERSION_MAJOR < 58)
+ #endif
  
  #endif /* AVCODEC_VERSION_H */
@@@ -88,9 -90,9 +88,7 @@@ static av_cold int encode_init(AVCodecC
                           (avctx->sample_rate * 8);
      block_align        = FFMIN(block_align, MAX_CODED_SUPERFRAME_SIZE);
      avctx->block_align = block_align;
-     avctx->frame_size  =
-     avctx->delay       = s->frame_len;
 -    avctx->bit_rate    = avctx->block_align * 8LL * avctx->sample_rate /
 -                         s->frame_len;
+     avctx->frame_size = avctx->initial_padding = s->frame_len;
  
      return 0;
  }
@@@ -400,10 -417,9 +398,10 @@@ static int encode_superframe(AVCodecCon
          put_bits(&s->pb, 8, 'N');
  
      flush_put_bits(&s->pb);
 +    av_assert0(put_bits_ptr(&s->pb) - s->pb.buf == avctx->block_align);
  
      if (frame->pts != AV_NOPTS_VALUE)
-         avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay);
+         avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding);
  
      avpkt->size     = avctx->block_align;
      *got_packet_ptr = 1;