From fbf253c632fd5c43c1677c59a078f24336b247bd Mon Sep 17 00:00:00 2001 From: Alexey Fisher Date: Wed, 18 May 2011 13:26:23 +0200 Subject: [PATCH] [MOVED FROM BAD 077/134] vp8enc: Add properties to select a maximum and minimum quantizer Fixes bug #641405. --- ext/vp8/gstvp8enc.c | 39 ++++++++++++++++++++++++++++++++++++++- ext/vp8/gstvp8enc.h | 2 ++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/ext/vp8/gstvp8enc.c b/ext/vp8/gstvp8enc.c index 2bf1301ad1..20cb38e3f4 100644 --- a/ext/vp8/gstvp8enc.c +++ b/ext/vp8/gstvp8enc.c @@ -67,6 +67,8 @@ typedef struct #define DEFAULT_BITRATE 0 #define DEFAULT_MODE VPX_VBR +#define DEFAULT_MIN_QUANTIZER 0 +#define DEFAULT_MAX_QUANTIZER 63 #define DEFAULT_QUALITY 5 #define DEFAULT_ERROR_RESILIENT FALSE #define DEFAULT_MAX_LATENCY 10 @@ -82,6 +84,8 @@ enum PROP_0, PROP_BITRATE, PROP_MODE, + PROP_MIN_QUANTIZER, + PROP_MAX_QUANTIZER, PROP_QUALITY, PROP_ERROR_RESILIENT, PROP_MAX_LATENCY, @@ -240,6 +244,18 @@ gst_vp8_enc_class_init (GstVP8EncClass * klass) GST_VP8_ENC_MODE_TYPE, DEFAULT_MODE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_MIN_QUANTIZER, + g_param_spec_int ("qp-min", "Minimum quantizer", + "Minimum (best) quantizer", + 0, 63, DEFAULT_MIN_QUANTIZER, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + g_object_class_install_property (gobject_class, PROP_MAX_QUANTIZER, + g_param_spec_int ("qp-max", "Maximum quantizer", + "Maximum (worst) quantizer", + 0, 63, DEFAULT_MAX_QUANTIZER, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_QUALITY, g_param_spec_double ("quality", "Quality", "Quality. This parameter set constant quantizer.", @@ -305,6 +321,8 @@ gst_vp8_enc_init (GstVP8Enc * gst_vp8_enc, GstVP8EncClass * klass) GST_DEBUG_OBJECT (gst_vp8_enc, "init"); gst_vp8_enc->bitrate = DEFAULT_BITRATE; + gst_vp8_enc->min_quantizer = DEFAULT_MIN_QUANTIZER; + gst_vp8_enc->max_quantizer = DEFAULT_MAX_QUANTIZER; gst_vp8_enc->mode = DEFAULT_MODE; gst_vp8_enc->quality = DEFAULT_QUALITY; gst_vp8_enc->error_resilient = DEFAULT_ERROR_RESILIENT; @@ -349,6 +367,12 @@ gst_vp8_enc_set_property (GObject * object, guint prop_id, case PROP_MODE: gst_vp8_enc->mode = g_value_get_enum (value); break; + case PROP_MIN_QUANTIZER: + gst_vp8_enc->min_quantizer = g_value_get_int (value); + break; + case PROP_MAX_QUANTIZER: + gst_vp8_enc->max_quantizer = g_value_get_int (value); + break; case PROP_QUALITY: gst_vp8_enc->quality = g_value_get_double (value); break; @@ -399,6 +423,12 @@ gst_vp8_enc_get_property (GObject * object, guint prop_id, GValue * value, case PROP_MODE: g_value_set_enum (value, gst_vp8_enc->mode); break; + case PROP_MIN_QUANTIZER: + g_value_set_int (value, gst_vp8_enc->min_quantizer); + break; + case PROP_MAX_QUANTIZER: + g_value_set_int (value, gst_vp8_enc->max_quantizer); + break; case PROP_QUALITY: g_value_set_double (value, gst_vp8_enc->quality); break; @@ -505,8 +535,15 @@ gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, cfg.g_lag_in_frames = encoder->max_latency; cfg.g_threads = encoder->threads; cfg.rc_end_usage = encoder->mode; - if (encoder->bitrate) { + /* Standalone qp-min do not make any sence, with bitrate=0 and qp-min=1 + * encoder will use only default qp-max=63. Also this will make + * worst possbile quality. + */ + if (encoder->bitrate != DEFAULT_BITRATE || + encoder->max_quantizer != DEFAULT_MAX_QUANTIZER) { cfg.rc_target_bitrate = encoder->bitrate / 1000; + cfg.rc_min_quantizer = encoder->min_quantizer; + cfg.rc_max_quantizer = encoder->max_quantizer; } else { cfg.rc_min_quantizer = (gint) (63 - encoder->quality * 6.2); cfg.rc_max_quantizer = (gint) (63 - encoder->quality * 6.2); diff --git a/ext/vp8/gstvp8enc.h b/ext/vp8/gstvp8enc.h index b5e8f2e916..f9dbdc1bf4 100644 --- a/ext/vp8/gstvp8enc.h +++ b/ext/vp8/gstvp8enc.h @@ -60,6 +60,8 @@ struct _GstVP8Enc /* properties */ int bitrate; enum vpx_rc_mode mode; + int min_quantizer; + int max_quantizer; double quality; gboolean error_resilient; int max_latency; -- 2.34.1