return ret;
}
+static GstVaapiContext *
+_create_context(
+ GstVaapiDisplay *display,
+ GstVaapiProfile profile,
+ guint width,
+ guint height,
+ GstVaapiRateControl rate_control
+)
+{
+ GstVaapiContextInfo info;
+
+ info.profile = profile;
+ info.entrypoint = GST_VAAPI_ENTRYPOINT_SLICE_ENCODE;
+ info.rate_control = rate_control;
+ info.width = width;
+ info.height = height;
+ info.ref_frames = 4;
+ return gst_vaapi_context_new_full(display, &info);
+}
+
static EncoderStatus
gst_vaapi_base_encoder_open_default(
GstVaapiEncoder* encoder,
ENCODER_ASSERT(ENCODER_DISPLAY(encoder));
- out_context = gst_vaapi_context_new(display,
+ out_context = _create_context(display,
gst_vaapi_profile(priv->profile),
- gst_vaapi_entrypoint(VAEntrypointEncSlice),
ENCODER_WIDTH(encoder),
- ENCODER_HEIGHT(encoder));
+ ENCODER_HEIGHT(encoder),
+ ENCODER_RATE_CONTROL(encoder));
ENCODER_CHECK_STATUS(out_context,
ENCODER_CONTEXT_ERR,
"gst_vaapi_context_new failed.");
encoder->width = 0;
encoder->height = 0;
encoder->frame_rate = 0;
+ encoder->rate_control = GST_VAAPI_RATECONTROL_NONE;
}
static void
#define ENCODER_WIDTH(encoder) (((GstVaapiEncoder*)(encoder))->width)
#define ENCODER_HEIGHT(encoder) (((GstVaapiEncoder*)(encoder))->height)
#define ENCODER_FPS(encoder) (((GstVaapiEncoder*)(encoder))->frame_rate)
+#define ENCODER_RATE_CONTROL(encoder) \
+ (((GstVaapiEncoder*)(encoder))->rate_control)
struct _GstVaapiEncoder {
GObject parent;
guint32 width;
guint32 height;
guint32 frame_rate;
+ GstVaapiRateControl rate_control;
};
struct _GstVaapiEncoderClass {
#include "gstvaapiencode_h264.h"
#include "gst/vaapi/gstvaapiencoder_h264.h"
+#include "gst/vaapi/gstvaapivalue.h"
#include <string.h>
H264_PROP_0,
H264_PROP_PROFILE,
H264_PROP_LEVEL,
+ H264_PROP_RATE_CONTROL,
H264_PROP_BITRATE,
H264_PROP_INTRA_PERIOD,
H264_PROP_INIT_QP,
}
break;
+ case H264_PROP_RATE_CONTROL: {
+ ENCODER_RATE_CONTROL(h264encoder) = g_value_get_enum(value);
+ }
+ break;
+
case H264_PROP_BITRATE: {
h264encoder->bitrate = g_value_get_uint(value);
}
g_value_set_uint (value, h264encoder->level);
break;
+ case H264_PROP_RATE_CONTROL:
+ g_value_set_enum(value, ENCODER_RATE_CONTROL(h264encoder));
+ break;
+
case H264_PROP_BITRATE:
g_value_set_uint (value, h264encoder->bitrate);
break;
g_object_class_install_property (
object_class,
+ H264_PROP_RATE_CONTROL,
+ g_param_spec_enum ("rate-control",
+ "rate-control",
+ "Rate control mode",
+ GST_VAAPI_TYPE_RATE_CONTROL,
+ GST_VAAPI_RATECONTROL_NONE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (
+ object_class,
H264_PROP_BITRATE,
g_param_spec_uint (
"bitrate",