diff --git a/sys/msdk/gstmsdkenc.c b/sys/msdk/gstmsdkenc.c index 4c29643ecd..350714b027 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 3b8e207a43..02590d3e4c 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 a3dd7bb3d7..5a76340cf3 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 8e5da1aee1..5d581c9864 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 3408fa333b..2e0e29aca4 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