aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorVittorio Giovara <vittorio.giovara@gmail.com>2016-07-20 18:02:23 +0200
committerVittorio Giovara <vittorio.giovara@gmail.com>2016-07-20 18:59:36 +0200
commitd639dcdae022130078c9c84b7b691c5e9694786c (patch)
tree9eadc97d19f4d2f08775fe49e8177d91cb986eaa /libavcodec
parent44972e227df0f7ad5aa9004d971fb54e9dc5c849 (diff)
downloadffmpeg-d639dcdae022130078c9c84b7b691c5e9694786c.tar.gz
ratecontrol: Move Xvid-related functions to the place they are actually used
This will simplify the de-MpegEncContextualization.
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/libxvid.h7
-rw-r--r--libavcodec/mpegvideo_enc.c33
-rw-r--r--libavcodec/ratecontrol.c28
-rw-r--r--libavcodec/ratecontrol.h4
4 files changed, 39 insertions, 33 deletions
diff --git a/libavcodec/libxvid.h b/libavcodec/libxvid.h
index 15f908f6f5..4535898530 100644
--- a/libavcodec/libxvid.h
+++ b/libavcodec/libxvid.h
@@ -28,4 +28,11 @@
int ff_tempfile(const char *prefix, char **filename);
+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 */
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 4e0fae815f..d738d06ee6 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -60,6 +60,7 @@
#include "bytestream.h"
#include "wmv2.h"
#include "rv10.h"
+#include "libxvid.h"
#include <limits.h>
#define QUANT_BIAS_SHIFT 8
@@ -871,9 +872,28 @@ 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 ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == 1) {
+#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)
@@ -967,6 +987,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 == 1)
+ ff_xvid_rate_control_uninit(s);
+#endif
ff_mpv_common_end(s);
if (CONFIG_MJPEG_ENCODER &&
@@ -3385,8 +3409,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 == 1)
+ 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;
}
diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c
index fc65e6cbd9..7e604b1efb 100644
--- a/libavcodec/ratecontrol.c
+++ b/libavcodec/ratecontrol.c
@@ -110,13 +110,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;
@@ -198,17 +191,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
ff_rate_control_uninit(s);
return -1;
}
-
- // FIXME maybe move to end
- if ((s->avctx->flags & AV_CODEC_FLAG_PASS2) && s->rc_strategy == 1) {
-#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)) {
@@ -278,11 +260,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 == 1)
- ff_xvid_rate_control_uninit(s);
-#endif
}
int ff_vbv_update(MpegEncContext *s, int frame_size)
@@ -723,11 +700,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 == 1)
- return ff_xvid_rate_estimate_qscale(s, dry_run);
-#endif
-
get_qminmax(&qmin, &qmax, s, pict_type);
fps = 1 / av_q2d(s->avctx->time_base);
diff --git a/libavcodec/ratecontrol.h b/libavcodec/ratecontrol.h
index da39af7956..2976806c8e 100644
--- a/libavcodec/ratecontrol.h
+++ b/libavcodec/ratecontrol.h
@@ -95,8 +95,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 */