e375fa45fbc6b62a54cdb96a079a1bb13755d50d
[profile/ivi/gstreamer-vaapi.git] / gst / vaapiencode / gstvaapimpeg4encode.c
1 #include "gstvaapimpeg4encode.h"
2 #include "gstvaapimpeg4encoder.h"
3
4 GST_DEBUG_CATEGORY_STATIC (gst_vaapi_mpeg4_encode_debug);
5 #define GST_CAT_DEFAULT gst_vaapi_mpeg4_encode_debug
6
7
8 static const char gst_mpeg4encode_sink_caps_str[] =
9     GST_VAAPI_SURFACE_CAPS;
10
11 static const GstElementDetails gst_mpeg4encode_details =
12     GST_ELEMENT_DETAILS(
13         "VA-API mpeg4 encoder",
14         "Codec/Encoder/Video",
15         "A VA-API based mpeg4 encoder",
16         "Feng Yuan<feng.yuan@intel.com>");
17
18
19 static const char gst_mpeg4encode_src_caps_str[] =
20     GST_CAPS_CODEC("video/mpeg, mpegversion=4");
21
22 static GstStaticPadTemplate gst_mpeg4encode_sink_factory =
23     GST_STATIC_PAD_TEMPLATE(
24         "sink",
25         GST_PAD_SINK,
26         GST_PAD_ALWAYS,
27         GST_STATIC_CAPS(gst_mpeg4encode_sink_caps_str));
28
29 static GstStaticPadTemplate gst_mpeg4encode_src_factory =
30     GST_STATIC_PAD_TEMPLATE(
31         "src",
32         GST_PAD_SRC,
33         GST_PAD_ALWAYS,
34         GST_STATIC_CAPS(gst_mpeg4encode_src_caps_str));
35
36 static void gst_mpeg4encode_finalize(GObject *object);
37 static void gst_mpeg4encode_set_property(GObject *object, guint prop_id,
38     const GValue *value, GParamSpec *pspec);
39 static void gst_mpeg4encode_get_property (GObject * object, guint prop_id,
40     GValue * value, GParamSpec * pspec);
41
42
43 /* mpeg4 encode */
44 GST_BOILERPLATE(
45     GstMPEG4Encode,
46     gst_mpeg4encode,
47     GstVaapiEncode,
48     GST_TYPE_VAAPI_ENCODE);
49
50 enum {
51     MPEG4_PROP_0,
52     MPEG4_PROP_PROFILE,
53     MPEG4_PROP_BITRATE,
54     MPEG4_PROP_INTRA_PERIOD,
55     MPEG4_PROP_INIT_QP,
56     MPEG4_PROP_MIN_QP,
57 };
58
59
60 static void
61 gst_mpeg4encode_base_init(gpointer klass)
62 {
63   GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
64
65   gst_element_class_set_details(element_class, &gst_mpeg4encode_details);
66
67   /* sink pad */
68   gst_element_class_add_pad_template(
69       element_class,
70       gst_static_pad_template_get(&gst_mpeg4encode_sink_factory)
71   );
72
73   /* src pad */
74   gst_element_class_add_pad_template(
75       element_class,
76       gst_static_pad_template_get(&gst_mpeg4encode_src_factory)
77   );
78 }
79
80 static void
81 gst_mpeg4encode_class_init(GstMPEG4EncodeClass *klass)
82 {
83   GObjectClass * const object_class = G_OBJECT_CLASS(klass);
84
85   GST_DEBUG_CATEGORY_INIT (gst_vaapi_mpeg4_encode_debug, "vaapimpeg4encode", 0,
86       "vaapimpeg4encode element");
87
88   object_class->finalize      = gst_mpeg4encode_finalize;
89   object_class->set_property  = gst_mpeg4encode_set_property;
90   object_class->get_property  = gst_mpeg4encode_get_property;
91
92
93   g_object_class_install_property (object_class, MPEG4_PROP_PROFILE,
94           g_param_spec_uint ("profile",
95               "MPEG4 Profile",
96               "Profile supports: 2(Baseline), 3(ASP)",
97               2,
98               3,
99               2,
100               G_PARAM_READWRITE));
101     g_object_class_install_property (object_class, MPEG4_PROP_BITRATE,
102           g_param_spec_uint ("bitrate",
103               "MPEG4 encoding bitrate",
104               "MPEG4 encoding bitrate, 10k~100M, (0, auto-calculate)",
105               0,
106               100*1000*1000,
107               0,
108               G_PARAM_READWRITE));
109     g_object_class_install_property (object_class, MPEG4_PROP_INTRA_PERIOD,
110           g_param_spec_uint ("intra-period",
111               "MPEG4 encoding intra-period",
112               "MPEG4 encoding intra-period",
113               1,
114               300,
115               MPEG4_DEFAULT_INTRA_PERIOD,
116               G_PARAM_READWRITE));
117     g_object_class_install_property (object_class, MPEG4_PROP_INIT_QP,
118           g_param_spec_uint ("init-qp",
119               "MPEG4 init-qp",
120               "MPEG4 init-qp",
121               1,
122               51,
123               MPEG4_DEFAULT_INIT_QP,
124               G_PARAM_READWRITE));
125     g_object_class_install_property (object_class, MPEG4_PROP_MIN_QP,
126           g_param_spec_uint ("min-qp",
127               "MPEG4 min-qp",
128               "MPEG4 min-qp",
129               1,
130               51,
131               MPEG4_DEFAULT_MIN_QP,
132               G_PARAM_READWRITE));
133
134 }
135
136 static void
137 gst_mpeg4encode_init(GstMPEG4Encode *mpeg4_encode, GstMPEG4EncodeClass *klass)
138 {
139   GstVaapiEncode *encode = GST_VAAPI_ENCODE(mpeg4_encode);
140   encode->encoder = GST_VAAPI_ENCODER(gst_mpeg4_encoder_new());
141   ENCODER_ASSERT(encode->encoder);
142 }
143
144 static void
145 gst_mpeg4encode_finalize(GObject *object)
146 {
147   //GstMPEG4Encode * const mpeg4_encode = GST_MPEG4ENCODE(object);
148   G_OBJECT_CLASS(parent_class)->finalize(object);
149 }
150
151 static void
152 gst_mpeg4encode_set_property(GObject *object, guint prop_id,
153     const GValue *value, GParamSpec *pspec)
154 {
155   GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
156   GstMPEG4Encoder *mpeg4encoder = GST_MPEG4_ENCODER(encode->encoder);
157
158   ENCODER_ASSERT(mpeg4encoder);
159
160   switch (prop_id) {
161     case MPEG4_PROP_PROFILE: {
162       mpeg4encoder->profile = g_value_get_uint(value);
163     }
164       break;
165
166     case MPEG4_PROP_BITRATE: {
167       mpeg4encoder->bitrate = g_value_get_uint(value);
168     }
169       break;
170
171     case MPEG4_PROP_INTRA_PERIOD: {
172       mpeg4encoder->intra_period = g_value_get_uint(value);
173     }
174       break;
175
176     case MPEG4_PROP_INIT_QP: {
177       mpeg4encoder->init_qp = g_value_get_uint(value);
178     }
179       break;
180
181     case MPEG4_PROP_MIN_QP: {
182       mpeg4encoder->min_qp = g_value_get_uint(value);
183     }
184       break;
185
186     default:
187       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
188       break;
189   }
190 }
191
192 static void
193 gst_mpeg4encode_get_property (GObject * object, guint prop_id,
194     GValue * value, GParamSpec * pspec)
195 {
196   GstVaapiEncode *encode = GST_VAAPI_ENCODE(object);
197   GstMPEG4Encoder *mpeg4encoder = GST_MPEG4_ENCODER(encode->encoder);
198   ENCODER_ASSERT(mpeg4encoder);
199
200   switch (prop_id) {
201     case MPEG4_PROP_PROFILE:
202       g_value_set_uint (value, mpeg4encoder->profile);
203       break;
204
205     case MPEG4_PROP_BITRATE:
206       g_value_set_uint (value, mpeg4encoder->bitrate);
207       break;
208
209     case MPEG4_PROP_INTRA_PERIOD:
210       g_value_set_uint (value, mpeg4encoder->intra_period);
211       break;
212
213     case MPEG4_PROP_INIT_QP:
214       g_value_set_uint (value, mpeg4encoder->init_qp);
215       break;
216
217     case MPEG4_PROP_MIN_QP:
218       g_value_set_uint (value, mpeg4encoder->min_qp);
219       break;
220
221     default:
222       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
223       break;
224   }
225 }
226