From 01ec7efbe41f8b89678fe0fee662d0cfbca8140b Mon Sep 17 00:00:00 2001 From: Alexey Fisher Date: Sun, 19 Jun 2011 11:05:36 +0200 Subject: [PATCH] [MOVED FROM BAD 087/134] vp8enc: add lag-in-frames option. This option set maximum of frames codec should remember, to make better prediktion for alt-ref frames. See example: http://www.webmproject.org/tools/encoder-parameters/#2-pass_best_quality_vbr_encoding Signed-off-by: Alexey Fisher Signed-off-by: David Schleef --- ext/vp8/gstvp8enc.c | 19 ++++++++++++++++++- ext/vp8/gstvp8enc.h | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/ext/vp8/gstvp8enc.c b/ext/vp8/gstvp8enc.c index 60686fe..f0fa5d1 100644 --- a/ext/vp8/gstvp8enc.c +++ b/ext/vp8/gstvp8enc.c @@ -96,6 +96,7 @@ gst_vp8_enc_coder_hook_free (GstVP8EncCoderHook * hook) #define DEFAULT_MULTIPASS_MODE VPX_RC_ONE_PASS #define DEFAULT_MULTIPASS_CACHE_FILE "multipass.cache" #define DEFAULT_AUTO_ALT_REF_FRAMES FALSE +#define DEFAULT_LAG_IN_FRAMES 0 enum { @@ -112,7 +113,8 @@ enum PROP_THREADS, PROP_MULTIPASS_MODE, PROP_MULTIPASS_CACHE_FILE, - PROP_AUTO_ALT_REF_FRAMES + PROP_AUTO_ALT_REF_FRAMES, + PROP_LAG_IN_FRAMES }; #define GST_VP8_ENC_MODE_TYPE (gst_vp8_enc_mode_get_type()) @@ -328,6 +330,12 @@ gst_vp8_enc_class_init (GstVP8EncClass * klass) DEFAULT_AUTO_ALT_REF_FRAMES, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (gobject_class, PROP_LAG_IN_FRAMES, + g_param_spec_uint ("lag-in-frames", "Max number of frames to lag", + "If set, this value allows the encoder to consume a number of input " + "frames before producing output frames.", + 0, 64, DEFAULT_LAG_IN_FRAMES, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); GST_DEBUG_CATEGORY_INIT (gst_vp8enc_debug, "vp8enc", 0, "VP8 Encoder"); } @@ -349,6 +357,7 @@ gst_vp8_enc_init (GstVP8Enc * gst_vp8_enc, GstVP8EncClass * klass) gst_vp8_enc->multipass_mode = DEFAULT_MULTIPASS_MODE; gst_vp8_enc->multipass_cache_file = g_strdup (DEFAULT_MULTIPASS_CACHE_FILE); gst_vp8_enc->auto_alt_ref_frames = DEFAULT_AUTO_ALT_REF_FRAMES; + gst_vp8_enc->lag_in_frames = DEFAULT_LAG_IN_FRAMES; } static void @@ -420,6 +429,9 @@ gst_vp8_enc_set_property (GObject * object, guint prop_id, case PROP_AUTO_ALT_REF_FRAMES: gst_vp8_enc->auto_alt_ref_frames = g_value_get_boolean (value); break; + case PROP_LAG_IN_FRAMES: + gst_vp8_enc->lag_in_frames = g_value_get_uint (value); + break; default: break; } @@ -474,6 +486,9 @@ gst_vp8_enc_get_property (GObject * object, guint prop_id, GValue * value, case PROP_AUTO_ALT_REF_FRAMES: g_value_set_boolean (value, gst_vp8_enc->auto_alt_ref_frames); break; + case PROP_LAG_IN_FRAMES: + g_value_set_uint (value, gst_vp8_enc->lag_in_frames); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -621,6 +636,8 @@ gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, (encoder->auto_alt_ref_frames ? 1 : 0), gst_vpx_error_name (status)); } + cfg.g_lag_in_frames = encoder->lag_in_frames; + gst_base_video_encoder_set_latency (base_video_encoder, 0, gst_util_uint64_scale (encoder->max_latency, state->fps_d * GST_SECOND, state->fps_n)); diff --git a/ext/vp8/gstvp8enc.h b/ext/vp8/gstvp8enc.h index f9dbdc1..6b1dee1 100644 --- a/ext/vp8/gstvp8enc.h +++ b/ext/vp8/gstvp8enc.h @@ -73,6 +73,7 @@ struct _GstVP8Enc GByteArray *first_pass_cache_content; vpx_fixed_buf_t last_pass_cache_content; gboolean auto_alt_ref_frames; + unsigned int lag_in_frames; /* state */ gboolean inited; -- 2.7.4