mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-05 18:22:23 +00:00
msdk: Add more tuning options
Added tuning options for mb level bitrate control, adaptive I-frame insertion, and adaptive B-frame insertion. https://bugzilla.gnome.org/show_bug.cgi?id=791637
This commit is contained in:
parent
f25bcf7cb8
commit
07c05a75a5
5 changed files with 99 additions and 17 deletions
|
@ -100,6 +100,9 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
#define PROP_RC_LOOKAHEAD_DEPTH_DEFAULT 10
|
#define PROP_RC_LOOKAHEAD_DEPTH_DEFAULT 10
|
||||||
#define PROP_MAX_VBV_BITRATE_DEFAULT 0
|
#define PROP_MAX_VBV_BITRATE_DEFAULT 0
|
||||||
#define PROP_MAX_FRAME_SIZE_DEFAULT 0
|
#define PROP_MAX_FRAME_SIZE_DEFAULT 0
|
||||||
|
#define PROP_MBBRC_DEFAULT MFX_CODINGOPTION_OFF
|
||||||
|
#define PROP_ADAPTIVE_I_DEFAULT MFX_CODINGOPTION_OFF
|
||||||
|
#define PROP_ADAPTIVE_B_DEFAULT MFX_CODINGOPTION_OFF
|
||||||
|
|
||||||
#define gst_msdkenc_parent_class parent_class
|
#define gst_msdkenc_parent_class parent_class
|
||||||
G_DEFINE_TYPE (GstMsdkEnc, gst_msdkenc, GST_TYPE_VIDEO_ENCODER);
|
G_DEFINE_TYPE (GstMsdkEnc, gst_msdkenc, GST_TYPE_VIDEO_ENCODER);
|
||||||
|
@ -155,7 +158,6 @@ ensure_bitrate_control (GstMsdkEnc * thiz)
|
||||||
|
|
||||||
case MFX_RATECONTROL_LA_ICQ:
|
case MFX_RATECONTROL_LA_ICQ:
|
||||||
option2->LookAheadDepth = thiz->lookahead_depth;
|
option2->LookAheadDepth = thiz->lookahead_depth;
|
||||||
thiz->enable_extopt2 = TRUE;
|
|
||||||
case MFX_RATECONTROL_ICQ:
|
case MFX_RATECONTROL_ICQ:
|
||||||
mfx->ICQQuality = CLAMP (thiz->qpi, 1, 51);
|
mfx->ICQQuality = CLAMP (thiz->qpi, 1, 51);
|
||||||
break;
|
break;
|
||||||
|
@ -163,7 +165,6 @@ ensure_bitrate_control (GstMsdkEnc * thiz)
|
||||||
case MFX_RATECONTROL_LA: /* VBR with LA. Only supported in H264?? */
|
case MFX_RATECONTROL_LA: /* VBR with LA. Only supported in H264?? */
|
||||||
case MFX_RATECONTROL_LA_HRD: /* VBR with LA, HRD compliant */
|
case MFX_RATECONTROL_LA_HRD: /* VBR with LA, HRD compliant */
|
||||||
option2->LookAheadDepth = thiz->lookahead_depth;
|
option2->LookAheadDepth = thiz->lookahead_depth;
|
||||||
thiz->enable_extopt2 = TRUE;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MFX_RATECONTROL_QVBR:
|
case MFX_RATECONTROL_QVBR:
|
||||||
|
@ -177,7 +178,6 @@ ensure_bitrate_control (GstMsdkEnc * thiz)
|
||||||
|
|
||||||
case MFX_RATECONTROL_VBR:
|
case MFX_RATECONTROL_VBR:
|
||||||
option2->MaxFrameSize = thiz->max_frame_size * 1000;
|
option2->MaxFrameSize = thiz->max_frame_size * 1000;
|
||||||
thiz->enable_extopt2 = TRUE;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MFX_RATECONTROL_VCM:
|
case MFX_RATECONTROL_VCM:
|
||||||
|
@ -194,6 +194,30 @@ ensure_bitrate_control (GstMsdkEnc * thiz)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ensure_extended_coding_options (GstMsdkEnc * thiz)
|
||||||
|
{
|
||||||
|
mfxExtCodingOption2 *option2 = &thiz->option2;
|
||||||
|
mfxExtCodingOption3 *option3 = &thiz->option3;
|
||||||
|
|
||||||
|
/* Fill ExtendedCodingOption2, set non-zero defaults too */
|
||||||
|
option2->Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
|
||||||
|
option2->Header.BufferSz = sizeof (thiz->option2);
|
||||||
|
option2->MBBRC = thiz->mbbrc;
|
||||||
|
option2->AdaptiveI = thiz->adaptive_i;
|
||||||
|
option2->AdaptiveB = thiz->adaptive_b;
|
||||||
|
option2->BitrateLimit = MFX_CODINGOPTION_OFF;
|
||||||
|
option2->EnableMAD = MFX_CODINGOPTION_OFF;
|
||||||
|
option2->UseRawRef = MFX_CODINGOPTION_OFF;
|
||||||
|
gst_msdkenc_add_extra_param (thiz, (mfxExtBuffer *) option2);
|
||||||
|
|
||||||
|
if (thiz->enable_extopt3) {
|
||||||
|
option3->Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
|
||||||
|
option3->Header.BufferSz = sizeof (thiz->option3);
|
||||||
|
gst_msdkenc_add_extra_param (thiz, (mfxExtBuffer *) option3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_msdkenc_init_encoder (GstMsdkEnc * thiz)
|
gst_msdkenc_init_encoder (GstMsdkEnc * thiz)
|
||||||
{
|
{
|
||||||
|
@ -356,23 +380,15 @@ gst_msdkenc_init_encoder (GstMsdkEnc * thiz)
|
||||||
/* ensure bitrate control parameters */
|
/* ensure bitrate control parameters */
|
||||||
ensure_bitrate_control (thiz);
|
ensure_bitrate_control (thiz);
|
||||||
|
|
||||||
|
/* Enable ExtCodingOption2 */
|
||||||
|
ensure_extended_coding_options (thiz);
|
||||||
|
|
||||||
/* allow subclass configure further */
|
/* allow subclass configure further */
|
||||||
if (klass->configure) {
|
if (klass->configure) {
|
||||||
if (!klass->configure (thiz))
|
if (!klass->configure (thiz))
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thiz->enable_extopt2) {
|
|
||||||
thiz->option2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
|
|
||||||
thiz->option2.Header.BufferSz = sizeof (thiz->option2);
|
|
||||||
gst_msdkenc_add_extra_param (thiz, (mfxExtBuffer *) & thiz->option2);
|
|
||||||
}
|
|
||||||
if (thiz->enable_extopt3) {
|
|
||||||
thiz->option3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
|
|
||||||
thiz->option3.Header.BufferSz = sizeof (thiz->option3);
|
|
||||||
gst_msdkenc_add_extra_param (thiz, (mfxExtBuffer *) & thiz->option3);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (thiz->num_extra_params) {
|
if (thiz->num_extra_params) {
|
||||||
thiz->param.NumExtParam = thiz->num_extra_params;
|
thiz->param.NumExtParam = thiz->num_extra_params;
|
||||||
thiz->param.ExtParam = thiz->extra_params;
|
thiz->param.ExtParam = thiz->extra_params;
|
||||||
|
@ -1361,8 +1377,10 @@ gst_msdkenc_init (GstMsdkEnc * thiz)
|
||||||
thiz->i_frames = PROP_I_FRAMES_DEFAULT;
|
thiz->i_frames = PROP_I_FRAMES_DEFAULT;
|
||||||
thiz->b_frames = PROP_B_FRAMES_DEFAULT;
|
thiz->b_frames = PROP_B_FRAMES_DEFAULT;
|
||||||
thiz->num_slices = PROP_NUM_SLICES_DEFAULT;
|
thiz->num_slices = PROP_NUM_SLICES_DEFAULT;
|
||||||
|
thiz->mbbrc = PROP_MBBRC_DEFAULT;
|
||||||
|
thiz->adaptive_i = PROP_ADAPTIVE_I_DEFAULT;
|
||||||
|
thiz->adaptive_b = PROP_ADAPTIVE_B_DEFAULT;
|
||||||
|
|
||||||
thiz->enable_extopt2 = FALSE;
|
|
||||||
thiz->enable_extopt3 = FALSE;
|
thiz->enable_extopt3 = FALSE;
|
||||||
memset (&thiz->option2, 0, sizeof (thiz->option2));
|
memset (&thiz->option2, 0, sizeof (thiz->option2));
|
||||||
memset (&thiz->option2, 0, sizeof (thiz->option3));
|
memset (&thiz->option2, 0, sizeof (thiz->option3));
|
||||||
|
|
|
@ -117,7 +117,6 @@ struct _GstMsdkEnc
|
||||||
|
|
||||||
/* Additional encoder coding options */
|
/* Additional encoder coding options */
|
||||||
mfxExtCodingOption2 option2;
|
mfxExtCodingOption2 option2;
|
||||||
gboolean enable_extopt2;
|
|
||||||
mfxExtCodingOption3 option3;
|
mfxExtCodingOption3 option3;
|
||||||
gboolean enable_extopt3;
|
gboolean enable_extopt3;
|
||||||
|
|
||||||
|
@ -147,6 +146,9 @@ struct _GstMsdkEnc
|
||||||
guint i_frames;
|
guint i_frames;
|
||||||
guint b_frames;
|
guint b_frames;
|
||||||
guint num_slices;
|
guint num_slices;
|
||||||
|
gint16 mbbrc;
|
||||||
|
gint16 adaptive_i;
|
||||||
|
gint16 adaptive_b;
|
||||||
|
|
||||||
gboolean reconfig;
|
gboolean reconfig;
|
||||||
};
|
};
|
||||||
|
|
|
@ -287,7 +287,6 @@ gst_msdkh264enc_configure (GstMsdkEnc * encoder)
|
||||||
|
|
||||||
gst_msdkenc_add_extra_param (encoder, (mfxExtBuffer *) & thiz->option);
|
gst_msdkenc_add_extra_param (encoder, (mfxExtBuffer *) & thiz->option);
|
||||||
|
|
||||||
encoder->enable_extopt2 = TRUE;
|
|
||||||
encoder->option2.Trellis = thiz->trellis ? thiz->trellis : MFX_TRELLIS_OFF;
|
encoder->option2.Trellis = thiz->trellis ? thiz->trellis : MFX_TRELLIS_OFF;
|
||||||
encoder->option2.MaxSliceSize = thiz->max_slice_size;
|
encoder->option2.MaxSliceSize = thiz->max_slice_size;
|
||||||
if (encoder->rate_control == MFX_RATECONTROL_LA ||
|
if (encoder->rate_control == MFX_RATECONTROL_LA ||
|
||||||
|
|
|
@ -100,3 +100,57 @@ gst_msdkenc_rc_lookahead_ds_get_type (void)
|
||||||
}
|
}
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GType
|
||||||
|
gst_msdkenc_mbbrc_get_type (void)
|
||||||
|
{
|
||||||
|
static GType type = 0;
|
||||||
|
|
||||||
|
static const GEnumValue values[] = {
|
||||||
|
{MFX_CODINGOPTION_UNKNOWN, "SDK desides what to do", "auto"},
|
||||||
|
{MFX_CODINGOPTION_OFF, "Disable Macroblock level bit rate control", "off"},
|
||||||
|
{MFX_CODINGOPTION_ON, "Enable Macroblock level bit rate control ", "on"},
|
||||||
|
{0, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!type) {
|
||||||
|
type = g_enum_register_static ("GstMsdkEncMbBitrateControl", values);
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
GType
|
||||||
|
gst_msdkenc_adaptive_i_get_type (void)
|
||||||
|
{
|
||||||
|
static GType type = 0;
|
||||||
|
|
||||||
|
static const GEnumValue values[] = {
|
||||||
|
{MFX_CODINGOPTION_UNKNOWN, "SDK desides what to do", "auto"},
|
||||||
|
{MFX_CODINGOPTION_OFF, "Disable Adaptive I frame insertion ", "off"},
|
||||||
|
{MFX_CODINGOPTION_ON, "Enable Aaptive I frame insertion ", "on"},
|
||||||
|
{0, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!type) {
|
||||||
|
type = g_enum_register_static ("GstMsdkEncAdaptiveI", values);
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
GType
|
||||||
|
gst_msdkenc_adaptive_b_get_type (void)
|
||||||
|
{
|
||||||
|
static GType type = 0;
|
||||||
|
|
||||||
|
static const GEnumValue values[] = {
|
||||||
|
{MFX_CODINGOPTION_UNKNOWN, "SDK desides what to do", "auto"},
|
||||||
|
{MFX_CODINGOPTION_OFF, "Disable Adaptive B-Frame insertion ", "off"},
|
||||||
|
{MFX_CODINGOPTION_ON, "Enable Aaptive B-Frame insertion ", "on"},
|
||||||
|
{0, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!type) {
|
||||||
|
type = g_enum_register_static ("GstMsdkEncAdaptiveB", values);
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
|
@ -49,5 +49,14 @@ gst_msdkenc_trellis_quantization_get_type (void);
|
||||||
GType
|
GType
|
||||||
gst_msdkenc_rc_lookahead_ds_get_type (void);
|
gst_msdkenc_rc_lookahead_ds_get_type (void);
|
||||||
|
|
||||||
|
GType
|
||||||
|
gst_msdkenc_mbbrc_get_type (void);
|
||||||
|
|
||||||
|
GType
|
||||||
|
gst_msdkenc_adaptive_i_get_type (void);
|
||||||
|
|
||||||
|
GType
|
||||||
|
gst_msdkenc_adaptive_b_get_type (void);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue