1 #include "gstvaapih264encode.h"
2 #include "gstvaapih264encoder.h"
4 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_h264_encode_debug);
5 #define GST_CAT_DEFAULT gst_vaapi_h264_encode_debug
7 static const char gst_h264encode_sink_caps_str[] =
8 GST_CAPS_CODEC("video/x-raw-yuv, " "format = (fourcc) { I420 } ")
9 GST_CAPS_CODEC("video/x-raw-yuv, " "format = (fourcc) { NV12 } ")
10 GST_VAAPI_SURFACE_CAPS;
12 static const GstElementDetails gst_h264encode_details =
14 "VA-API h264 encoder",
15 "Codec/Encoder/Video",
16 "A VA-API based h264 encoder",
17 "Feng Yuan<feng.yuan@intel.com>");
20 static const char gst_h264encode_src_caps_str[] =
21 GST_CAPS_CODEC("video/x-h264");
23 static GstStaticPadTemplate gst_h264encode_sink_factory =
24 GST_STATIC_PAD_TEMPLATE(
28 GST_STATIC_CAPS(gst_h264encode_sink_caps_str));
30 static GstStaticPadTemplate gst_h264encode_src_factory =
31 GST_STATIC_PAD_TEMPLATE(
35 GST_STATIC_CAPS(gst_h264encode_src_caps_str));
37 static void gst_h264encode_finalize(GObject *object);
38 static void gst_h264encode_set_property(GObject *object, guint prop_id,
39 const GValue *value, GParamSpec *pspec);
40 static void gst_h264encode_get_property (GObject * object, guint prop_id,
41 GValue * value, GParamSpec * pspec);
42 static gboolean _h264_check_valid_profile(guint profile);
43 static gboolean _h264_check_valid_level(guint level);
44 static gboolean gst_h264encode_set_src_caps(GstVaapiEncode* encode, GstCaps *caps);
52 GST_TYPE_VAAPI_ENCODE);
59 H264_PROP_INTRA_PERIOD,
63 H264_PROP_B_FRAME_NUM,
68 gst_h264encode_base_init(gpointer klass)
70 GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
72 gst_element_class_set_details(element_class, &gst_h264encode_details);
75 gst_element_class_add_pad_template(
77 gst_static_pad_template_get(&gst_h264encode_sink_factory)
81 gst_element_class_add_pad_template(
83 gst_static_pad_template_get(&gst_h264encode_src_factory)
88 gst_h264encode_class_init(GstH264EncodeClass *klass)
90 GObjectClass * const object_class = G_OBJECT_CLASS(klass);
91 GstVaapiEncodeClass *const encode_class = GST_VAAPI_ENCODE_CLASS(klass);
92 GST_DEBUG_CATEGORY_INIT (gst_vaapi_h264_encode_debug, "vaapih264encode", 0,
93 "vaapih264encode element");
95 object_class->finalize = gst_h264encode_finalize;
96 object_class->set_property = gst_h264encode_set_property;
97 object_class->get_property = gst_h264encode_get_property;
99 encode_class->set_encoder_src_caps = gst_h264encode_set_src_caps;
101 g_object_class_install_property (object_class, H264_PROP_PROFILE,
102 g_param_spec_uint ("profile",
104 "Profile supports: 66(Baseline), 77(Main), 100(High)",
105 H264_PROFILE_BASELINE,
107 H264_DEFAULT_PROFILE,
109 g_object_class_install_property (object_class, H264_PROP_LEVEL,
110 g_param_spec_uint ("level",
112 "Level idc supports: 10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41",
117 g_object_class_install_property (object_class, H264_PROP_BITRATE,
118 g_param_spec_uint ("bitrate",
119 "H264 encoding bitrate",
120 "H264 encoding bitrate, 10k~100M, (0, auto-calculate)",
125 g_object_class_install_property (object_class, H264_PROP_INTRA_PERIOD,
126 g_param_spec_uint ("intra-period",
127 "H264 encoding intra-period",
128 "H264 encoding intra-period",
131 H264_DEFAULT_INTRA_PERIOD,
133 g_object_class_install_property (object_class, H264_PROP_INIT_QP,
134 g_param_spec_uint ("init-qp",
139 H264_DEFAULT_INIT_QP,
141 g_object_class_install_property (object_class, H264_PROP_MIN_QP,
142 g_param_spec_uint ("min-qp",
149 g_object_class_install_property (object_class, H264_PROP_SLICE_NUM,
150 g_param_spec_uint ("slice-num",
157 g_object_class_install_property (object_class, H264_PROP_B_FRAME_NUM,
158 g_param_spec_uint ("b-frame-num",
169 gst_h264encode_init(GstH264Encode *h264_encode, GstH264EncodeClass *klass)
171 GstVaapiEncode *encode = GST_VAAPI_ENCODE(h264_encode);
172 encode->encoder = GST_VAAPI_ENCODER(gst_h264_encoder_new());
173 ENCODER_ASSERT(encode->encoder);
177 gst_h264encode_finalize(GObject *object)
179 //GstH264Encode * const h264_encode = GST_H264ENCODE(object);
180 G_OBJECT_CLASS(parent_class)->finalize(object);
184 gst_h264encode_set_property(GObject *object, guint prop_id,
185 const GValue *value, GParamSpec *pspec)
187 GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
188 GstH264Encoder *h264encoder = GST_H264_ENCODER(encode->encoder);
190 ENCODER_ASSERT(h264encoder);
193 case H264_PROP_PROFILE: {
194 guint profile = g_value_get_uint(value);
195 if (_h264_check_valid_profile(profile)) {
196 h264encoder->profile = profile;
198 ENCODER_LOG_ERROR("h264encode set property <profile> failed.");
203 case H264_PROP_LEVEL: {
204 guint level = g_value_get_uint(value);
205 if (_h264_check_valid_level(level)) {
206 h264encoder->level= level;
208 ENCODER_LOG_ERROR("h264encode set property <level> failed.");
213 case H264_PROP_BITRATE: {
214 h264encoder->bitrate = g_value_get_uint(value);
218 case H264_PROP_INTRA_PERIOD: {
219 h264encoder->intra_period = g_value_get_uint(value);
223 case H264_PROP_INIT_QP: {
224 h264encoder->init_qp = g_value_get_uint(value);
228 case H264_PROP_MIN_QP: {
229 h264encoder->min_qp = g_value_get_uint(value);
233 case H264_PROP_SLICE_NUM: {
234 h264encoder->slice_num= g_value_get_uint(value);
238 case H264_PROP_B_FRAME_NUM: {
239 h264encoder->b_frame_num= g_value_get_uint(value);
244 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
250 gst_h264encode_get_property (GObject * object, guint prop_id,
251 GValue * value, GParamSpec * pspec)
253 GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
254 GstH264Encoder *h264encoder = GST_H264_ENCODER(encode->encoder);
255 ENCODER_ASSERT(h264encoder);
258 case H264_PROP_PROFILE:
259 g_value_set_uint (value, h264encoder->profile);
262 case H264_PROP_LEVEL:
263 g_value_set_uint (value, h264encoder->level);
266 case H264_PROP_BITRATE:
267 g_value_set_uint (value, h264encoder->bitrate);
270 case H264_PROP_INTRA_PERIOD:
271 g_value_set_uint (value, h264encoder->intra_period);
274 case H264_PROP_INIT_QP:
275 g_value_set_uint (value, h264encoder->init_qp);
278 case H264_PROP_MIN_QP:
279 g_value_set_uint (value, h264encoder->min_qp);
282 case H264_PROP_SLICE_NUM:
283 g_value_set_uint (value, h264encoder->slice_num);
286 case H264_PROP_B_FRAME_NUM:
287 g_value_set_uint (value, h264encoder->b_frame_num);
291 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
298 _h264_check_valid_profile(guint profile)
300 static const guint limit_profiles[] = {
301 H264_PROFILE_BASELINE,
305 guint n_profiles = sizeof(limit_profiles)/sizeof(limit_profiles[0]);
307 for (i = 0; i < n_profiles; ++i) {
308 if (limit_profiles[i] == profile)
315 _h264_check_valid_level(guint level)
317 static const guint limit_levels[] = {
334 guint n_levels = sizeof(limit_levels)/sizeof(limit_levels[0]);
336 for (i = 0; i < n_levels; ++i) {
337 if (limit_levels[i] == level)
346 gst_h264encode_set_src_caps(GstVaapiEncode* encode, GstCaps *caps)
348 g_return_val_if_fail(caps,FALSE);
349 gst_caps_set_simple(caps, "stream-format", G_TYPE_STRING, "avc",
350 "alignment", G_TYPE_STRING, "au",