Commit 566bfd59 authored by Clément Bœsch's avatar Clément Bœsch

Merge commit 'd639dcda'

* commit 'd639dcda':
  ratecontrol: Move Xvid-related functions to the place they are actually used
Merged-by: 's avatarClément Bœsch <u@pkh.me>
parents e4d65434 d639dcda
......@@ -26,4 +26,11 @@
* common functions for use with the Xvid wrappers
*/
struct MpegEncContext;
/* rate control */
int ff_xvid_rate_control_init(struct MpegEncContext *s);
void ff_xvid_rate_control_uninit(struct MpegEncContext *s);
float ff_xvid_rate_estimate_qscale(struct MpegEncContext *s, int dry_run);
#endif /* AVCODEC_LIBXVID_H */
......@@ -64,6 +64,7 @@
#include "bytestream.h"
#include "wmv2.h"
#include "rv10.h"
#include "libxvid.h"
#include <limits.h>
#include "sp5x.h"
......@@ -1027,9 +1028,32 @@ FF_ENABLE_DEPRECATION_WARNINGS
31, 0);
}
#if FF_API_RC_STRATEGY
FF_DISABLE_DEPRECATION_WARNINGS
if (!s->rc_strategy)
s->rc_strategy = s->avctx->rc_strategy;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
if (ff_rate_control_init(s) < 0)
return -1;
#if FF_API_RC_STRATEGY
av_assert0(MPV_RC_STRATEGY_XVID == FF_RC_STRATEGY_XVID);
#endif
if ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == MPV_RC_STRATEGY_XVID) {
#if CONFIG_LIBXVID
ret = ff_xvid_rate_control_init(s);
#else
ret = AVERROR(ENOSYS);
av_log(s->avctx, AV_LOG_ERROR,
"Xvid ratecontrol requires libavcodec compiled with Xvid support.\n");
#endif
if (ret < 0)
return ret;
}
#if FF_API_ERROR_RATE
FF_DISABLE_DEPRECATION_WARNINGS
if (avctx->error_rate)
......@@ -1123,6 +1147,10 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
int i;
ff_rate_control_uninit(s);
#if CONFIG_LIBXVID
if ((avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == MPV_RC_STRATEGY_XVID)
ff_xvid_rate_control_uninit(s);
#endif
ff_mpv_common_end(s);
if (CONFIG_MJPEG_ENCODER &&
......@@ -3629,8 +3657,15 @@ static int estimate_qp(MpegEncContext *s, int dry_run){
s->current_picture.f->quality = s->next_lambda;
if(!dry_run) s->next_lambda= 0;
} else if (!s->fixed_qscale) {
int quality;
#if CONFIG_LIBXVID
if ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == MPV_RC_STRATEGY_XVID)
quality = ff_xvid_rate_estimate_qscale(s, dry_run);
else
#endif
quality = ff_rate_estimate_qscale(s, dry_run);
s->current_picture_ptr->f->quality =
s->current_picture.f->quality = ff_rate_estimate_qscale(s, dry_run);
s->current_picture.f->quality = quality;
if (s->current_picture.f->quality < 0)
return -1;
}
......
......@@ -136,13 +136,6 @@ av_cold int ff_rate_control_init(MpegEncContext *s)
return res;
}
#if FF_API_RC_STRATEGY
FF_DISABLE_DEPRECATION_WARNINGS
if (!s->rc_strategy)
s->rc_strategy = s->avctx->rc_strategy;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
for (i = 0; i < 5; i++) {
rcc->pred[i].coeff = FF_QP2LAMBDA * 7.0;
rcc->pred[i].count = 1.0;
......@@ -226,21 +219,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
ff_rate_control_uninit(s);
return -1;
}
#if FF_API_RC_STRATEGY
av_assert0(MPV_RC_STRATEGY_XVID == FF_RC_STRATEGY_XVID);
#endif
// FIXME maybe move to end
if ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == MPV_RC_STRATEGY_XVID) {
#if CONFIG_LIBXVID
return ff_xvid_rate_control_init(s);
#else
av_log(s->avctx, AV_LOG_ERROR,
"Xvid ratecontrol requires libavcodec compiled with Xvid support.\n");
return -1;
#endif
}
}
if (!(s->avctx->flags & AV_CODEC_FLAG_PASS2)) {
......@@ -310,11 +288,6 @@ av_cold void ff_rate_control_uninit(MpegEncContext *s)
av_expr_free(rcc->rc_eq_eval);
av_freep(&rcc->entry);
#if CONFIG_LIBXVID
if ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == MPV_RC_STRATEGY_XVID)
ff_xvid_rate_control_uninit(s);
#endif
}
int ff_vbv_update(MpegEncContext *s, int frame_size)
......@@ -758,11 +731,6 @@ float ff_rate_estimate_qscale(MpegEncContext *s, int dry_run)
Picture * const pic = &s->current_picture;
emms_c();
#if CONFIG_LIBXVID
if ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == MPV_RC_STRATEGY_XVID)
return ff_xvid_rate_estimate_qscale(s, dry_run);
#endif
get_qminmax(&qmin, &qmax, s, pict_type);
fps = get_fps(s->avctx);
......
......@@ -96,8 +96,4 @@ void ff_rate_control_uninit(struct MpegEncContext *s);
int ff_vbv_update(struct MpegEncContext *s, int frame_size);
void ff_get_2pass_fcode(struct MpegEncContext *s);
int ff_xvid_rate_control_init(struct MpegEncContext *s);
void ff_xvid_rate_control_uninit(struct MpegEncContext *s);
float ff_xvid_rate_estimate_qscale(struct MpegEncContext *s, int dry_run);
#endif /* AVCODEC_RATECONTROL_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment