ratecontrol: Move Xvid-related functions to the place they are actually used
authorVittorio Giovara <vittorio.giovara@gmail.com>
Wed, 20 Jul 2016 16:02:23 +0000 (18:02 +0200)
committerVittorio Giovara <vittorio.giovara@gmail.com>
Wed, 20 Jul 2016 16:59:36 +0000 (18:59 +0200)
This will simplify the de-MpegEncContextualization.

libavcodec/libxvid.h
libavcodec/mpegvideo_enc.c
libavcodec/ratecontrol.c
libavcodec/ratecontrol.h

index 15f908f..4535898 100644 (file)
 
 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 */
index 4e0fae8..d738d06 100644 (file)
@@ -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;
     }
index fc65e6c..7e604b1 100644 (file)
@@ -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);
index da39af7..2976806 100644 (file)
@@ -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 */