From 07c05a75a5f4a25264084425ceed85b46603d5d0 Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Thu, 15 Feb 2018 17:29:13 +0000 Subject: [PATCH] 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 --- sys/msdk/gstmsdkenc.c | 48 ++++++++++++++++++++++++++++------------- sys/msdk/gstmsdkenc.h | 4 +++- sys/msdk/gstmsdkh264enc.c | 1 - sys/msdk/msdk-enums.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++ sys/msdk/msdk-enums.h | 9 ++++++++ 5 files changed, 99 insertions(+), 17 deletions(-) diff --git a/sys/msdk/gstmsdkenc.c b/sys/msdk/gstmsdkenc.c index 4c29643..350714b 100644 --- a/sys/msdk/gstmsdkenc.c +++ b/sys/msdk/gstmsdkenc.c @@ -100,6 +100,9 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", #define PROP_RC_LOOKAHEAD_DEPTH_DEFAULT 10 #define PROP_MAX_VBV_BITRATE_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 G_DEFINE_TYPE (GstMsdkEnc, gst_msdkenc, GST_TYPE_VIDEO_ENCODER); @@ -155,7 +158,6 @@ ensure_bitrate_control (GstMsdkEnc * thiz) case MFX_RATECONTROL_LA_ICQ: option2->LookAheadDepth = thiz->lookahead_depth; - thiz->enable_extopt2 = TRUE; case MFX_RATECONTROL_ICQ: mfx->ICQQuality = CLAMP (thiz->qpi, 1, 51); 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_HRD: /* VBR with LA, HRD compliant */ option2->LookAheadDepth = thiz->lookahead_depth; - thiz->enable_extopt2 = TRUE; break; case MFX_RATECONTROL_QVBR: @@ -177,7 +178,6 @@ ensure_bitrate_control (GstMsdkEnc * thiz) case MFX_RATECONTROL_VBR: option2->MaxFrameSize = thiz->max_frame_size * 1000; - thiz->enable_extopt2 = TRUE; break; 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 gst_msdkenc_init_encoder (GstMsdkEnc * thiz) { @@ -356,23 +380,15 @@ gst_msdkenc_init_encoder (GstMsdkEnc * thiz) /* ensure bitrate control parameters */ ensure_bitrate_control (thiz); + /* Enable ExtCodingOption2 */ + ensure_extended_coding_options (thiz); + /* allow subclass configure further */ if (klass->configure) { if (!klass->configure (thiz)) 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) { thiz->param.NumExtParam = thiz->num_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->b_frames = PROP_B_FRAMES_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; memset (&thiz->option2, 0, sizeof (thiz->option2)); memset (&thiz->option2, 0, sizeof (thiz->option3)); diff --git a/sys/msdk/gstmsdkenc.h b/sys/msdk/gstmsdkenc.h index 3b8e207..02590d3 100644 --- a/sys/msdk/gstmsdkenc.h +++ b/sys/msdk/gstmsdkenc.h @@ -117,7 +117,6 @@ struct _GstMsdkEnc /* Additional encoder coding options */ mfxExtCodingOption2 option2; - gboolean enable_extopt2; mfxExtCodingOption3 option3; gboolean enable_extopt3; @@ -147,6 +146,9 @@ struct _GstMsdkEnc guint i_frames; guint b_frames; guint num_slices; + gint16 mbbrc; + gint16 adaptive_i; + gint16 adaptive_b; gboolean reconfig; }; diff --git a/sys/msdk/gstmsdkh264enc.c b/sys/msdk/gstmsdkh264enc.c index a3dd7bb..5a76340 100644 --- a/sys/msdk/gstmsdkh264enc.c +++ b/sys/msdk/gstmsdkh264enc.c @@ -287,7 +287,6 @@ gst_msdkh264enc_configure (GstMsdkEnc * encoder) 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.MaxSliceSize = thiz->max_slice_size; if (encoder->rate_control == MFX_RATECONTROL_LA || diff --git a/sys/msdk/msdk-enums.c b/sys/msdk/msdk-enums.c index 8e5da1a..5d581c9 100644 --- a/sys/msdk/msdk-enums.c +++ b/sys/msdk/msdk-enums.c @@ -100,3 +100,57 @@ gst_msdkenc_rc_lookahead_ds_get_type (void) } 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; +} diff --git a/sys/msdk/msdk-enums.h b/sys/msdk/msdk-enums.h index 3408fa3..2e0e29a 100644 --- a/sys/msdk/msdk-enums.h +++ b/sys/msdk/msdk-enums.h @@ -49,5 +49,14 @@ gst_msdkenc_trellis_quantization_get_type (void); GType 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 #endif -- 2.7.4