2 * gstvaapimpeg4encode.c - VA-API MPEG-4 encoder
4 * Copyright (C) 2011 Intel Corporation
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 2.1
9 * of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free
18 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301 USA
22 #include "gstvaapimpeg4encode.h"
23 #include "gstvaapimpeg4encoder.h"
25 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_mpeg4_encode_debug);
26 #define GST_CAT_DEFAULT gst_vaapi_mpeg4_encode_debug
29 static const char gst_mpeg4encode_sink_caps_str[] =
30 GST_VAAPI_SURFACE_CAPS;
32 static const GstElementDetails gst_mpeg4encode_details =
34 "VA-API mpeg4 encoder",
35 "Codec/Encoder/Video",
36 "A VA-API based mpeg4 encoder",
37 "Feng Yuan<feng.yuan@intel.com>");
40 static const char gst_mpeg4encode_src_caps_str[] =
41 GST_CAPS_CODEC("video/mpeg, mpegversion=4");
43 static GstStaticPadTemplate gst_mpeg4encode_sink_factory =
44 GST_STATIC_PAD_TEMPLATE(
48 GST_STATIC_CAPS(gst_mpeg4encode_sink_caps_str));
50 static GstStaticPadTemplate gst_mpeg4encode_src_factory =
51 GST_STATIC_PAD_TEMPLATE(
55 GST_STATIC_CAPS(gst_mpeg4encode_src_caps_str));
57 static void gst_mpeg4encode_finalize(GObject *object);
58 static void gst_mpeg4encode_set_property(GObject *object, guint prop_id,
59 const GValue *value, GParamSpec *pspec);
60 static void gst_mpeg4encode_get_property (GObject * object, guint prop_id,
61 GValue * value, GParamSpec * pspec);
69 GST_TYPE_VAAPI_ENCODE);
75 MPEG4_PROP_INTRA_PERIOD,
82 gst_mpeg4encode_base_init(gpointer klass)
84 GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
86 gst_element_class_set_details(element_class, &gst_mpeg4encode_details);
89 gst_element_class_add_pad_template(
91 gst_static_pad_template_get(&gst_mpeg4encode_sink_factory)
95 gst_element_class_add_pad_template(
97 gst_static_pad_template_get(&gst_mpeg4encode_src_factory)
102 gst_mpeg4encode_class_init(GstMPEG4EncodeClass *klass)
104 GObjectClass * const object_class = G_OBJECT_CLASS(klass);
106 GST_DEBUG_CATEGORY_INIT (gst_vaapi_mpeg4_encode_debug, "vaapimpeg4encode", 0,
107 "vaapimpeg4encode element");
109 object_class->finalize = gst_mpeg4encode_finalize;
110 object_class->set_property = gst_mpeg4encode_set_property;
111 object_class->get_property = gst_mpeg4encode_get_property;
114 g_object_class_install_property (object_class, MPEG4_PROP_PROFILE,
115 g_param_spec_uint ("profile",
117 "Profile supports: 2(Baseline), 3(ASP)",
122 g_object_class_install_property (object_class, MPEG4_PROP_BITRATE,
123 g_param_spec_uint ("bitrate",
124 "MPEG4 encoding bitrate",
125 "MPEG4 encoding bitrate, 10k~100M, (0, auto-calculate)",
130 g_object_class_install_property (object_class, MPEG4_PROP_INTRA_PERIOD,
131 g_param_spec_uint ("intra-period",
132 "MPEG4 encoding intra-period",
133 "MPEG4 encoding intra-period",
136 MPEG4_DEFAULT_INTRA_PERIOD,
138 g_object_class_install_property (object_class, MPEG4_PROP_INIT_QP,
139 g_param_spec_uint ("init-qp",
144 MPEG4_DEFAULT_INIT_QP,
146 g_object_class_install_property (object_class, MPEG4_PROP_MIN_QP,
147 g_param_spec_uint ("min-qp",
152 MPEG4_DEFAULT_MIN_QP,
158 gst_mpeg4encode_init(GstMPEG4Encode *mpeg4_encode, GstMPEG4EncodeClass *klass)
160 GstVaapiEncode *encode = GST_VAAPI_ENCODE(mpeg4_encode);
161 encode->encoder = GST_VAAPI_ENCODER(gst_mpeg4_encoder_new());
162 ENCODER_ASSERT(encode->encoder);
166 gst_mpeg4encode_finalize(GObject *object)
168 //GstMPEG4Encode * const mpeg4_encode = GST_MPEG4ENCODE(object);
169 G_OBJECT_CLASS(parent_class)->finalize(object);
173 gst_mpeg4encode_set_property(GObject *object, guint prop_id,
174 const GValue *value, GParamSpec *pspec)
176 GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
177 GstMPEG4Encoder *mpeg4encoder = GST_MPEG4_ENCODER(encode->encoder);
179 ENCODER_ASSERT(mpeg4encoder);
182 case MPEG4_PROP_PROFILE: {
183 mpeg4encoder->profile = g_value_get_uint(value);
187 case MPEG4_PROP_BITRATE: {
188 mpeg4encoder->bitrate = g_value_get_uint(value);
192 case MPEG4_PROP_INTRA_PERIOD: {
193 mpeg4encoder->intra_period = g_value_get_uint(value);
197 case MPEG4_PROP_INIT_QP: {
198 mpeg4encoder->init_qp = g_value_get_uint(value);
202 case MPEG4_PROP_MIN_QP: {
203 mpeg4encoder->min_qp = g_value_get_uint(value);
208 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
214 gst_mpeg4encode_get_property (GObject * object, guint prop_id,
215 GValue * value, GParamSpec * pspec)
217 GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
218 GstMPEG4Encoder *mpeg4encoder = GST_MPEG4_ENCODER(encode->encoder);
219 ENCODER_ASSERT(mpeg4encoder);
222 case MPEG4_PROP_PROFILE:
223 g_value_set_uint (value, mpeg4encoder->profile);
226 case MPEG4_PROP_BITRATE:
227 g_value_set_uint (value, mpeg4encoder->bitrate);
230 case MPEG4_PROP_INTRA_PERIOD:
231 g_value_set_uint (value, mpeg4encoder->intra_period);
234 case MPEG4_PROP_INIT_QP:
235 g_value_set_uint (value, mpeg4encoder->init_qp);
238 case MPEG4_PROP_MIN_QP:
239 g_value_set_uint (value, mpeg4encoder->min_qp);
243 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);