mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
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 <bug-track@fisher-privat.net> Signed-off-by: David Schleef <ds@schleef.org>
This commit is contained in:
parent
7770eb91aa
commit
782af30aa2
2 changed files with 19 additions and 1 deletions
|
@ -96,6 +96,7 @@ gst_vp8_enc_coder_hook_free (GstVP8EncCoderHook * hook)
|
||||||
#define DEFAULT_MULTIPASS_MODE VPX_RC_ONE_PASS
|
#define DEFAULT_MULTIPASS_MODE VPX_RC_ONE_PASS
|
||||||
#define DEFAULT_MULTIPASS_CACHE_FILE "multipass.cache"
|
#define DEFAULT_MULTIPASS_CACHE_FILE "multipass.cache"
|
||||||
#define DEFAULT_AUTO_ALT_REF_FRAMES FALSE
|
#define DEFAULT_AUTO_ALT_REF_FRAMES FALSE
|
||||||
|
#define DEFAULT_LAG_IN_FRAMES 0
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -112,7 +113,8 @@ enum
|
||||||
PROP_THREADS,
|
PROP_THREADS,
|
||||||
PROP_MULTIPASS_MODE,
|
PROP_MULTIPASS_MODE,
|
||||||
PROP_MULTIPASS_CACHE_FILE,
|
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())
|
#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,
|
DEFAULT_AUTO_ALT_REF_FRAMES,
|
||||||
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
|
(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");
|
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_mode = DEFAULT_MULTIPASS_MODE;
|
||||||
gst_vp8_enc->multipass_cache_file = g_strdup (DEFAULT_MULTIPASS_CACHE_FILE);
|
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->auto_alt_ref_frames = DEFAULT_AUTO_ALT_REF_FRAMES;
|
||||||
|
gst_vp8_enc->lag_in_frames = DEFAULT_LAG_IN_FRAMES;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -420,6 +429,9 @@ gst_vp8_enc_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_AUTO_ALT_REF_FRAMES:
|
case PROP_AUTO_ALT_REF_FRAMES:
|
||||||
gst_vp8_enc->auto_alt_ref_frames = g_value_get_boolean (value);
|
gst_vp8_enc->auto_alt_ref_frames = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_LAG_IN_FRAMES:
|
||||||
|
gst_vp8_enc->lag_in_frames = g_value_get_uint (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -474,6 +486,9 @@ gst_vp8_enc_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
case PROP_AUTO_ALT_REF_FRAMES:
|
case PROP_AUTO_ALT_REF_FRAMES:
|
||||||
g_value_set_boolean (value, gst_vp8_enc->auto_alt_ref_frames);
|
g_value_set_boolean (value, gst_vp8_enc->auto_alt_ref_frames);
|
||||||
break;
|
break;
|
||||||
|
case PROP_LAG_IN_FRAMES:
|
||||||
|
g_value_set_uint (value, gst_vp8_enc->lag_in_frames);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
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));
|
(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_base_video_encoder_set_latency (base_video_encoder, 0,
|
||||||
gst_util_uint64_scale (encoder->max_latency,
|
gst_util_uint64_scale (encoder->max_latency,
|
||||||
state->fps_d * GST_SECOND, state->fps_n));
|
state->fps_d * GST_SECOND, state->fps_n));
|
||||||
|
|
|
@ -73,6 +73,7 @@ struct _GstVP8Enc
|
||||||
GByteArray *first_pass_cache_content;
|
GByteArray *first_pass_cache_content;
|
||||||
vpx_fixed_buf_t last_pass_cache_content;
|
vpx_fixed_buf_t last_pass_cache_content;
|
||||||
gboolean auto_alt_ref_frames;
|
gboolean auto_alt_ref_frames;
|
||||||
|
unsigned int lag_in_frames;
|
||||||
|
|
||||||
/* state */
|
/* state */
|
||||||
gboolean inited;
|
gboolean inited;
|
||||||
|
|
Loading…
Reference in a new issue