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_CAPS_CODEC("video/x-vaapi-surface ")
13 static const GstElementDetails gst_h264encode_details =
15 "VA-API h264 encoder",
16 "Codec/Encoder/Video",
17 "A VA-API based h264 encoder",
18 "Feng Yuan<feng.yuan@intel.com>");
21 static const char gst_h264encode_src_caps_str[] =
22 GST_CAPS_CODEC("video/x-h264");
24 static GstStaticPadTemplate gst_h264encode_sink_factory =
25 GST_STATIC_PAD_TEMPLATE(
29 GST_STATIC_CAPS(gst_h264encode_sink_caps_str));
31 static GstStaticPadTemplate gst_h264encode_src_factory =
32 GST_STATIC_PAD_TEMPLATE(
36 GST_STATIC_CAPS(gst_h264encode_src_caps_str));
38 static void gst_h264encode_finalize(GObject *object);
39 static void gst_h264encode_set_property(GObject *object, guint prop_id,
40 const GValue *value, GParamSpec *pspec);
41 static void gst_h264encode_get_property (GObject * object, guint prop_id,
42 GValue * value, GParamSpec * pspec);
43 static gboolean _h264_check_valid_profile(guint profile);
44 static gboolean _h264_check_valid_level(guint level);
52 GST_TYPE_VAAPI_ENCODE);
59 H264_PROP_INTRA_PERIOD,
67 gst_h264encode_base_init(gpointer klass)
69 GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
71 gst_element_class_set_details(element_class, &gst_h264encode_details);
74 gst_element_class_add_pad_template(
76 gst_static_pad_template_get(&gst_h264encode_sink_factory)
80 gst_element_class_add_pad_template(
82 gst_static_pad_template_get(&gst_h264encode_src_factory)
87 gst_h264encode_class_init(GstH264EncodeClass *klass)
89 GObjectClass * const object_class = G_OBJECT_CLASS(klass);
90 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;
100 g_object_class_install_property (object_class, H264_PROP_PROFILE,
101 g_param_spec_uint ("profile",
103 "Profile supports: 66(Baseline), 77(Main), 100(High)",
104 H264_PROFILE_BASELINE,
106 H264_DEFAULT_PROFILE,
108 g_object_class_install_property (object_class, H264_PROP_LEVEL,
109 g_param_spec_uint ("level",
111 "Level idc supports: 10, 11, 12, 13, 20, 21, 22, 30, 31, 32, 40, 41",
116 g_object_class_install_property (object_class, H264_PROP_BITRATE,
117 g_param_spec_uint ("bitrate",
118 "H264 encoding bitrate",
119 "H264 encoding bitrate, 10k~100M, (0, auto-calculate)",
124 g_object_class_install_property (object_class, H264_PROP_INTRA_PERIOD,
125 g_param_spec_uint ("intra-period",
126 "H264 encoding intra-period",
127 "H264 encoding intra-period",
130 H264_DEFAULT_INTRA_PERIOD,
132 g_object_class_install_property (object_class, H264_PROP_INIT_QP,
133 g_param_spec_uint ("init-qp",
138 H264_DEFAULT_INIT_QP,
140 g_object_class_install_property (object_class, H264_PROP_MIN_QP,
141 g_param_spec_uint ("min-qp",
148 g_object_class_install_property (object_class, H264_PROP_SLICE_NUM,
149 g_param_spec_uint ("slice-num",
160 gst_h264encode_init(GstH264Encode *h264_encode, GstH264EncodeClass *klass)
162 GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
163 GstVaapiEncode *encode = GST_VAAPI_ENCODE(h264_encode);
164 encode->encoder = GST_VAAPI_ENCODER(gst_h264_encoder_new());
165 ENCODER_ASSERT(encode->encoder);
169 gst_h264encode_finalize(GObject *object)
171 //GstH264Encode * const h264_encode = GST_H264ENCODE(object);
172 G_OBJECT_CLASS(parent_class)->finalize(object);
176 gst_h264encode_set_property(GObject *object, guint prop_id,
177 const GValue *value, GParamSpec *pspec)
179 GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
180 GstH264Encoder *h264encoder = GST_H264_ENCODER(encode->encoder);
182 ENCODER_ASSERT(h264encoder);
185 case H264_PROP_PROFILE: {
186 guint profile = g_value_get_uint(value);
187 if (_h264_check_valid_profile(profile)) {
188 h264encoder->profile = profile;
190 ENCODER_LOG_ERROR("h264encode set property <profile> failed.\n");
195 case H264_PROP_LEVEL: {
196 guint level = g_value_get_uint(value);
197 if (_h264_check_valid_level(level)) {
198 h264encoder->level= level;
200 ENCODER_LOG_ERROR("h264encode set property <level> failed.\n");
205 case H264_PROP_BITRATE: {
206 h264encoder->bitrate = g_value_get_uint(value);
210 case H264_PROP_INTRA_PERIOD: {
211 h264encoder->intra_period = g_value_get_uint(value);
215 case H264_PROP_INIT_QP: {
216 h264encoder->init_qp = g_value_get_uint(value);
220 case H264_PROP_MIN_QP: {
221 h264encoder->min_qp = g_value_get_uint(value);
225 case H264_PROP_SLICE_NUM: {
226 h264encoder->slice_num= g_value_get_uint(value);
231 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
237 gst_h264encode_get_property (GObject * object, guint prop_id,
238 GValue * value, GParamSpec * pspec)
240 GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
241 GstH264Encoder *h264encoder = GST_H264_ENCODER(encode->encoder);
242 ENCODER_ASSERT(h264encoder);
245 case H264_PROP_PROFILE:
246 g_value_set_uint (value, h264encoder->profile);
249 case H264_PROP_LEVEL:
250 g_value_set_uint (value, h264encoder->level);
253 case H264_PROP_BITRATE:
254 g_value_set_uint (value, h264encoder->bitrate);
257 case H264_PROP_INTRA_PERIOD:
258 g_value_set_uint (value, h264encoder->intra_period);
261 case H264_PROP_INIT_QP:
262 g_value_set_uint (value, h264encoder->init_qp);
265 case H264_PROP_MIN_QP:
266 g_value_set_uint (value, h264encoder->min_qp);
269 case H264_PROP_SLICE_NUM:
270 g_value_set_uint (value, h264encoder->slice_num);
274 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
281 _h264_check_valid_profile(guint profile)
283 static const limit_profiles[] = {
284 H264_PROFILE_BASELINE,
288 guint n_profiles = sizeof(limit_profiles)/sizeof(limit_profiles[0]);
290 for (i = 0; i < n_profiles; ++i) {
291 if (limit_profiles[i] == profile)
298 _h264_check_valid_level(guint level)
300 static const limit_levels[] = {
317 guint n_levels = sizeof(limit_levels)/sizeof(limit_levels[0]);
319 for (i = 0; i < n_levels; ++i) {
320 if (limit_levels[i] == level)